Python GDB: Как перенаправить вывод команды GDB в переменную?
Я использую ОС RHEL 5.3, GDB 7.5 и Python 2.7. Я пишу скрипт на python для автоматизации некоторых шагов отладки GDB. Можем ли мы сохранить выходные данные следующей команды ("name1") в переменную?
(gdb) p *(ptr->name)
$ 13 = "name1"
Я хочу сделать это, потому что в моем скрипте Python я буду сравнивать это ("name1") со строкой пользовательского ввода, и, если совпадение, выполнит какое-то действие, в противном случае попросит пользователя ввести другую строку. Пожалуйста, предложите мне альтернативу, если это невозможно.
Благодарю.
2 ответа
Получение значения выражения в GDB - это то, для чего предназначена gdb.parse_and_eval(). Я думаю, что вы хотите что-то вроде этого:
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')
Пример сеанса:
$ 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 (). Возможно, вы захотите установить точку останова вместо этого.
Изменить: извините, ошибся с выражением. Исправление:
Смотрите документацию GDB.
Чтобы установить вспомогательную переменную, вы можете использовать это выражение: set $yourVar = (gdb) p *(ptr->name)
Затем вы можете получить доступ к вашей новой переменной следующим образом: print $yourVar
Вывод будет выглядеть примерно так:
(gdb) set $foo = "bar"
(gdb) print $foo
$1 = "bar"
(gdb)