1

我想使用 python 脚本在 gdb 提示符内执行 linux 命令(例如 bt、break、frame 等)。例如:我正在使用 subprocess.call(["gdb"], shell=True) 此行通过执行 gdb 命令将我带到 (gdb) 提示符,但是在我尝试 subprocess.call(["backtrace"], shell=True) 它之后显示 /bin/sh:backtrace: command not found

4

2 回答 2

2

backtrace不是linux命令,而是gdb命令。

如果您想将命令发送到已打开的 gdb 会话,则必须将它们推送通过stdin,例如...

import subprocess

gdb = subprocess.Popen(['gdb'], stdin=subprocess.PIPE)
gdb.stdin.write('backtrace\n')
于 2013-05-06T15:45:31.703 回答
2

您在提示符中键入的(gdb)命令(如backtracebreakframe等)是 gdb 命令。只有 gdb 知道如何解释它们并且它们不能使用,subprocess.call()因为后者只能运行 Linux 可执行文件。

有两种方法可以完成接近您想要的事情:

  1. 在 Python 的控制下启动 GDB,并使用GDB/MI协议与之对话。这就是pyclewn 的工作原理。例如p = subprocess.Popen(['gdb', '-i=mi'], stdin=fd_in, stdout=fd_out)。另请参阅https://bitbucket.org/minami/python-gdb-mi/src/tip/gdbmi/session.py?at=default
  2. 使用 GDB 的内置 Python 脚本。(API 参考)例如

将此保存到t.py

import gdb

gdb.execute('set confirm off')
gdb.execute('file /bin/true')
gdb.execute('start')
gdb.execute('backtrace')
gdb.execute('quit')

然后运行:

$ gdb -q -x t.py
Temporary breakpoint 1 at 0x4014c0: file true.c, line 59.

Temporary breakpoint 1, main (argc=1, argv=0x7fffffffde28) at true.c:59
59    if (argc == 2)
#0  main (argc=1, argv=0x7fffffffde28) at true.c:59
$
于 2013-05-06T15:49:47.473 回答