如何在PythonGDB中获取gdb.execute的输出(GDB 7.1)?
我现在正在写一个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 个回答
顺便说一下,现在(在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。
你可以先把内容写入一个文件,然后再从这个文件中读取内容,比如:
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 要好得多。
那么,有没有办法在 GDB 7.1 中获取 gdb.execute 的输出呢?
没有。
你最好的选择是准备好 GDB 7.3。因为 GDB 通常不使用共享库(除了 libc 和可能的 libpython),你可以直接把 gdb 的可执行文件和你的脚本一起复制过去。这样会比你提到的其他方法简单得多,也更容易维护。