如何用GDB脚本/GDB-Python保存指针到变量供后续断点使用
方法一:GDB原生脚本实现
GDB里自定义用户变量必须加$前缀,你的示例漏了这个符号,修正后就能正常保存并复用地址:
# 在断点1处把目标地址存到用户变量$ADDR b *BREAK_POINT_1 commands set $ADDR = *(char**) $r0 continue end # 在断点2处调用保存好的变量 b *BREAK_POINT_2 commands x/100x $ADDR continue end
- 注意:如果不加
$,GDB会把ADDR当成程序里的符号,大概率会报错找不到。 - 验证方法:断点1触发后,执行
print $ADDR就能确认地址是否保存成功。
方法二:GDB-Python脚本实现
如果需要更复杂的逻辑(比如校验地址合法性、动态处理),用GDB的Python API更灵活:
import gdb # 全局变量存目标地址 saved_addr = None # 断点1的处理函数 def handle_bp1(event): global saved_addr # 取出$r0的值,转换为char**类型后解引用 r0_val = gdb.parse_and_eval("$r0") char_double_ptr = r0_val.cast(gdb.lookup_type("char").pointer().pointer()) saved_addr = char_double_ptr.dereference() gdb.execute("continue") # 断点2的处理函数 def handle_bp2(event): global saved_addr if saved_addr is not None: # 以16进制打印100个字节 gdb.execute(f"x/100x {saved_addr}") gdb.execute("continue") # 设置断点并绑定处理函数 bp1 = gdb.Breakpoint("*BREAK_POINT_1") bp1.connect("stop", handle_bp1) bp2 = gdb.Breakpoint("*BREAK_POINT_2") bp2.connect("stop", handle_bp2)
使用步骤:
- 把代码存成
save_addr.py - 在GDB里执行
source save_addr.py加载脚本 - 运行程序即可自动执行逻辑
内容的提问来源于stack exchange,提问作者python3.789
相关产品推荐
相关产品推荐

