我是lldb的新手,尝试使用po [$eax class]
诊断错误
UI中显示的错误为:
Thread 1: EXC_BREAKPOINT (code=EXC_i386_BPT, subcode=0x0)
字符串
下面是lldb控制台,包括我输入的内容和返回的内容:
(lldb) po [$eax class]
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0xb06b9940).
The process has been returned to the state before expression evaluation.
型
全局断点状态切换处于关闭状态。
4条答案
按热度按时间qlvxas9a1#
您的应用程序正在停止,因为您正在运行的代码引发了未捕获的Mach异常。Mach异常相当于Mach内核的BSD信号-它构成了macOS操作系统的最低级别。
在这种情况下,特定的Mach异常是
EXC_BREAKPOINT
。EXC_BREAKPOINT
是一个常见的混淆源...因为它的名字中有“断点”一词,所以人们认为它是调试器断点。这并不是完全错误的,但异常的使用比这更普遍。EXC_BREAKPOINT
实际上是Mach的低层在执行某条指令(陷阱指令)时报告的异常。lldb使用trap指令来实现断点,但它也在系统软件的各种位中用作assert
的替代品。例如,如果你访问数组的末尾,swift会使用这个错误。这是一种在错误点停止程序的方法。如果在调试器外部运行,这将导致崩溃。但是如果您在调试器中运行,那么控制权将返回给调试器,并带有此EXC_BREAKPOINT
停止原因。为了避免混淆,如果陷阱是lldb插入到正在调试的程序中以实现调试器断点的陷阱,lldb将永远不会将
EXC_BREAKPOINT
显示为停止原因。它将始终显示breakpoint n.n
。因此,如果您看到一个线程以
EXC_BREAKPOINT
作为其停止原因而停止,这意味着您遇到了某种致命错误,通常是在您的程序使用的某些系统库中。此时的回溯将显示是哪个组件引发了该错误。无论如何,在遇到这个错误之后,您试图通过运行
po [$eax class]
调用eax寄存器中的class方法来找出该值的类。调用该方法(这将导致代码在正在调试的程序中运行)会导致崩溃。这就是你引用的“错误”消息告诉你的。这几乎肯定是因为
$eax
没有指向一个有效的ObjC对象,所以你只是在一些随机值上调用一个方法,这就是崩溃。注意,如果你正在调试一个64位程序,那么$eax实际上是真实的参数传递寄存器$rax的低32位。64位指针的底部32位不太可能是有效的指针值,因此在其上调用
class
导致崩溃也就不足为奇了。如果您尝试在64位Intel上调用第一个传入参数(ObjC方法中的self)的class,您确实希望执行以下操作:
字符串
注意,这也不太可能工作,因为
$rax
只在函数开始时保存self
。然后它被用作暂存寄存器。因此,如果你有任何方法进入函数(你的代码致命地失败了一些测试的事实似乎是可能的),$rax不太可能仍然持有self
。还要注意,如果这是一个32位程序,那么
$eax
实际上并不用于参数传递- 32位Intel代码在堆栈上传递参数,而不是在寄存器中。无论如何,要找出哪里出了问题,首先要做的是在得到这个异常时打印回溯,并查看在这个错误发生时正在运行的代码。
wydwbb8l2#
清理项目并重新启动Xcode对我来说很有效。
gv8xihay3#
我正在添加我的解决方案,因为我一直在努力解决同样的问题,而且我在任何地方都没有找到这个解决方案。
在我的情况下,我不得不运行产品->清理构建文件夹(清理+选项键),并重建我的项目。断点和lldb命令开始正常工作。
mqxuamgl4#
运行时错误
字符串
此外,当模式中的下一个参数打开时,您可以看到此错误。
型