【发布时间】:2018-06-27 00:43:33
【问题描述】:
在 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 脚本”或“从不手动输入命令”和“而是总是编写一个带有 Breakpoint.stop() 的 python gdb.Breakpoint 子类的有用答案。一些特别的东西,并重写所有现有的脚本以使用这些功能”。我似乎只能找到该解决方法的信息。但我不愿意仅仅因为 gdb 的怪癖而放弃当前的交互方法。
由于我可以轻松地手动运行命令来执行我想要的操作,因此必须有一种方法可以从 gdb python 脚本修改或设置断点命令。我该怎么做呢?
【问题讨论】:
-
骇人听闻的可能性:我突然想到我可以让 python 将本机 gdb 脚本写入磁盘并让它执行。请告诉我这个界面并没有损坏到我不得不求助于它。