------- Comment #5 from pluto at agmk dot net 2007-11-05 15:44 ------- (In reply to comment #4) > This is a possible solution. Not ideal though, because, then all exceptions > will be trigger the breakpoint at __cxa_throw. > > If however, I put a breakpoint in the catch in question, then I know I will > get > the exception that I was looking for, and if bakctrace info was part of this > exception, then I could find out exactly what happened where.
gnu/ld has a nice option called --wrap that you can use to hack the g++/throw() and embbed stacktrace in way you like ;-) $ cat u.cpp #include <cstdio> #include <unwind.h> #include <dlfcn.h> _Unwind_Reason_Code helper( struct _Unwind_Context* ctx, void* ) { void* p = reinterpret_cast< void* >( _Unwind_GetIP( ctx ) ); Dl_info info; if ( dladdr( p, &info ) ) { if ( info.dli_saddr ) { long d = reinterpret_cast< long >( p ) - reinterpret_cast< long >( info.dli_saddr ); printf( "%p %s+0x%lx\n", p, info.dli_sname, d ); } } return _URC_NO_REASON; } extern "C" void __real___cxa_throw( void* thrown_exception, std::type_info* tinfo, void ( *dest )( void* ) ) __attribute__(( noreturn )); extern "C" void __wrap___cxa_throw( void* thrown_exception, std::type_info* tinfo, void ( *dest )( void* ) ) { _Unwind_Backtrace( helper, 0 ); __real___cxa_throw( thrown_exception, tinfo, dest ); } void __attribute__(( noinline )) zoo( void ) { try { std::puts( "ping!" ); throw 1; } catch ( int ) { std::puts( "pong!" ); } } void __attribute__(( noinline )) bar( void ( *f )( /*void*/ ) ) { f(); } void __attribute__(( noinline )) foo( void ) { bar( &zoo ); } int main() { foo(); return 0; } $ g++ u.cpp -ldl -rdynamic -Wl,--wrap,__cxa_throw && ./a.out ping! 0x80489c7 __wrap___cxa_throw+0x15 0x8048a16 _Z3zoov+0x3a 0x8048a7d _Z3barPFvvE+0xb 0x8048a93 _Z3foov+0x13 0x8048ab9 main+0x21 0x2e3e23 __libc_start_main+0xd3 pong! -- pluto at agmk dot net changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |pluto at agmk dot net http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33903