如何访问当前调试实例中的cpu寄存器?从gdb你可以调用例如printf "0x%x", $eax
和set $eax_b = $eax
还有一种方法可以通过python支持gdb提供吗?或者我应该创建一个python函数,可以像save-reg "eax" $eax
那样调用,在他手上将寄存器存储在我希望它们存储的数组中?
另一方面,使用gdb脚本,您也可以set $eax = 1000
,例如,我也想在python脚本中执行此操作,而不是使用gdb脚本。
答案 0 :(得分:8)
我不相信GDB的Python API提供直接访问寄存器,但是根据你想用它做什么,你可以通过用{{评估gdb命令来访问它。 1}},或使用gdb.execute()
评估"$eax"
表达式:
gdb.parse_and_eval()
(这个例子是在gdb提示符下,但{G} 1}模块在GDB中执行的其他代码中没有任何不同。)
答案 1 :(得分:0)
最近的gdb
版本(例如Debian 7.12-6)在read_register
类中具有gdb.Frame
方法。
(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
方法返回的值,内部框架的调用者。