3

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.

galoget
  • 722
  • 9
  • 15
Baijnath Jaiswal
  • 377
  • 5
  • 17
  • Ok, so maybe I got it wrong. Do you want gdb to return the value to the script? My answer assigns the value do a gdb variable only. – Max Leske May 22 '13 at 18:08

2 Answers2

5

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.

scottt
  • 7,008
  • 27
  • 37
-1

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) 
Max Leske
  • 5,007
  • 6
  • 42
  • 54