通常当我设置lldb观察点时,当它们被击中时,lldb表示观察点达到旧值:新值。但是,我在一个似乎写入第三方库(libjpeg-turbo)内的地址上设置了一个观察点,而不是通常的观察点,我看到EXC_BREAKPOINT代码= 258,子代码= 0xADDRESS。 / p>
在所有情况下,我都可以看到子代码必须是地址,因为它始终等于地址或接近我设置观察点的地址。谁能证实这一点?
如果我删除观察点并继续前进,lldb不会因EXC_BREAKPOINT而暂停。但代码意味着什么,我在哪里可以找到一些关于此的官方文档?
exc_types.h没有提供任何详细信息。
答案 0 :(得分:1)
exc_types.h只具有异常定义的体系结构独立部分。您需要查看i386 / arm子目录以查找特定于体系结构的部分。如果你在Yosemite,arm目录不在/ usr / include / mach中,你必须在Xcode.app里面的iPhoneOS SDK中查找它。无论如何,mach / arm / exception.h说:
#define EXC_ARM_DA_DEBUG 0x102 /* Debug (watch/break) Fault */
并且您怀疑子代码是访问的地址。
但是如果lldb将异常识别为实现更高级别的任务,则lldb不会报告异常。在这种情况下,它应该报告停止原因作为观察点击中。出于某种原因,它并不认为这是你的观察点。子代码地址是否与watch list
报告的地址完全相同?
答案 1 :(得分:1)
对于对这个问题感兴趣的人,有一篇关于这个主题的好文章:
Understanding iOS Exception Types
在所有情况下,我都可以看到子代码必须是地址,因为它总是等于地址或接近我设置观察点的地址。谁能证实这一点?
exception_types.h
标题中的信息不多:
open -t /Applications/Xcode.app//Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/mach/exception_types.h
我可以确认我总是看到EXC_BREAKPOINT
在子码中有地址。
但是标题中的其他类型表示subcode
可以有不同类型的信息:
#define EXC_EMULATION 4 /* Emulation instruction */
/* Emulation support instruction encountered */
/* Details in code and subcode fields */
我们不得不调查产生的一个Swift崩溃:EXC_BREAKPOINT
。在我们的案例中,它归结为Swift类型的强制。以下两种情况都会导致ARM设备上出现EXC_BREAKPOINT
:
func test_crash() {
let num = Int(DBL_MAX)
}
func test_crash_2() {
let num = Int(Double(0) / Double(0))
}
在这两种情况下,如果你查看程序集,EXC_BREAKPOINT有一个子代码,地址是sbrk
指令的地址。