在ARM64平台的lldb中跳过brk指令的方法问询
在ARM64 macOS的LLDB中跳过BRK指令的方法
在ARM64平台开发JIT编译器时,常通过插入brk指令辅助调试,但ARM64的PC寄存器指向当前执行指令(而非x86_64的下一条),导致用si单步时会重复触发BRK断点。之前尝试的register write $pc $pc + 4``命令在macOS LLDB中失效,以下是几种可行的官方/优化方法:
1. 用表达式计算修改PC
LLDB的register write不支持直接在参数中做算术运算,需先通过expr计算目标地址再写入:
# 分步执行 expr unsigned long long $new_pc = $pc + 4 register write pc $new_pc # 合并为一行(利用LLDB命令替换) register write pc `expr $pc + 4`
2. 使用官方thread jump命令
LLDB内置的thread jump是更规范的跳转方式,支持相对偏移:
# 相对当前PC偏移4字节(跳过当前4字节的BRK指令) thread jump --by 4 # 也可以直接指定绝对地址 thread jump --address $pc + 4
3. 自动跳过BRK断点(适合频繁调试场景)
如果需要反复跳过BRK指令,可给BRK断点添加自动跳转的回调:
- 先给BRK指令设置断点(以基础BRK opcode
0xd4200000为例,带立即数的BRK需对应调整opcode):
breakpoint set --opcode 0xd4200000
- 添加Python回调:
breakpoint command add -s python
然后输入以下脚本(输入完按Ctrl+D保存):
def breakpoint_callback(frame, bp_loc, internal_dict): current_pc = frame.GetPC() frame.GetThread().JumpToAddress(current_pc + 4) return False # 返回False表示不暂停,直接继续执行
此后触发BRK断点时会自动跳转到下一条指令,无需手动干预。
内容的提问来源于stack exchange,提问作者Aaron Patterson
相关产品推荐
相关产品推荐

