This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Cast to result of whatis expression


Hi all,

I'm writing something similar to gdb-stl-views for some custom container
classes that we have.  As opposed to the STL containers though, our
containers cast the datatype to void*.  A minimalistic example looks like:

class ContainerBase
{
protected:
    ContainerBase( void *x ) : m_x( x ) {}
    void *m_x;
};

template<typename T>
class Container : public ContainerBase
{
public:
    Container() : ContainerBase( new T ) {}
    T& get() { return *static_cast<T*>( m_x ); }
};

Say I have the following code somewhere:

Container<int> foo;

I'd like to be able to have a gdb command like "pcontainer foo" that shows
me something like "The value in foo is 0".  In terms of implementing such
a command, I cannot just call get() because I get the dreaded "Cannot
evaluate function -- may be inlined" message.  I need to explicitly cast
foo.m_x to the appropriate type, but I'm at a loss as to how to get that
type from gdb.  "whatis foo" gives me back "Container<int>".  Is there
anyway of extracting the "int" part of that result and using that as the
type to cast to? The following is not valid, but this is what I'm going
for....

set $type = regex 'whatis foo' Container< \1 >
set $result = *(($type *) foo.m_x)

I'm using the stock GDB that ships with Mac OS X 10.6 (GNU gdb
6.3.50-20050815 (Apple version gdb-1461).  I know... it's old.

Thanks for your help.

-- kenrose

P.S. - I could have something like "pcontainer foo int", but I'm trying to
avoid that since gdb already knows the type of foo (as Container<int>).


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]