Каковы наилучшие способы, чтобы автоматизировать сеанса отладки с помощью GDB?



есть ли у GDB встроенный механизм сценариев, должен ли я кодировать сценарий expect, или есть еще лучшее решение?



Я буду отправлять одну и ту же последовательность команд каждый раз, и я буду сохранять вывод каждой команды в файл (скорее всего, используя встроенный механизм ведения журнала GDB, если у кого-то нет лучшей идеи).

635   3  

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

    Ничего не найдено.