如何使用 Xcode 在程序集文件上设置断点?

How to set a breakpoint on an assembly file using Xcode?

我尝试了 "breakpoint [line number]"、"breakpoint filename.s:line_number",但它们不起作用。目前我必须遍历所有行,这很麻烦

作为替代方案,您可以:

1) 用

用汇编指令显示内存
di

带有显式参数

如果您需要进一步联系

di -c 1000 ;

如果需要反汇编具体地址

di -s <address>

2) 设置内存断点

br s -a <memory address you found in previous step>

另一种选择 更具破坏性,但实际上更轻松,这对您的情况可能有用,也可能没有用。您可以在汇编代码中进行无效的系统调用。您的程序将愉快地继续执行,但 lldb 将在使用 SIGSYS/EXC_SYSCALL 进行系统调用后在 下一条指令 处中断。您没有指定您的目标是 x86-64 还是 arm,因此设置会略有不同。

对于 x86-64 你会

syscall

假设您的 rax 寄存器恰好不是有效的系统调用,即在 0x2000xxx 范围内,破坏性部分将包括:

1) 将rax寄存器的高32位清零

2) r11 将变为 rflags

3)rcx会变成rip(XNU内核用它从syscall返回给用户space),然而 如果你单步 rcx 将变成 rsp 正如我所说 here

对于 32 位64 位 arm,您可以使用以下命令进行系统调用:

svc 0x80 

顺便说一句,任何 1 字节 ^ 数字都可以,但按照惯例它是 0x80。 32 位使用 r12 作为系统调用编号。 64 位使用 x16。更多信息 & here。所以基本上有效的范围是 0x0 - 0x0xxx。甚至无效的系统调用似乎也会影响 x0 & x1(对于 64 位,因为我没有要测试的 32 位设备)。因此,只要您考虑到 x0x1 在系统调用后受到影响并且恰好有 x16 这是一个无效的系统调用,您就可以开始了。

更新 对于@PeterCordes 的精彩评论 x86 的另一种选择 是:

int3

即调试器陷阱

手臂等效为

trap

区别 vs syscall 方法是程序在 int3 / trap 之后执行将继续 if and only如果 调试器被附加并且 lldb continue 命令跟随,附加值是它 根本不会影响寄存器 。在系统调用方法中,程序也将继续执行,而无需附加调试器和上述受影响的寄存器。