Uebersetze meine Programme mit: g++ -Wall -g ...
wenn ich dann mit gdb das Programm ausfuehre, und mir dann mit "bt" den Stacktrace anschaue erhalte ich immer nur die Zeilen fuer libc sowie libmico aber nicht meine, aber dafuer:
#11 0x805038c in ?? ()
Eigentlich sollte die Symbole aufgrund des "-g" vorhanden sein.
Hintergrund: Erhalte eine unerwartete Exception und moechte mir gerne den Stacktrace anzeigenlassen damit ich sehe wo genau die Exception auftritt.
Am Samstag, dem 05. Mai 2001 um 22:19:44, schrieb Thomas Guettler:
Uebersetze meine Programme mit: g++ -Wall -g ...
wenn ich dann mit gdb das Programm ausfuehre, und mir dann mit "bt" den Stacktrace anschaue erhalte ich immer nur die Zeilen fuer libc sowie libmico aber nicht meine, aber dafuer:
#11 0x805038c in ?? ()
Eigentlich sollte die Symbole aufgrund des "-g" vorhanden sein.
twerner@ernie:/tmp$ cat hello.cc #include <iostream>
int main () { std::cout << "Hello World\n"; return 0; }
twerner@ernie:/tmp$ c++ hello.cc -o hello -Wall -g twerner@ernie:/tmp$ gdb hello GNU gdb 19990928 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 "i686-pc-linux-gnu"... (gdb) b main Breakpoint 1 at 0x8048566: file hello.cc, line 5. (gdb) r Starting program: /tmp/hello
Breakpoint 1, main () at hello.cc:5 5 std::cout << "Hello World\n"; (gdb) bt #0 main () at hello.cc:5 (gdb)
Was genau geht bei Dir nicht?
Torsten
... Was genau geht bei Dir nicht?
Danke fuer die Antwort. Habe nochmal darueber nachgedacht. Liegt nicht an den Debug-Symbolen, sondern dass wenn eine Exception auftritt die nicht abgefangen wird die Funktion in dem die E geworfen wurde nicht mehr im Stacktrace ist. Beispiel:
int main(){ Test t=new Test(); t.throwException(); }
Wenn ich jetzt dass im GDB starte und ablaufen lasse, dann mir den Stack anschaue ist throwException nicht mit drinnen. Beispiel Ausgabe:
#0 0x40524931 in kill () from /lib/libc.so.6 #1 0x40524618 in raise () from /lib/libc.so.6 #2 0x40525c71 in abort () from /lib/libc.so.6 #3 0x4031ba08 in __terminate () from /home/guettli/lib/libmico2.3.5.so #4 0x4031ba25 in __terminate () from /home/guettli/lib/libmico2.3.5.so #5 0x4031c410 in throw_helper () from /home/guettli/lib/libmico2.3.5.so #6 0x4031c5c5 in __throw () from /home/guettli/lib/libmico2.3.5.so #7 0x40283d4c in CORBA::Exception::_terminate_handler () from /home/guettli/lib/libmico2.3.5.so #8 0x4031ba25 in __terminate () from /home/guettli/lib/libmico2.3.5.so #9 0x4031c410 in throw_helper () from /home/guettli/lib/libmico2.3.5.so #10 0x4031c5c5 in __throw () from /home/guettli/lib/libmico2.3.5.so #11 0x805038c in main (argc=1, argv=0xbffff9f4) at client.cc:65
(Die Klasse Test ist von mir und nicht in libmico)
Gibt es nicht soetwas wie Exception.printStacktrace() (wie in Java)?
Am Sonntag, dem 06. Mai 2001 um 21:17:57, schrieb Thomas Guettler:
Gibt es nicht soetwas wie Exception.printStacktrace() (wie in Java)?
Ich bin mir nicht sicher, was Du genau willst. Wenn Du die Ausnahme behandelst, dann kannst Du sicherlich einen Breakpoint auf den Behandlungscode setzen. Reicht Dir das eventuell?
Torsten
On Mon, May 07, 2001 at 12:03:01AM +0200, Torsten Werner wrote:
Am Sonntag, dem 06. Mai 2001 um 21:17:57, schrieb Thomas Guettler:
Gibt es nicht soetwas wie Exception.printStacktrace() (wie in Java)?
Ich bin mir nicht sicher, was Du genau willst. Wenn Du die Ausnahme behandelst, dann kannst Du sicherlich einen Breakpoint auf den Behandlungscode setzen. Reicht Dir das eventuell?
//... T.funktion_die_leider_Exception_wirft(); catch(Exception e){ //... }
Ich wuerde gerne wissen wo genau in T.fun...() die Exception auftritt (die Zeile in der das throw() aufgerufen wird). Man koennte mit dem Debugger haendisch durchgehen, aber das ist zu Zeitaufwendig.
BTW, das eigentliche Problem hat sich inzwischen erledigt. Waere aber trotzdem interessant zu wissen wie man den Stacktrace der throw()-Zeile bekommt. Bei Python wird er, wenn man die Exception nicht auffaengt automatisch angezeigt. (oh, ich liebe Script-Sprachen).
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Hallo,
Thomas Guettler guettli@web.de schrieb:
//... T.funktion_die_leider_Exception_wirft(); catch(Exception e){ //... }
Ich wuerde gerne wissen wo genau in T.fun...() die Exception auftritt (die Zeile in der das throw() aufgerufen wird). Man koennte mit dem Debugger haendisch durchgehen, aber das ist zu Zeitaufwendig.
Ein Funktion taucht nur solange in einem Stacktrace auf, wie sie aktiv ist. Bei einem throw () wird aber die Funktion, die die Exception wirft, verlassen und damit deren Frame vom Stack entfernt - alle Spuren (bis auf das geworfene Objekt) sind bis zu der Funktion verschwunden, die das catch () enthaelt. Die einzige Moeglichkeit, die ich sehe, waere einen Breakpoint auf throw() zu setzen (wenn es dies Funktion ueberhaupt gibt und sie nicht vom Compiler expandiert wird).
BTW, das eigentliche Problem hat sich inzwischen erledigt. Waere aber trotzdem interessant zu wissen wie man den Stacktrace der throw()-Zeile bekommt. Bei Python wird er, wenn man die Exception nicht auffaengt automatisch angezeigt. (oh, ich liebe Script-Sprachen).
So ein Trace setzt voraus, dass man waehrend des Abraeumens des Stacks aufzeichnet, was man da abraeumt. Soweit ich weiss, macht C++ das nicht. Der Funktionsname ist in einem compilierten Programm zur Laufzeit gar nicht so einfach zu ermitteln, man koennte bestenfalls irgendwelche Hooks fuer den Debugger vorsehen (das wird z.B. beim dynamischen Loader gemacht).
Holger - -- Holger Dietze, email: holger.dietze@advis.de "The more data I punch in this card, the lighter it becomes, and the lower the mailing cost." -- Stan Kelly-Bootle, "The Devil's DP Dictionary"
Am Montag, dem 07. Mai 2001 um 22:44:59, schrieb Thomas Guettler:
Ich wuerde gerne wissen wo genau in T.fun...() die Exception auftritt (die Zeile in der das throw() aufgerufen wird).
Alles klar:
twerner@ernie:~$ cat hello.cc int main () { throw 0; return 0; }
twerner@ernie:~$ c++ hello.cc -o hello -g twerner@ernie:~$ gdb hello GNU gdb 19990928 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 "i686-pc-linux-gnu"... (gdb) b __throw Breakpoint 1 at 0x80484d4 (gdb) r Starting program: /home/twerner/hello Breakpoint 1 at 0x40041f08
Breakpoint 1, 0x40041f08 in __throw () from /usr/lib/libstdc++-libc6.2-2.so.3 (gdb) bt #0 0x40041f08 in __throw () from /usr/lib/libstdc++-libc6.2-2.so.3 #1 0x8048660 in main () at hello.cc:3 (gdb)
Hilfts?
Torsten
lug-dd@mailman.schlittermann.de