3

通常当我设置 lldb 观察点时,当它们被命中时,lldb 会说观察点命中旧值:新值。但是,我在似乎被写入第 3 方库 (libjpeg-turbo) 内部的地址上设置了一个观察点,而不是通常的观察点命中,我看到的是 EXC_BREAKPOINT 代码 = 258,子代码 = 0xADDRESS。

在所有情况下,我都可以看到子代码必须是地址,因为它始终等于地址或接近我设置观察点的地址。谁能证实这一点?

如果我删除观察点并继续前进,lldb 不会因 EXC_BREAKPOINT 而暂停。但是代码是什么意思,我在哪里可以找到一些官方文档?

exc_types.h 没有提供任何详细信息。

4

2 回答 2

2

对于任何对此问题感兴趣的人,都有一篇关于该主题的好文章:

了解 iOS 异常类型


在所有情况下,我都可以看到子代码必须是地址,因为它始终等于地址或接近我设置观察点的地址。谁能证实这一点?

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 类型的强制。EXC_BREAKPOINTARM 设备上的以下两个原因:

func test_crash() {
  let num = Int(DBL_MAX)
}

func test_crash_2() {
  let num = Int(Double(0) / Double(0))
}

在这两种情况下,EXC_BREAKPOINT 都有一个带有地址的子代码,sbrk如果您查看程序集,该地址就是指令的地址。

于 2017-10-11T09:45:55.840 回答
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 将异常识别为执行某些更高级别的任务,则它不会报告裸异常。在这种情况下,它应该将停止原因报告为观察点命中。由于某种原因,它不会将此视为您的观察点。子代码地址是否与报告的地址完全相同watch list

于 2015-01-16T18:52:25.550 回答