Каковы наилучшие способы, чтобы автоматизировать сеанса отладки с помощью GDB?
есть ли у GDB встроенный механизм сценариев, должен ли я кодировать сценарий expect, или есть еще лучшее решение?
Я буду отправлять одну и ту же последовательность команд каждый раз, и я буду сохранять вывод каждой команды в файл (скорее всего, используя встроенный механизм ведения журнала GDB, если у кого-то нет лучшей идеи).
3 ответов:
gdbвыполняет file.gdbinitпосле запуска. Так что вы можете добавить свои команды в этот файл и посмотреть, если это нормально для вас. Это пример.gdbinitдля того, чтобы напечатать backtrace для всехf()вызовы:set pagination off set logging file gdb.txt set logging on file a.out b f commands bt continue end info breakpoints r set logging off quit
я просто проходил через что - то подобное, и придумал основной пример-и зная, что скоро забуду об этом, я подумал, что лучше опубликовать его
:)поэтому я опубликую его здесь,поскольку это похоже на вопрос.в принципе, в этом примере я хотел получить некоторые значения переменных в определенных местах кода; и они выводятся до тех пор, пока программа не выйдет из строя. Итак, вот первая небольшая программа, которая гарантированно аварии в нескольких шагах,
test.c:#include <stdio.h> #include <stdlib.h> int icount = 1; // default value main(int argc, char *argv[]) { int i; if (argc == 2) { icount = atoi(argv[1]); } i = icount; while (i > -1) { int b = 5 / i; printf(" 5 / %d = %d \n", i, b ); i = i - 1; } printf("Finished\n"); return 0; }единственная причина, по которой программа принимает аргументы командной строки,-это возможность выбрать количество шагов до сбоя - и показать, что
gdbигнорировать--argsв пакетном режиме. Это я компилирую с:gcc -g test.c -o test.exeзатем я готовлю следующий скрипт - главный трюк здесь-назначить
commandдля каждогоbreakpoint, которая в конечном итогеcontinue(см. Также Automate gdb: показывать обратную трассировку при каждом вызове функции puts). Этот скрипт я называюtest.gdb:# http://sourceware.org/gdb/wiki/FAQ: to disable the # "---Type <return> to continue, or q <return> to quit---" # in batch mode: set width 0 set height 0 set verbose off # at entry point - cmd1 b main commands 1 print argc continue end # printf line - cmd2 b test.c:17 commands 2 p i p b continue end # int b = line - cmd3 b test.c:16 commands 3 p i p b continue end # show arguments for program show args printf "Note, however: in batch mode, arguments will be ignored!\n" # note: even if arguments are shown; # must specify cmdline arg for "run" # when running in batch mode! (then they are ignored) # below, we specify command line argument "2": run 2 # run #start # alternative to run: runs to main, and stops #continueобратите внимание, что если вы собираетесь использовать его в пакетном режиме, вам нужно "запустить" скрипт в конце, с
runилиstartили что-то подобное.С этим скриптом на месте, я могу позвонить
gdbв пакетном режиме-который будет генерировать следующие выходные данные в терминале:$ gdb --batch --command=test.gdb --args ./test.exe 5 Breakpoint 1 at 0x804844d: file test.c, line 10. Breakpoint 2 at 0x8048485: file test.c, line 17. Breakpoint 3 at 0x8048473: file test.c, line 16. Argument list to give program being debugged when it is started is "5". Note, however: in batch mode, arguments will be ignored! Breakpoint 1, main (argc=2, argv=0xbffff424) at test.c:10 10 if (argc == 2) { = 2 Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16 16 int b = 5 / i; = 2 = 134513899 Breakpoint 2, main (argc=2, argv=0xbffff424) at test.c:17 17 printf(" 5 / %d = %d \n", i, b ); = 2 = 2 5 / 2 = 2 Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16 16 int b = 5 / i; = 1 = 2 Breakpoint 2, main (argc=2, argv=0xbffff424) at test.c:17 17 printf(" 5 / %d = %d \n", i, b ); = 1 = 5 5 / 1 = 5 Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16 16 int b = 5 / i; = 0 = 5 Program received signal SIGFPE, Arithmetic exception. 0x0804847d in main (argc=2, argv=0xbffff424) at test.c:16 16 int b = 5 / i;обратите внимание, что, хотя мы указываем аргумент командной строки 5, цикл все еще вращается только два раза (как и спецификация
runвgdbсценарий); еслиrunне было никаких аргументов, он вращается только один раз (по умолчанию программы), подтверждающие, что--args ./test.exe 5игнорируется.однако, поскольку теперь это выводится в одном вызове и без какого-либо взаимодействия с пользователем, вывод командной строки можно легко захватить в текстовый файл с помощью
bashперенаправление, сказать:gdb --batch --command=test.gdb --args ./test.exe 5 > out.txtсуществует также пример использования python для автоматизации gdb в шагать c - GDB автоматический-автоматический распечатка строк, в то время как свободный ход?
надеюсь, это поможет,
Ура!
Если a-x с файлом слишком много для вас, просто используйте multiple-ex. это пример для отслеживания запущенной программы, показывающей (и сохраняющей) обратную трассировку при сбоях
sudo gdb -p $(pidof my-app) -batch \ -ex "set logging on" \ -ex continue \ -ex "bt full" \ -ex quit
Comments