【问题标题】:How to set or modify breakpoint commands in a gdb python script如何在 gdb python 脚本中设置或修改断点命令
【发布时间】: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 脚本写入磁盘并让它执行。请告诉我这个界面并没有损坏到我不得不求助于它。

标签: python debugging gdb


【解决方案1】:

我认为目前没有办法。

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

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

您的 source 想法虽然很糟糕,但可以正常工作。

【讨论】:

  • 您能否将答案更新为“直到 GDB 8.2...”,然后提供两个示例如何使用 GDB 8.2 执行此操作(一次使用 br.commands,一次使用 muliline 一个)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多