如何在PythonGDB中获取gdb.execute的输出(GDB 7.1)?

9 投票
3 回答
5450 浏览
提问于 2025-04-17 10:58

我现在正在写一个Python的GDB脚本。问题是这个脚本必须和GDB 7.1兼容。所以我最开始是为GDB 7.3.1写的脚本,并使用了一个函数来获取GDB命令的输出(针对GDB 7.3.1):

myvar = gdb.execute("info target", False, True)

这个函数的最后一个参数应该返回结果为字符串(这很合理;不然我为什么要执行这样的命令呢;)

但是在GDB 7.1版本中,似乎最后一个参数是不可用的,所以这一行(针对GDB 7.1):

myvar = gdb.execute("info target", False)

返回的是None

有没有办法获取这个命令的输出呢?我已经尝试过把我的Python脚本的标准输出重定向到一个文件,然后再加载这个文件,但显然我的Python脚本的标准输入和输出被GDB环境覆盖了,所以gdb.execute命令的输出没有写入我的文件。

我现在唯一能想到的办法是用一个bash脚本来包装我的脚本,首先打开GDB并运行一个Python脚本来执行各种命令,然后把输出重定向到一个文件。接着再打开GDB,但这次用另一个Python脚本来加载这个文件,解析内容,然后根据文件中的输入执行其他命令,依此类推。但这真的是我能想到的最糟糕的解决方案。

那么在GDB 7.1中,有没有办法获取gdb.execute的输出呢?

3 个回答

2

顺便说一下,现在(在gdb 8.1版本中测试过)你可以使用 to_string 这个参数了。

https://sourceware.org/gdb/onlinedocs/gdb/Basic-Python.html

gdb.execute (command [, from_tty [, to_string]])

默认情况下,命令产生的任何输出都会发送到GDB的标准输出(如果开启了日志记录,还会发送到日志输出)。如果 to_string 参数设置为 True,那么输出会被 gdb.execute 收集并以字符串的形式返回。默认情况下是 False,这样返回的值就是 None。

3

你可以先把内容写入一个文件,然后再从这个文件中读取内容,比如:

os.system("rm tmp.txt")
gdb.execute("set logging file tmp.txt")
gdb.execute("set logging on")
mainsec=gdb.execute("info proc mappings")
gdb.execute("set logging off")
mainsec = open("tmp.txt").read()

不过,旧版的 gdb.execute 要好得多。

5

那么,有没有办法在 GDB 7.1 中获取 gdb.execute 的输出呢?

没有。

你最好的选择是准备好 GDB 7.3。因为 GDB 通常不使用共享库(除了 libc 和可能的 libpython),你可以直接把 gdb 的可执行文件和你的脚本一起复制过去。这样会比你提到的其他方法简单得多,也更容易维护。

撰写回答