I am using RHEL 5.3 OS, gdb 7.5 and python 2.7. I am writing a script in Python to automate some gdb debugging steps. Can we store the output of the following command ("name1") into a variable?

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

I want to do this because in my Python script I will compare this (name1) to a user input string, and if matches, will do some action otherwise ask user to input another string.

Please Suggest me alternative if it is not possible.

有帮助吗?

解决方案

Getting the value of an expression in GDB is what gdb.parse_and_eval() is for. I think you want something like this:

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')

Sample session:

$ 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

$

Note that I took the shortcut of breaking into the debugger by inserting a trap instruction in my C code via debug_break(). You'd probably want to set a breakpoint instead.

其他提示

Edit: sorry, made a mistake with the expression. Correction:

See the gdb documentation.

To set a convenience variable you can use this expression:
set $yourVar = (gdb) p *(ptr->name)

You can then access your new variable like so:
print $yourVar

The output will look similar to this:

(gdb) set $foo = "bar"
(gdb) print $foo
$1 = "bar"
(gdb) 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top