質問

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