我正在使用 RHEL 5.3 操作系统、gdb
7.5 和python
2.7。我正在用 Python 编写一个脚本来自动化一些 gdb 调试步骤。我们可以将以下命令(“name1”)的输出存储到变量中吗?
(gdb) p *(ptr->name)
$13 = "name1"
我想这样做是因为在我的 Python 脚本中,我会将这个 ( name1
) 与用户输入的字符串进行比较,如果匹配,则会执行一些操作,否则会要求用户输入另一个字符串。
如果不可能,请建议我替代方案。
我正在使用 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()的用途。我想你想要这样的东西:
名称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;
}
输入名称.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 代码中插入了一条陷阱指令,从而采取了闯入调试器的捷径。您可能想要设置一个断点。
编辑:对不起,表达有误。更正:
请参阅gdb 文档。
要设置便利变量,您可以使用以下表达式:
set $yourVar = (gdb) p *(ptr->name)
然后,您可以像这样访问新变量:
print $yourVar
输出将类似于以下内容:
(gdb) set $foo = "bar"
(gdb) print $foo
$1 = "bar"
(gdb)