如何在 gdb 中使用 python 访问寄存器

发布于 2024-11-09 03:11:33 字数 321 浏览 0 评论 0原文

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

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

How can I access the cpu registers of in the current debugged instance? From gdb you can call for example printf "0x%x", $eax and set $eax_b = $eax is there also a way to do this via the python support gdb gives? Or should I create a python function which can be call like save-reg "eax" $eax which on his hand stores the registers in an array where I want them to be stored?

On the other hand, with gdb script you can also set $eax = 1000 for example, this I would also like to do from within a python script, instead of a gdb script.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小霸王臭丫头 2024-11-16 03:11:33

我不相信 GDB 的 Python API 提供对寄存器的直接访问,但是根据您想要用它做什么,您可以通过使用 gdb 评估 gdb 命令来访问它。 execute(),或者使用 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 中执行的其他代码没有任何不同。)

I don't believe the Python API to GDB offers direct access to the registers, but depending on what you want to do with it you can access it either by evaluating the gdb command with gdb.execute(), or evaluate the "$eax" expression with gdb.parse_and_eval():

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

(This example is at the gdb prompt, but the gdb module isn't any different in other code executed in GDB.)

救赎№ 2024-11-16 03:11:33

最近的 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 显示了外部帧中保存的寄存器值,例如由较旧的寄存器返回的值 方法,内部框架的调用者。

Recent gdb versions (like Debian 7.12-6) have a read_register method in the gdb.Frame class.

(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) 

That class has no corresponding method to modify a register value. It makes sense for that method to belong to that class because register values differ across stack frames, in the sense that gdb shows saved register values in outer frames, such as the ones returned by the older method, callers of the inner frames.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文