我正在尝试调试iPhone上的间歇性错误,崩溃时跟踪信息看起来像:
objc_message_send
__invoking__
[NSInvocation invoke]
HandleDelegateSource
MainRunLoop
....
当GDB停止时,我希望能够确定系统正在尝试调用哪个选择器的详细信息 - 我现在在 [NSInvocation Invoke] 周围设置了断点,但从那个点无法弄清楚如何检查我所停止的 NSInvocation 对象的细节。
我正在尝试调试iPhone上的间歇性错误,崩溃时跟踪信息看起来像:
objc_message_send
__invoking__
[NSInvocation invoke]
HandleDelegateSource
MainRunLoop
....
当GDB停止时,我希望能够确定系统正在尝试调用哪个选择器的详细信息 - 我现在在 [NSInvocation Invoke] 周围设置了断点,但从那个点无法弄清楚如何检查我所停止的 NSInvocation 对象的细节。
一个简单的最终答案 - 在GDB中,您可以简单地查看被调用的选择器名称的寄存器(lothar的答案中的theSelector参数)。它是一个C字符串,因此您可以使用以下命令之一观察它(取决于您是否在模拟器或设备上运行):
Simulator: display /s $ecx
Device: display /s $r1
如果您查看objc_msgSend的参考信息,您会看到选择器是第二个参数。现在应该更容易解密调试器输出了。
objc_msgSend
Sends a message with a simple return value to an instance of a class.
id objc_msgSend(id theReceiver, SEL theSelector, ...)Parameters
theReceiver
A pointer that points to the instance of the class that is to receive the message.
theSelector
The selector of the method that handles the message.
...
A variable argument list containing the arguments to the method.