“Не беспокойтесь, если что-то не функционирует правильно. Если бы все работало, вы были бы без работы.”
Неизвестный
Никита Манович (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 [аргументы] - удобный способ запуска программы с точкой останова на первой строчке функции mainattach <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 <файл> - сгенерировать дамп памяти исследуемого процесса
Вопросы?