On 6 Dec 2017, at 19:04, Lobron, David <[email protected]> wrote: > > So the question is: why is abort being called here? Why doesn't the stack > continue to unwind? I did notice that certain frames seem to be skipped in > the unwind sequence above, and the line numbers reported do change a little - > could that be related to the problem? I'm linking with libunwind-1.1, and > I'm building it with a fairly standard set of options (copied below).
When you throw an exception, first the runtime sets up some ObjC-specific things and then calls into the unwind library. The unwind library then walks up the stack, calling back into the runtime (or another language’s) personality function for each frame to indicate whether it’s found a handler or not. For each frame, the personality function says one of three things: this one isn’t important, this one contains cleanups, and this one contains a matching catch handler. If no personality function call finds a catch handler, then the unwinder returns to the runtime, which then calls abort. That doesn’t seem to be happening here. If there is a catch handler, then the unwinder walks the stack again, only this time when it finds a catch block the personality function sets two registers (the exception object and the index of the cleanup in a table) and the unwind library returns control to the program. Once the program has run the cleanup code, it will call _Unwind_Resume and will continue unwinding. If the unwinder then doesn’t find another cleanup or catch on the stack, then it will call abort, because _Unwind_Resume isn’t expected to return, but it now doesn’t have anywhere to unwind to. TL;DR: It looks as if the unwinder is first finding a catch block when the exception is thrown, but then not finding it when the exception is rethrown after running cleanups. This is quite surprising, and the only thing I can think of that would cause it (modulo bugs in the ObjC personality function - which are entirely possible as it’s a horribly complex piece of code) is if the exception passed back into _Unwind_Resume is not the same exception as the one initially thrown. Please can you also try sticking a breakpoint on objc_exception_throw and objc_exception_rethrow? There are also a bunch of debug logs that are compiled out in the EH code - if you #define DEBUG_LOG at the top of eh_personality.c then you should see them and get a better idea of what’s going on. David _______________________________________________ Discuss-gnustep mailing list [email protected] https://lists.gnu.org/mailman/listinfo/discuss-gnustep
