EXC_BREAKPOINT代码和子代码的含义是什么?

时间:2015-01-16 15:29:47

标签: ios lldb watchpoint

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

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

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

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

2 个答案:

答案 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指令的地址。