问题描述
|
如何访问当前调试实例中的cpu寄存器?从gdb中,您可以调用例如
printf \"0x%x\",$eax
和set $eax_b = $eax
,还有一种方法可以通过gdb提供的python支持来做到这一点?还是我应该创建一个可以调用save-reg \"eax\" $eax
之类的python函数,将其存储在我希望存储它们的数组中?
另一方面,例如,对于gdb脚本,您也可以按3,这也是我想从python脚本而不是gdb脚本中完成的。
解决方法
我不相信GDB的Python API可以直接访问寄存器,但是根据您要使用的功能,您可以通过使用
gdb.execute()
评估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中执行的其他代码没有任何不同。)
,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)
该类没有相应的方法来修改寄存器值。该方法属于该类是有意义的,因为寄存器值在堆栈帧之间有所不同,即in8ѭ在外部帧中显示已保存的寄存器值,例如older
方法返回的值,即内部帧的调用者。