【发布时间】:2016-06-09 21:15:50
【问题描述】:
在 Mac OS X 和 iOS 模拟器(均为 x86)中,我们可以使用内联汇编中的 int3 指令捕获到调试器 (LLDB)。这很好,因为它会捕获到特定的代码行,但我们可以通过在调试器中点击继续来立即继续。
有没有办法在 iOS 硬件上做到这一点?
An answer to an older question 提到raise(SIGINT),据我所知(通过检查signal.h)不存在。另一个答案提到了trap 汇编指令,它会导致构建错误(“无法识别的指令助记符”)。同样无法识别的是BKPT 汇编指令mentioned in ARM documentation。
我已经尝试过__builtin_trap(),它几乎,几乎可以满足我的要求,但不允许我继续。除非我使用jump +1 或register write pc `$pc+8\` 手动推进指令指针,否则我会一直点击它,这比点击继续方便得多。
我正在使用 Xcode 7.3.1 为 32 位和 64 位设备构建 iOS 9。任何帮助表示赞赏!
【问题讨论】:
-
反对者,要解释一下吗?
-
我猜他对你的问题投了反对票,因为 signal() 和 SIGINT 都是标准 C 的一部分。opensource.apple.com//source/xnu/xnu-1456.1.26/bsd/sys/signal.h
-
raise(SIGINT) 可以工作,但并不总是可靠的,有时它会稍后停止,您需要遍历线程树以查找断点在哪里。我曾经使用过此解决方案,然后将其删除。后来发现 ASSERT 应该停止而不继续,你应该面对它们而不是忽略它们,那你为什么要断言呢?
-
这些类型的非致命断言在很多情况下都很有用,例如在代码尚未实现时。
标签: ios iphone debugging assembly breakpoints