【问题标题】:How do I access the registers with python in gdb如何在 gdb 中使用 python 访问寄存器
【发布时间】:2011-05-23 22:48:20
【问题描述】:

如何访问当前调试实例中的 cpu 寄存器?例如,您可以从 gdb 调用 printf "0x%x", $eaxset $eax_b = $eax 是否还有一种方法可以通过 gdb 提供的 python 支持来做到这一点?或者我应该创建一个可以像save-reg "eax" $eax 一样调用的python 函数,他将寄存器存储在我希望存储它们的数组中?

另一方面,您也可以使用 gdb 脚本 set $eax = 1000 例如,我也想在 python 脚本中执行此操作,而不是 gdb 脚本。

【问题讨论】:

    标签: python gdb


    【解决方案1】:

    我不相信 GDB 的 Python API 提供对寄存器的直接访问权限,但根据您想用它做什么,您可以通过使用 @987654322 评估 gdb 命令来访问它@,或使用 gdb.parse_and_eval() 计算 "$eax" 表达式:

    (gdb) p $rbx
    $23 = 140737488348072
    (gdb) python print type(gdb.parse_and_eval("$rbx")), gdb.parse_and_eval("$rbx")
    <type 'gdb.Value'> 140737488348072
    

    (此示例在 gdb 提示符下,但 gdb 模块与在 GDB 中执行的其他代码没有任何不同。)

    【讨论】:

    • 我不认为它在以太里面,但我猜这会成功!谢谢!
    • 嗯,parse_and_eval 确实是嵌入 GDB 中的任何 Python 代码的主力。没有其他方法,因为那里的方法已经奏效了:)
    • @ThomasWouters 我不明白:s 选择的答案如何解释使用 python 执行以下操作? set $eax = 1000
    • 我找到了使用 python here 设置 gdb 变量的答案。现在我明白了@ThomasWouters 在他的回答中提到gdb.execute() 时的意思:)
    • 根据你的 python 版本,它可能是python print(type(gdb.parse_and_eval("$rbx")), gdb.parse_and_eval("$rbx"))
    【解决方案2】:

    最近的gdb 版本(如Debian 7.12-6)在gdb.Frame 类中有一个read_register 方法。

    (gdb) info register rip
    rip            0x7f68656c142d       0x7f68656c142d <__lll_lock_wait+29>
    (gdb) python print(gdb.selected_frame().read_register('rip'))
    0x7f68656c142d <__lll_lock_wait+29>
    (gdb) 
    

    该类没有相应的方法来修改寄存器值。该方法属于该类是有意义的,因为寄存器值在堆栈帧中不同,因为gdb 在外部帧中显示保存的寄存器值,例如由older 方法返回的值,内部调用者帧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多