Компиляция и отладка программ на языке C
На этом этапе вы научитесь важнейшим техникам компиляции и отладки программ на языке C, включая понимание предупреждений компилятора, использование флагов компиляции и базовые стратегии отладки.
Создание программы с преднамеренными ошибками
- Откройте WebIDE и создайте новый файл с именем
debug.c
.
- Введите следующий код с некоторыми преднамеренными ошибками:
#include <stdio.h>
int main() {
int x = 10;
int y = 0;
// Intentional division by zero
int result = x / y;
printf("Result: %d\n", result);
// Unused variable
int z = 5;
return 0;
}
Компиляция с выводом предупреждений
Скомпилируйте программу с дополнительными флагами предупреждений:
gcc -Wall -Wextra debug.c -o debug
Пояснение флагов компиляции
-Wall
: Включает большинство сообщений о предупреждениях
-Wextra
: Включает еще более детальные предупреждения
Пример вывода компилятора:
debug.c: In function ‘main’:
debug.c:13:9: warning: unused variable ‘z’ [-Wunused-variable]
13 | int z = 5;
| ^
Использование GDB для отладки
Скомпилируйте программу с символами отладки:
gcc -g debug.c -o debug
Запустите отладку:
gdb./debug
Команды GDB:
run
: Запустить программу
break main
: Установить точку останова в функции main
print x
: Вывести значение переменной x
next
: Выполнить следующую строку
quit
: Выйти из GDB
(gdb) run
Starting program: /home/labex/project/debug
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGFPE, Arithmetic exception.
0x0000555555555167 in main () at debug.c:8
8 int result = x / y;
(gdb) print x
$1 = 10
(gdb) break main
Breakpoint 1 at 0x555555555155: file debug.c, line 4.
(gdb) next
Program terminated with signal SIGFPE, Arithmetic exception.
The program no longer exists.
(gdb) quit
GDB показывает ошибку деления на ноль в строке 8. Программа завершается аварийно из - за арифметического исключения.
Исправление программы
Измените файл debug.c
, чтобы безопасно обрабатывать деление:
#include <stdio.h>
int main() {
int x = 10;
int y = 2; // Change from 0 to a non-zero value
if (y!= 0) {
int result = x / y;
printf("Result: %d\n", result);
} else {
printf("Error: Division by zero!\n");
}
return 0;
}
Перекомпилируйте и запустите программу:
gcc -Wall -Wextra debug.c -o debug
./debug
Вывод:
Result: 5
Советы по устранению неполадок:
- Всегда компилируйте программу с флагами
-Wall -Wextra
- Уделяйте внимание предупреждениям компилятора
- Используйте GDB для сложных сценариев отладки
- Добавляйте проверку ошибок для потенциальных проблем во время выполнения программы