在Mac OS X和iOS模拟器(均为x86)中,我们可以使用内联汇编中的int3
指令陷阱到调试器(LLDB)。这很好,因为它会陷入特定的代码行,但我们可以通过在调试器中点击continue来立即继续。
有没有办法在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。任何帮助表示赞赏!
答案 0 :(得分:3)
Apple的libc signal.h
包含XNU的sys/signal.h
, 定义SIGINT(在所有平台上):
// [...]
#define SIGHUP 1 /* hangup */
#define SIGINT 2 /* interrupt */
#define SIGQUIT 3 /* quit */
// [...]
因此,虽然我无法确认这种做法确实有效(由于我缺乏iOS 9设备),阻碍你的障碍实际上不应该是一个问题。
对于汇编指令,BKPT
是有效的ARM指令,但仅适用于A32。 A64变体称为BRK
如果您正在构建胖二进制文件并无条件地使用其中任何一个,那么您将始终遇到编译器错误。
另请注意,两个指令都需要立即值(传递给调试器)。省略该值也会产生编译器错误。
那就是说,你应该可以用简单的#ifdef
插入A32和A64的调试指令:
#ifdef __aarch64__
asm volatile("BRK 0");
#else
asm volatile("BKPT 0");
#endif
您可以在0
和0
之间使用您选择的任何值替换255
。
关于TRAP
指令的注释:虽然Apple的汇编程序似乎接受A32的这条指令并将其转换为0xe7ffdefe
,但它会在A64上发出“无法识别的指令助记符”,类似于{ {1}}指示
我也无法找到有关ARM信息中心或Apple文档中的说明的任何参考。
答案 1 :(得分:0)
我在OS X上使用Swift也遇到了类似的问题:
1)raise(SIGINT)
在后台进程(例如SceneKit的Scene Renderer Protocol)中不适用于我。 (也许缺少处理程序?)
2)__builtin_trap()
不允许在之后继续
3)asm(" int3 ")
需要ObjC和头文件,这一开始让我感到恐惧。但这还不错。刚刚在两个新文件中添加了三行:
---- NSObject + MachineTrap.h ----
void machineTrap(void);
---- NSObject + MachineTrap.h ----
#import "NSObject+MachineTrap.h"
void machineTrap(void) { asm (" int3 "); } /// Program has TRAPPED to DEBUGGER ///`
(我选择int3
而不是BRK
,BKPT
,SVC
可能是不正确的。)
答案 2 :(得分:0)
我在使用基于 ARM 的 MacBook Pro(Apple M1 芯片)时遇到了类似的问题。这对我有用:
asm ("brk #0xF000");
这也适用于 iOS 设备。