- 1 курс
- 2 курс
- 3 курс
- 4 курс
- 5 курс
- 6 курс
Old
Old
This is an old revision of the document!
Идея – программы часто не работают так, как того хочет программист. Какие ошибки сложнее всего искать?
Есть несколько техник, как искать подобные ошибки.
Простой пример отладочных выводов “на коленке” (более подробно этот вопрос рассматривается в статье Logging with GCC):
#include <stdio.h> #define DEBUG int main(){ #ifdef DEBUG fprintf(stderr, "DEBUG: %s:%s:%d: %s\n", __FILE__, __func__, __LINE__, "Debug message"); #endif return 0; }
GDB имеет достаточно простой, но мощный командный интерфейс и хорошую справку по нему. Пример:
#include <stdio.h> #include <stdarg.h> void get_int(int* val) { val = NULL; printf("%d\n", *val); } int main() { printf("Hello!"); int* a; get_int(a); return 0; }
При запуске данной программы появляется ошибка segmentation fault, т.е попытка доступа к несуществующей/чужой памяти. Что можно сделать что её найти:
Для этого необходимо:
gcc -g myprog.c
gdb ./a.out
(gdb) run
(gdb) run < input_file.txt
Вывод для программы после команды run будет следующий:
(gdb) run Starting program: /a.out Program received signal SIGSEGV, Segmentation fault. 0x0000555555555165 in get_int (val=0x0) at main.c:6 6 printf("%d\n", *val);
Теперь вы можете изучить состояние программы, например:
Написать
(gdb) where
и получить подробный стектрейс, чтобы узнать в каком файле и функции произошла ошибка:
(gdb) where #0 0x0000555555555165 in get_int (val=0x0) at main.c:6 #1 0x00005555555551ac in main () at main.c:13
Изучить состояние переменных с помощью команды “p <variable_name>”
(gdb) p val $1 = (int *) 0x0
Полезные ссылки:
Любая среда разработки или даже мощный текстовый редактор обычно предоставляют вам графический интерфейс для использования gdb при отладке своих программ. Обычно он достаточно наглядный и имеет хорошее описание для каждой IDE.
Вы можете самостоятельно найти описание использования отладчика в вашей любимой IDE. Для CLion можно посмотреть эти источники: