如何陷入调试器并继续使用iOS硬件?

时间:2016-06-09 21:15:50

标签: ios iphone debugging assembly breakpoints

在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 +1register write pc `$pc+8\`手动推进指令指针,否则我会继续按下它,这比仅仅按下继续操作要方便得多。

我正在为使用Xcode 7.3.1的32位和64位设备构建iOS 9。任何帮助表示赞赏!

3 个答案:

答案 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

您可以在00之间使用您选择的任何值替换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而不是BRKBKPTSVC可能是不正确的。)

答案 2 :(得分:0)

我在使用基于 ARM 的 MacBook Pro(Apple M1 芯片)时遇到了类似的问题。这对我有用:

asm ("brk #0xF000");

这也适用于 iOS 设备。