gdb python: как перенаправить вывод команды gdb в переменную?

Я использую ОС RHEL 5.3, gdb 7.5 и python 2.7. Я пишу скрипт на python для автоматизации некоторых шагов отладки gdb. Можем ли мы сохранить вывод следующей команды («name1») в переменную?

(gdb) p *(ptr->name)

$13 = "имя1"

Я хочу сделать это, потому что в моем скрипте python я сравню это («name1») со строкой ввода пользователя, и, если совпадение, выполнит какое-то действие, в противном случае попрошу пользователя ввести другую строку. Пожалуйста, предложите мне альтернативу, если это невозможно.

Спасибо.


person Baijnath Jaiswal    schedule 22.05.2013    source источник
comment
Хорошо, может быть, я ошибся. Вы хотите, чтобы gdb возвращал значение скрипту? Мой ответ присваивает значение только переменной gdb.   -  person Max Leske    schedule 22.05.2013


Ответы (2)


Получение значения выражения в 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

$

Обратите внимание, что я воспользовался упрощенным способом взлома отладчика, вставив инструкцию ловушки в свой код C с помощью debug_break(). Вместо этого вы, вероятно, захотите установить точку останова.

person scottt    schedule 22.05.2013
comment
Большое спасибо. Ты всегда все делаешь очень красиво. Большой..:-) - person Baijnath Jaiswal; 23.05.2013

Редактировать: извините, ошибся с выражением. Исправление:

См. документацию gdb.

Чтобы установить переменную удобства, вы можете использовать это выражение:
set $yourVar = (gdb) p *(ptr->name)

Затем вы можете получить доступ к своей новой переменной следующим образом:
print $yourVar

Вывод будет выглядеть примерно так:

(gdb) set $foo = "bar"
(gdb) print $foo
$1 = "bar"
(gdb) 
person Max Leske    schedule 22.05.2013
comment
Леске, можешь аргументировать свой ответ? Как это будет выполняться внутри командной строки gdb? - person Baijnath Jaiswal; 22.05.2013