Luk*_*uke 6 iphone debugging assembly breakpoints ios
在Mac OS X和iOS模拟器(均为x86)中,我们可以使用int3
内联汇编中的指令陷阱到调试器(LLDB).这很好,因为它陷阱到特定的代码行,但我们可以通过在调试器中按下continue来立即继续.
有没有办法在iOS硬件上执行此操作?
对于一个较旧的问题的回答提到了raise(SIGINT)
我所能看到的(从检查中signal.h
)并不存在.另一个答案提到trap
汇编指令,它会导致构建错误("无法识别的指令助记符").同样无法识别的是ARM文档中提到的BKPT
汇编指令.
我已经尝试__builtin_trap()
了几乎,几乎做了我想要的,但不允许我继续.除非我使用jump +1
或者手动推进指令指针,否则我会继续按下它register write pc `$pc+8\`
,这比仅仅按下继续操作要方便得多.
我正在为使用Xcode 7.3.1的32位和64位设备构建iOS 9.任何帮助表示赞赏!
Apple 的 libcsignal.h
包括 XNU 的sys/signal.h
,它确实定义了 SIGINT(在所有平台上):
// [...]
#define SIGHUP 1 /* hangup */
#define SIGINT 2 /* interrupt */
#define SIGQUIT 3 /* quit */
// [...]
Run Code Online (Sandbox Code Playgroud)
因此,虽然我无法确认这种做法确实有效(由于我缺少 iOS 9 设备),但阻碍您前进的障碍实际上应该不是问题。
至于汇编指令,BKPT
是一条有效的 ARM 指令,虽然仅适用于 A32。A64 变体称为BRK
.
如果您正在构建胖二进制文件并无条件地使用其中任何一个,您将始终遇到编译器错误。
另请注意,这两条指令都需要一个立即值(传递给调试器)。省略该值也会产生编译器错误。
也就是说,您应该能够使用简单的命令插入 A32 和 A64 的调试指令#ifdef
:
#ifdef __aarch64__
asm volatile("BRK 0");
#else
asm volatile("BKPT 0");
#endif
Run Code Online (Sandbox Code Playgroud)
您可以替换0
为您在0
和之间选择的任何值255
。
关于TRAP
指令的说明:虽然 Apple 的汇编程序似乎接受了 A32 的这条指令并将其翻译为0xe7ffdefe
,但它会在 A64 上发出“无法识别的指令助记符”,类似于该BKPT
指令。
我也无法在 ARM 信息中心或 Apple 文档中找到对说明的任何参考。
归档时间: |
|
查看次数: |
806 次 |
最近记录: |