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



我使用RHEL 5.3操作系统,gdb 7.5和python 2.7。我正在用Python编写一个脚本来自动执行一些gdb调试步骤。我们可以将以下命令("name1")的输出存储到一个变量中吗?

(gdb) p *(ptr->name)
$13 = "name1"

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

获取GDB中表达式的值是 GDB .parse_and_eval()的作用。我想你应该是这样的:

name1.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("%sn", p->name);
    return 0;
}

input-name.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')

样本会话:

$ gdb -q -x input-name.py
Program received signal SIGTRAP, Trace/breakpoint trap.
main () at name1.c:16
16      printf("%sn", p->name);
Please input name: nameX
Please try another name: name1
$

注意,我通过debug_break()在我的C代码中插入一个陷阱指令,采取了进入调试器的捷径。您可能需要设置一个断点。

编辑:对不起,表达有误。更正:

查看gdb文档

要设置方便变量,可以使用以下表达式:
set $yourVar = (gdb) p *(ptr->name)

然后你可以像这样访问你的新变量:
print $yourVar

输出如下所示:

(gdb) set $foo = "bar"
(gdb) print $foo
$1 = "bar"
(gdb) 

最新更新