如何使用 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 位设备)。因此,只要您考虑到 x0
和 x1
在系统调用后受到影响并且恰好有 x16
这是一个无效的系统调用,您就可以开始了。
更新
对于@PeterCordes 的精彩评论 x86 的另一种选择 是:
int3
即调试器陷阱
手臂等效为
trap
区别 vs syscall
方法是程序在 int3
/ trap
之后执行将继续 if and only如果 调试器被附加并且 lldb continue
命令跟随,附加值是它 根本不会影响寄存器 。在系统调用方法中,程序也将继续执行,而无需附加调试器和上述受影响的寄存器。
我尝试了 "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
。更多信息 0x0
- 0x0xxx
。甚至无效的系统调用似乎也会影响 x0
& x1
(对于 64 位,因为我没有要测试的 32 位设备)。因此,只要您考虑到 x0
和 x1
在系统调用后受到影响并且恰好有 x16
这是一个无效的系统调用,您就可以开始了。
更新 对于@PeterCordes 的精彩评论 x86 的另一种选择 是:
int3
即调试器陷阱
手臂等效为
trap
区别 vs syscall
方法是程序在 int3
/ trap
之后执行将继续 if and only如果 调试器被附加并且 lldb continue
命令跟随,附加值是它 根本不会影响寄存器 。在系统调用方法中,程序也将继续执行,而无需附加调试器和上述受影响的寄存器。