64 位 iOS 设备上的 asm("trap")

Posted

技术标签:

【中文标题】64 位 iOS 设备上的 asm("trap")【英文标题】:asm("trap") on 64-bit iOS devices 【发布时间】:2014-01-09 21:10:30 【问题描述】:

在我自己开发的断言宏中,我一直在 ios 设备上使用 asm("trap")(或在 iOS 模拟器上使用 asm("int3"))来中断调试器。但是,在设备的 64 位版本中,我得到了陷阱指令的“无法识别的指令助记符”。 arm64 有没有等价物?

(像 __builtin_trap() 或 raise(SIGINT) 这样的替代方案确实有效,但有一些我不喜欢的行为;前者不会让你继续休息,而后者是一个函数,所以你总是比你中断时需要在堆栈中的位置低一级。)

【问题讨论】:

【参考方案1】:

我能够使用asm("svc 0"); 闯入调试器(然后继续)。我不确定这是正确的方式,但它似乎可以完成这项工作。

【讨论】:

不正确。它调用未知的系统调用,这会引发SIGSYS signal(错误的系统调用)并且调试器会捕获它。我认为最好改为send SIGSTOP【参考方案2】:

没有尝试过 iOS,但是在 Linux 上,brk 指令会导致 SIGTRAP 被引发,如果调试器正在运行,则会捕获到调试器。

asm("brk #0");

【讨论】:

这将是特定于架构的,对吧?所以除非你在 arm64 上运行 Linux,否则我认为它不适用于 iOS。 好吧,该指令会生成断点指令异常——该部分由 arm64 架构定义,并且与操作系统无关。 Linux 通过引发 SIGTRAP 来处理异常。我猜 iOS 会通过调用任何可用的调试器工具来处理它。我不知道细节,但这是我建议尝试的。当然,尝试过的人的反馈会很有用;如果它实际上不起作用,我将删除答案。

以上是关于64 位 iOS 设备上的 asm("trap")的主要内容,如果未能解决你的问题,请参考以下文章

[使用硬件内存保护在64位硬件上检查数组范围

在 64 位 iOS 设备上更改唯一标识符

RedHat 6.8 64位安装ASM

为啥在 64 位 5s iPhone 上安装时应用程序会卡住

如何在 C 中使用 asm 添加两个 64 位数字时访问进位标志

JSONKit 崩溃:iPad 视网膜 64 位设备模拟器中的 iOS 7 Xcode 5.1