|
Boost Users : |
From: Bill Lear (rael_at_[hidden])
Date: 2006-05-04 10:33:44
On Wednesday, May 3, 2006 at 09:03:03 (-0700) Robert Ramey writes:
>Heres what I do.
>
>I run the debugger.
>
>I set a trap anywhere. or I can wait until it traps on its own.
I did want to share something I kvetched about: the pain in the
neck when C++ exceptions are thrown and you get no call stack of
how that exception came to be thrown (e.g., "stream error").
I discovered what seems to be a fairly easy solution under gdb.
Compile this test code with -g:
#include <iostream>
#include <stdexcept>
using namespace std;
void a() { throw runtime_error("bad dog"); }
void b() { a(); }
void c() { b(); }
void d() { c(); }
int main(int ac, char* av[]) {
try {
d();
} catch (const exception& e) {
cerr << "error: " << e.what() << '\n';
}
}
In gdb 6.4, you can simply say "catch throw". In the 6.3 version
(perhaps earlier), you can set the "catch throw" after shared
libraries have been loaded:
% gdb ./a.out
(gdb) set stop-on-solib-events 1
(gdb) run
Starting program: /home/blear/a.out
Stopped due to shared library event
(gdb) catch throw
Catchpoint 1 (throw)
(gdb) c
Continuing.
Stopped due to shared library event
(gdb) c
Continuing.
Stopped due to shared library event
(gdb) c
Continuing.
Catchpoint 1 (exception thrown)
0x00aeaf11 in __cxa_throw () from /usr/lib/libstdc++.so.6
(gdb) where
#0 0x00aeaf11 in __cxa_throw () from /usr/lib/libstdc++.so.6
#1 0x08048c04 in a () at t.cc:6
#2 0x08048c0f in b () at t.cc:7
#3 0x08048c1d in c () at t.cc:8
#4 0x08048c2b in d () at t.cc:9
#5 0x08048c50 in main (ac=1, av=0xbff68dd4) at t.cc:13
(gdb)
Hope this helps others.
Bill
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net