_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