gdb python:如何将 gdb 命令的输出重定向到变量?

Bai*_*wal 3 python gdb python-2.7 gdb-python

我使用的是 RHEL 5.3 操作系统、gdb7.5 和python2.7。我正在用 Python 编写一个脚本来自动化一些 gdb 调试步骤。我们可以将以下命令(“name1”)的输出存储到一个变量中吗?

(gdb) p *(ptr->name)
$13 = "name1"
Run Code Online (Sandbox Code Playgroud)

我想这样做是因为在我的 Python 脚本中,我会将这个 ( name1) 与用户输入字符串进行比较,如果匹配,将执行一些操作,否则要求用户输入另一个字符串。

如果不可能,请建议我替代。

sco*_*ttt 5

获取 GDB 中表达式的值是gdb.parse_and_eval()的用途。我想你想要这样的东西:

名称1.c

#include <string.h>
#include <stdio.h>

/* https://github.com/scottt/debugbreak */
#include <debugbreak/debugbreak.h>

struct T {
    char *name;
};

int main()
{
    struct T t, *p = &t;
    t.name = strdup("name1");
    debug_break();
    printf("%s\n", p->name);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输入名称.py

import gdb

gdb.execute('set python print-stack full')
gdb.execute('set confirm off')
gdb.execute('file name1')
gdb.execute('run')

name_in_program = gdb.parse_and_eval('p->name').string()
gdb.write('Please input name: ')
name = raw_input()
while name != name_in_program:
    gdb.write('Please try another name: ')
    name = raw_input()

gdb.execute('quit')
Run Code Online (Sandbox Code Playgroud)

示例会话:

$ gdb -q -x input-name.py

Program received signal SIGTRAP, Trace/breakpoint trap.
main () at name1.c:16
16      printf("%s\n", p->name);
Please input name: nameX
Please try another name: name1

$
Run Code Online (Sandbox Code Playgroud)

请注意,我通过debug_break()在我的 C 代码中插入了一条陷阱指令,从而采取了进入调试器的捷径。您可能希望改为设置断点。