“Не беспокойтесь, если что-то не функционирует правильно. Если бы все работало, вы были бы без работы.”
Неизвестный
Никита Манович (Itseez)
2013
Примеры:
Breakpoint (точка останова) - это преднамеренное прерывание выполнения программы, при котором выполняется вызов отладчика.
Какие бывают точки останова?
Примеры команд для GDB: break, rbreak, tbreak
Watchpoint - точка останова по данным. Срабатывает, когда меняется значение заданного выражения или переменной.
Примеры команд для GDB: watch, rwatch, awatch
Checkpoint - снимок состояния программы.
Плюсы:
Минусы:
Catchpoint - специальная точка останова, которая срабатывает при достижении специального события, например, C++ исключения или загрузки библиотеки.
Примеры команд для GDB: catch throw, catch catch, catch syscall, catch load.
Call stack (стек вызовов) - хранит информацию об активных процедурах и функциях.
Наиболее популярный GDB GUI - это DDD Стабильный выпуск: 30 августа, 2013: GDB 7.6.1 Сайт: http://www.gnu.org/software/gdb
Полезные опции для GCC компилятора:
-g<level>
- отладочная информация в нативном формате для операционной системы
-ggdb<level>
- информация в формате GDB-O0
- отключение всех оптимизаций компилятора-fno-omit-frame-pointer
- использовать указатель на фрейм$ gdb --args <программа с аргументами>
$ gdb <программа> [<pid>] [<core-файл>]
r, run [аргументы]
- запуск программы под GDBstart [аргументы]
- удобный способ запуска программы с точкой останова на первой строчке функции main
attach <pid> / detach
- отладка уже запущенного процессаcontinue, c, fg
- возобновление исполнения программыs, step [count]
- продолжить исполнение до следующей строчки исходного кодаn, next [count]
- продолжить исполнение до следующей строчки исходного кода в текущем фреймеni, nexti, si, stepi [count]
- так же как next
и step
, но для инструкцииfin, finish
- продолжить исполнение до тех пор, пока текущая функция не завершитсяu, until [location]
- продолжить исполнение до тех пор, пока не достигнута следующая строчкаbt, backtrace [full] [n]
- напечатать стек вызововframe [n]
- навигация по текущему стеку вызововinfo frame
- вывести подробную информацию о текущем стековом фреймеinfo args
- вывести аргументы для текущего фреймаinfo locals
- вывести локальные переменные для текущего фреймаprint [/fmt] <expr>
- показать значение выражения
print *address@<len>
- показать массивdisplay [/fmt] <expr>
- показывать каждый разdelete/disable/enable display <id>
- управлять списком для отображения данныхinfo display
- вывести список выражений для отображенияinfo <registers | all-registers>
- показать регистрыl, list [linenum | function | - | +]
- показать кодforward-search, search regexp
- искать в прямом направлении в текущем файлеreverse-search regexp
- искать в обратном направлении в текущем файлеdir, directory <dirname>
- добавить директории для поиска файловset substitute-path <to> <from>
- определить подстановочное правило для директорииdisassemble [/m | /r] [start,+length]
- показать диапазон памяти, как инструкции процессораrecord [full]
- начать процесс записиrecord stop
- остановить процесс записиreverse-continue, reverse-step, reverse-next, reverse-nexti,
reverse-stepi, reverse-finish
- команды для обратного исполнения программыcheckpoint
- сделать снимок состояния программыrestart <checkpoint-id>
- восстановить состояниеinfo checkpoints
- информация о всех checkpointsdelete checkpoint <id>
- удалить checkpointgdb -tui
и C-x C-a сочетание клавишlayout <prev | next | asm | src | split | regs>
focus <prev | next | asm | src | split | regs | cmd>
refresh
(или C-L сочетание клавиш)commands <n>
установить команды для точек останова$ ulimit -a
core file size (blocks, -c) unlimited ...
$ ulimit -c unlimited
$ gdb <program> <core>
Полезные команды GDB:
gcore, generate-core-file <файл>
- сгенерировать дамп памяти исследуемого процесса
Вопросы?