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

时间:2013-05-22 17:04:37

标签: python gdb gdb-python

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

(gdb) p *(ptr->name)

$ 13 =“name1”

我想这样做,因为在我的python脚本中,我会将此(“name1”)与用户输入字符串进行比较,如果匹配,则会执行某些操作,否则请求用户输入另一个字符串。 如果不可能,请建议我替代。

感谢。

2 个答案:

答案 0 :(得分:3)

在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("%s\n", 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("%s\n", p->name);
Please input name: nameX
Please try another name: name1

$

请注意,我通过 debug_break()在我的C代码中插入陷阱指令,采用了进入调试器的快捷方式。您可能想要设置断点。

答案 1 :(得分:-1)

编辑:抱歉,表达式出错了。更正:

请参阅gdb documentation

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

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

输出看起来类似于:

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