如何将变量从 GDB 传递给调用的 python 解释器

how to pass variables from GDB to invoked python interpeter

从某些版本的 GDB(我猜是 7 左右)可以以交互或非交互方式从 GDB 调用 python。

这里有一些例子:

(gdb) python print("gdb".capitalize())
Gdb
(gdb)

是否可以将 GDB 中使用的变量传递给 Python?我尝试过类似的方法,但没有成功:

尝试传递名为 c_variable

的 C 变量
(gdb) python print(c_variable.capitalize())
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'c_variable' is not defined
Error while executing Python code.

尝试传递名为 $1 的 GDB 变量

(gdb) python print(.capitalize())
  File "<string>", line 1
    print(.capitalize())
          ^
SyntaxError: invalid syntax
Error while executing Python code.

编辑

几乎在我提出问题后我发现了这个问题passing c++ variables to python via gdb

所以我得到了以下结果:

(gdb) whatis p_char
type = char *

(gdb) ptype p_char
type = char *

(gdb) p p_char
 = 0x8002004 "hello world"

(gdb) python x=str(gdb.parse_and_eval('p_char')); print(x.split(" "))
['0x8002004', '"hello', 'world"']

这是我可以使用的东西,但我需要做一些额外的清理工作(删除引号、地址等),有没有更好的方法?而且我仍然不知道是否可以通过 .

Try to pass C variable named c_variable
Try to pass GDB's variable named

py print(gdb.parse_and_eval("c_variable"))
py print(gdb.parse_and_eval(""))

如果您想使用 Python 和 GDB,我强烈建议您阅读 this. Of special interest to you would be this page that includes parse_and_eval as well as this page on values

gdb.parse_and_eval函数returns一个gdb.Value对象。对于字符串值,您可以使用 string 方法,因此:

(gdb) python print(gdb.parse_and_eval("string_var").string())
Hello World
(gdb) python print(gdb.parse_and_eval("string_var").string()[::-1])
dlroW olleH