xcode 执行中断,原因:EXC_BAD_ACCESS(代码=1,地址=0xb06b9940)

a64a0gku  于 2023-08-07  发布在  其他
关注(0)|答案(4)|浏览(167)

我是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.


全局断点状态切换处于关闭状态。

qlvxas9a

qlvxas9a1#

您的应用程序正在停止,因为您正在运行的代码引发了未捕获的Mach异常。Mach异常相当于Mach内核的BSD信号-它构成了macOS操作系统的最低级别。
在这种情况下,特定的Mach异常是EXC_BREAKPOINTEXC_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,您确实希望执行以下操作:

(lldb) po [$rax class]

字符串
注意,这也不太可能工作,因为$rax只在函数开始时保存self。然后它被用作暂存寄存器。因此,如果你有任何方法进入函数(你的代码致命地失败了一些测试的事实似乎是可能的),$rax不太可能仍然持有self
还要注意,如果这是一个32位程序,那么$eax实际上并不用于参数传递- 32位Intel代码在堆栈上传递参数,而不是在寄存器中。
无论如何,要找出哪里出了问题,首先要做的是在得到这个异常时打印回溯,并查看在这个错误发生时正在运行的代码。

wydwbb8l

wydwbb8l2#

清理项目并重新启动Xcode对我来说很有效。

gv8xihay

gv8xihay3#

我正在添加我的解决方案,因为我一直在努力解决同样的问题,而且我在任何地方都没有找到这个解决方案。
在我的情况下,我不得不运行产品->清理构建文件夹(清理+选项键),并重建我的项目。断点和lldb命令开始正常工作。

mqxuamgl

mqxuamgl4#

运行时错误

EXC_BAD_ACCESS (code=1, address=0xb06b9940)

字符串
此外,当模式中的下一个参数打开时,您可以看到此错误。

-com.apple.CoreData.ConcurrencyDebug 1

相关问题