_Unwind_Backtrace vs. _Unwind_RaiseException unwinding

Roy Krischer rkrische@plg.uwaterloo.ca
Thu Nov 20 20:27:00 GMT 2008


Hi,

I've been playing around with _Unwind_Backtrace for a C++ project of 
mine. Ideally, I would like to call the personality routine from 
_Unwind_Backtrace to decode the lsda for me, and I can certainly do it 
through the trace function.

The problem that I have, however, is that the unwinding that 
_Unwind_Backtrace produces is different from the one 
_Unwind_RaiseException produces. More specifically, the contexts created 
by _Unwind_Backtrace have the first few register locations  NULLed, so 
when I run the personality routine in _UA_CLEANUP_PHASE mode, it tries 
to dereference those (reg[0] and reg[2] on my architecture) null 
pointers and crashes.

What is so fundamentally different about _Unwind_Backtrace and 
_Unwind_RaiseException, that _Unwind_RaiseException produces 'complete' 
contexts, while Backtrace does not? Is it because _Unwind_RaiseException 
uses __builtin_eh_return and this causes the compiler to generate the 
proper information?

How can I trick _Unwind_Backtrace into producing the same contexts 
and/or using the personality routine and it behaving just like during 
exception handling (minus installing the context at the end, of course)?

Any help would be greatly appreciated

   Roy



More information about the Gcc-help mailing list