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, в терминале,

gdb <executable name>
 

Для вышеприведенного примера с программой с именем main команда становится

gdb main
 

Настройка точек останова

Вероятно, вы захотите, чтобы программа остановилась в какой-то момент, чтобы вы могли просмотреть состояние своей программы. Линия, на которой вы хотите временно остановить программу, называется точкой останова.

break <source code line number>
 

Запуск вашей программы

Чтобы запустить вашу программу, команда, как вы догадались,

run
 

Открытие ядра

gdb -c coreFile pathToExecutable  
 

Что такое GDB?

GDB, сокращение от GNU Debugger, является самым популярным отладчиком для систем UNIX для отладки программ на C и C ++. GNU Debugger, который также называется gdb, является самым популярным отладчиком для UNIX-систем для отладки программ на C и C ++.

GNU Debugger поможет вам получить информацию о следующем:

  • Если произошел сбой ядра, то какое заявление или выражение запустило программу?

  • Если во время выполнения функции возникает ошибка, какая строка
    программа содержит вызов этой функции, и каковы
    параметры?

  • Каковы значения переменных программы в определенной точке во время выполнения программы?

  • Что является результатом определенного выражения в программе?

Работа с основным файлом

Создал эту очень плохую программу

 #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, поэтому свободный не имеет понятия, что с ним делать.