You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:42:02