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 位 5s iPhone 上安装时应用程序会卡住