Mirror of the gdb mailing list
 help / color / mirror / Atom feed
* Cast to result of whatis expression
@ 2010-09-07 22:04 Kenneth Rose
  0 siblings, 0 replies; 5+ messages in thread
From: Kenneth Rose @ 2010-09-07 22:04 UTC (permalink / raw)
  To: gdb

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>).


^ permalink raw reply	[flat|nested] 5+ messages in thread
* Cast to result of whatis expression
@ 2010-09-07 22:04 Kenneth Rose
  2010-09-07 22:16 ` Tom Tromey
  0 siblings, 1 reply; 5+ messages in thread
From: Kenneth Rose @ 2010-09-07 22:04 UTC (permalink / raw)
  To: gdb

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>).


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-09-10 19:57 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-09-07 22:04 Cast to result of whatis expression Kenneth Rose
2010-09-07 22:04 Kenneth Rose
2010-09-07 22:16 ` Tom Tromey
2010-09-10 18:09   ` Kenneth Rose
2010-09-10 19:57     ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox