GDB учебник
Начало работы с GDB
Поиск…
замечания
GDB (отладчик проекта GNU) - это отладчик базы данных командной строки, который хорошо анализирует запущенные и выпущенные программы. Согласно руководству пользователя GDB поддерживает C, C ++, D, Go, Objective-C, Fortran, Java, OpenCL C, Pascal, Rust, assembly, Modula-2 и Ada.
GDB имеет тот же набор функций, что и большинство отладчиков, но отличается от большинства, которые я использовал в этом, и все они основаны на наборе команд вместо нажатия на элементы GUI. Некоторые из этих функций включают:
- Настройка точек останова
- Печать значения переменных.
- Установка значения переменных для проверки.
- Просмотр стека
Что такое GDB?
GDB, сокращение от GNU Debugger, является самым популярным отладчиком для систем UNIX для отладки программ на C и C ++. GNU Debugger, который также называется gdb, является самым популярным отладчиком для UNIX-систем для отладки программ на C и C ++.
GNU Debugger поможет вам получить информацию о следующем:
Если произошел сбой ядра, то какое заявление или выражение запустило программу?
Если во время выполнения функции возникает ошибка, какая строка
программа содержит вызов этой функции, и каковы
параметры?Каковы значения переменных программы в определенной точке во время выполнения программы?
Что является результатом определенного выражения в программе?
Запуск GDB
Чтобы запустить GDB, в терминале,
gdb <executable name>
Для вышеприведенного примера с программой с именем main команда становится
gdb main
Настройка точек останова
Вероятно, вы захотите, чтобы программа остановилась в какой-то момент, чтобы вы могли просмотреть состояние своей программы. Линия, на которой вы хотите временно остановить программу, называется точкой останова.
break <source code line number>
Запуск вашей программы
Чтобы запустить вашу программу, команда, как вы догадались,
run
Открытие ядра
gdb -c coreFile pathToExecutable
Работа с основным файлом
Создал эту очень плохую программу
#include <stdio.h>
#include <ctype.h>
// forward declarations
void bad_function()
{
int *test = 5;
free(test);
}
int main(int argc, char *argv[])
{
bad_function();
return 0;
}
gcc -g ex1.c
./a.out //or whatever gcc creates
Segmentation fault (core dumped)
gdb -c core a.out
Core was generated by `./a.out'.
Программа завершена сигналом SIGSEGV, Ошибка сегментации. # 0 __GI___libc_free (mem = 0x5) в malloc.c: 2929 2929 malloc.c: Нет такого файла или каталога.
(gdb) where
# 0 __GI___libc_free (mem = 0x5) в файле malloc.c: 2929 # 1 0x0000000000400549 в bad_function () в ex1.c: 12 # 2 0x0000000000400564 в main (argc = 1, argv = 0x7fffb825bd68) в ex1.c: 19
Поскольку я скомпилирован с помощью -g, вы можете видеть, что вызов, где говорит мне, что ему не нравится код в строке 12 bad_function ()
Затем я могу проверить тестовую переменную, которую я пытался освободить
(gdb) up
# 1 0x0000000000400549 в bad_function () в ex1.c: 12 12 бесплатно (тест);
(gdb) print test
$ 1 = (int *) 0x5
(gdb) print *test
Не удается получить доступ к памяти по адресу 0x5
В этом случае ошибка довольно очевидна. Я попытался освободить указатель, которому был назначен только адрес 5, который не был создан malloc, поэтому свободный не имеет понятия, что с ним делать.