在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脚本修改或设置断点命令。我该怎么做呢?