OK, so imagine that my breakpoint in objc_exception_throw has just triggered. I’m sitting at the debugger prompt, and I want to get some more information about the exception object. Where do I find it?
OK, so imagine that my breakpoint in objc_exception_throw has just triggered. I’m sitting at
Share
The exception object is passed in as the first argument to
objc_exception_throw. LLDB provides$arg1..$argnvariables to refer to arguments in the correct calling convention, making it simple to print the exception details:Make sure to select the
objc_exception_throwframe in the call stack before executing these commands. See the “Advanced Debugging and the Address Sanitizer” in the WWDC15 session videos to see this performed on stage.Outdated Information
If you’re on GDB, the syntax to refer to the first argument depends on the calling conventions of the architecture you’re running on. If you’re debugging on an actual iOS device, the pointer to the object is in register
r0. To print it or send messages to it, use the following simple syntax:On the iPhone Simulator, all function arguments are passed on the stack, so the syntax is considerably more horrible. The shortest expression I could construct that gets to it is
*(id *)($ebp + 8). To make things less painful, I suggest using a convenience variable:You can also set
$exceptionautomatically whenever the breakpoint is triggered by adding a command list to theobjc_exception_throwbreakpoint.(Note that in all cases I tested, the exception object was also present in the
eaxandedxregisters at the time the breakpoint hit. I’m not sure that’ll always be the case, though.)Added from comment below:
In lldb, select the stack frame for
objc_exception_throwand then enter this command: