如何在gdb python脚本中设置或修改断点命令

时间:2018-01-18 02:25:35

标签: python debugging gdb

在gdb python脚本中,如何设置或修改断点的命令列表?

我可以手工做到这一点。例如,要更改断点2的命令列表,在提示符处我可以输入:

(gdb) commands 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>info reg rax
>set $rax=0x1234
>end

然而,从gdb python脚本来看,我似乎无法执行多行命令。

gdb.execute("commands 2\ninfo reg rax\nset $rax=0x1234\nend\n")

给我一​​个像

这样的输出
(gdb) source blah.py
>

它正坐在那里以获得更多输入。在我输入end并按回车键之前,它不会继续前进。然后它只是提出投诉,明确说明在该字符串的commands 2之后没有正确解析任何内容。

尝试单独输入每一行无济于事。例如脚本:

gdb.execute("commands 2")
gdb.execute("info reg rax")
gdb.execute("set $rax=0x1234")
gdb.execute("end")

在第一次执行期间等待来自用户的更多输入,因此也存在类似的问题。虽然大多是如意,但以下情况也不起作用:

gdb.execute(["commands 2","info reg rax","set $rax=0x1234","end"])

很容易以编程方式获取gdb.breakpoints()的断点列表。并且这些对象具有属性commands,我可以看到我手动或从本机gdb脚本设置的任何命令。但是,如果我尝试修改此属性,则会失败。因此,一旦手工设置了某些东西,或者gdb脚本,python脚本似乎就无法编辑它。 API文档缺少许多有用的信息,但它确实说明了https://sourceware.org/gdb/onlinedocs/gdb/Breakpoints-In-Python.html#Breakpoints-In-Python Variable: Breakpoint.commands ... This attribute is not writable.

不,我不认为它是“永远不会使用gdb脚本”或“永远不会手动输入命令”的有用答案,而是“总是编写一个python gdb.Breakpoint子类,设置为Breakpoint.stop()特别的东西,并重写所有现有的脚本以使用这些功能“。我似乎只能找到该解决方法的信息。但是我不愿意因为gdb怪癖而放弃目前的交互方式。

由于我可以轻松地运行命令来手动执行我想要的操作,因此必须有一种方法可以从gdb python脚本修改或设置断点命令。我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

我认为目前还没有办法。

如您所见,gdb.execute不支持多行。这只是Python层中的一个限制,没有人修复过。 (我没有看到它的错误所以我提交了bug 22730

此外,断点的commands字段不可分配。我为此提交了bug 22731

你的source想法,虽然可怕,但也可以。