public inbox for gdb@sourceware.org
 help / color / mirror / Atom feed
From: Daniel Berlin <dan@cgsoftware.com>
To: gdb@sourceware.cygnus.com
Subject: RTTI working for G++
Date: Sat, 01 Apr 2000 00:00:00 -0000	[thread overview]
Message-ID: <Pine.LNX.4.10.10003131601500.8750-100000@localhost.localdomain> (raw)
Message-ID: <20000401000000.44LL6syJJUzjvfJ0hUQ5gXyvmEFk4OUmG0yiY_lGfVw@z> (raw)

Okay, i have RTTI working for g++.
Well, all except for multiple inheritance.

Scratch that last part, i just made it offset properly if you have >1
baseclass, so al is good.

If i could have one or two volunteers to make sure it's not just my setup,
and that all is well, before i post the patches asking for comments, i'd
appreciate it.
In any case, let me know what you guys think of it so far.
If you look at the output, you'll notice that while for printing, it will
print the object as if it was it's derived type, when it comes to
accessing members/methods, just like in C++, you can't access the members,
unless you specifically cast it to that derived type.

 For those wondering what the patch will do, check this out:

The inheritance on these classes in the example looks like this

fred is a base
dan and bob both inherit directly from fred.
george is another base.
george2 inherits from george and bob (public george, public bob)

I'll rename them so they make more sense as i work up testcases.

But anyway, here's some output:

GNU gdb 20000204
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-unknown-freebsdelf4.0".
Setting up the environment for debugging gdb.
.gdbinit:5: Error in sourced command file:
No symbol table is loaded.  Use the "file" command.
(gdb) file a.out
Reading symbols from a.out...done.
(gdb) b main
Breakpoint 1 at 0x8048918: file a.cc, line 29.
(gdb) set print object on
(gdb) set print pretty on
(gdb) set print vtbl on
(gdb) set print array on
(gdb) r
Starting program: /usr/local/gdb/src/gdb/a.out 

Breakpoint 1, 0x8048918 in main () at a.cc:29

29	{
(gdb) n
31		dan=new daniel();
(gdb) n
32		cout <<typeid(*dan).name()<<endl;
(gdb) p dan
$1 = (daniel *) 0x8051030
(gdb) p dan[0]
$2 = (daniel) {
  <fred> = {
    a = 0, 
    _vptr$ = 0x804f390
  }, 
  members of daniel: 
  b = 0
}
(gdb) ptype dan
type = class fred {
  public:
    int a;

    fred & operator=(fred const &);
    fred(fred const &);
    fred(void);
    virtual int ab(void);
} *
(gdb) p dan[0]->b
There is no member or method named b.
(gdb) n
6daniel
33		dan=new bob();
(gdb) 
34		dan=new george2();
(gdb) p dan
$3 = (bob *) 0x8051040
(gdb) p dan[0]
$4 = (bob) {
  <fred> = {
    a = 0, 
    _vptr$ = 0x804f378
  }, 
  members of bob: 
  c = 0
}
(gdb) p dan[0].c
There is no member or method named c.
(gdb) n
35		dan->a=55;
(gdb) p dan[0]
$5 = (george2 [incomplete object]) {
  <george> = {
    d = 0
  }, 
  <bob> = {
    <fred> = {
      a = 0, 
      _vptr$ = 0x804f360
    }, 
    members of bob: 
    c = 0
  }, 
  members of george2: 
  e = 0
}
(gdb) l
30		fred *dan;
31		dan=new daniel();
32		cout <<typeid(*dan).name()<<endl;
33		dan=new bob();
34		dan=new george2();
35		dan->a=55;
36		cout <<typeid(*dan).name()<<endl;
37	}
38	
(gdb) n
36		cout <<typeid(*dan).name()<<endl;
(gdb) p dan
$7 = (suspicious *) 0x8050064
(gdb) p dan[0]
$8 = (george2 [incomplete object]) {
  <george> = {
    d = 0
  }, 
  <bob> = {
    <fred> = {
      a = 55, 
      _vptr$ = 0x804f360
    }, 
    members of bob: 
    c = 0
  }, 
  members of george2: 
  e = 0
}
(gdb) c
Continuing.
7george2

Program exited normally.
(gdb) q

Script done on Mon Mar 13 19:34:51 2000

             reply	other threads:[~2000-04-01  0:00 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-03-13 16:53 Daniel Berlin [this message]
2000-03-15 13:20 ` Jimmy Guo
2000-03-15 20:33   ` Daniel Berlin+mail.gdb
2000-03-16 15:53     ` Jimmy Guo
2000-03-16 16:29       ` Jimmy Guo
2000-04-01  0:00         ` Jimmy Guo
2000-04-01  0:00       ` Jimmy Guo
2000-04-01  0:00     ` Daniel Berlin+mail.gdb
2000-04-01  0:00   ` Jimmy Guo
2000-04-01  0:00 ` Daniel Berlin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.LNX.4.10.10003131601500.8750-100000@localhost.localdomain \
    --to=dan@cgsoftware.com \
    --cc=gdb@sourceware.cygnus.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).