我正在尝试调试 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 答案中的 Selector 参数)。它是一个 C 字符串,因此您可以使用以下命令之一观察它(取决于您是在模拟器还是设备中运行):
Simulator: display /s $ecx
Device: display /s $r1
如果您查看objc_msgSend的参考信息,您将看到选择器是第二个参数。现在应该更容易破译调试器的输出了。
objc_msgSend
将带有简单返回值的消息发送到类的实例。
id objc_msgSend(id theReceiver, SEL theSelector, ...)参数
theReceiver
指向要接收消息的类的实例的指针。
theSelector
处理消息的方法的选择器。
...
包含方法参数的变量参数列表。