Linux

Отладка C-кода на Linux: руководство по GDB, Valgrind и ASan

В этом руководстве вы узнаете, как настроить среду разработки для отладки C-кода на Linux, запускать программу с отладочными символами, использовать GDB для пошагового выполнения и просмотра данных, а также применять Valgrind и AddressSanitizer для обнаружения ошибок памяти.

Обновлено 31 июля 2026 г.
10-15 мин
Средняя
FixPedia Team
Применимо к:gcc 11+, clang 14+Ubuntu 22.04, Debian 12, Fedora 38

Введение

Отладка C-программ на Linux может показаться сложной, но правильные инструменты и методика значительно ускоряют поиск и устранение ошибок. В этом руководстве вы научитесь настраивать среду разработки, запускать программу с отладочными символами, использовать GDB для пошагового выполнения и просмотра данных, а также применять Valgrind и AddressSanitizer для обнаружения ошибок памяти и процессных проблем. После выполнения этих шагов вы сможете быстро выявлять утечки, ошибки сегментации и логические ошибки в своем коде.

Требования / Подготовка

  • Компиляторы и отладочные инструменты
    • GCC версии 11 или выше (или clang 14+ для ASan).
    • GDB (GNU Debugger).
    • Valgrind для анализа памяти.
    • Необязательно: clang+llvm для более удобного ASan.
  • Права доступа – для установки пакетов требуется sudo.
  • Версии ОС – руководство протестировано на Ubuntu 22.04, Debian 12 и Fedora 38.
  • Предварительно написанный код – простая C-программа, например, с использованием динамического выделения памяти, для демонстрации отладки.

Пошаговая инструкция

Шаг 1: Установите необходимые инструменты

Убедитесь, что установлены все необходимые инструменты. На Ubuntu/Debian выполните:

sudo apt update
sudo apt install build-essential gdb valgrind clang

На Fedora:

sudo dnf groupinstall "Development Tools"
sudo dnf install gdb valgrind clang-tools-extra

Шаг 2: Скомпилируйте программу с отладочными символами

Для эффективной отладки программа должна содержать отладочную информацию и не содержать оптимизацию. Используйте следующие команды:

gcc -g -O0 main.c -o program
  • -g добавляет отладочные символы.
  • -O0 отключает оптимизацию, что упрощает сопоставление строк кода с исходным файлом.

Шаг 3: Запустите программу под GDB

Запустите GDB и установите точку останова на главной функции:

gdb ./program
(gdb) break main
(gdb) run

Программа остановится на первой строке main. Теперь вы можете исследовать состояние программы.

Шаг 4: Осмотрите состояние программы в GDB

Просмотрите значения переменных:

(gdb) print myVar
(gdb) p &myVar      # адрес в памяти

Перейдите к следующей строке кода:

(gdb) next          # выполнить одну строку, не входя в функции
(gdb) step          # выполнить шаг с входом в функции

Для вывода нескольких переменных одновременно используйте info locals. Если вам нужны более подробные данные, выполните display /x $pc для просмотра текущего адреса.

Шаг 5: Проверьте утечки памяти с помощью Valgrind или AddressSanitizer

Valgrind — это полный инструмент для анализа памяти, который обнаруживает утечки, ошибки доступа и т. д.:

valgrind ./program

Вывод Valgrind укажет номер строки и функцию, где возникает проблема.

AddressSanitizer (ASan) — это быстрая проверка, которая добавляется во время компиляции:

gcc -g -fsanitize=address -O1 main.c -o program
./program

ASan выводит сообщения прямо в stderr и часто быстрее Valgrind при быстром тестировании.

Проверка результата

После отладки убедитесь, что все ошибки устранены:

  • Core‑дампы – если программа упала с сигналом, проверьте наличие файла core в текущей директории (ls core.*). Это полезно для последующего анализа в GDB (gdb ./program core).
  • Valgrind/ASan отчеты – убедитесь, что список обнаруженных проблем пуст (нет сообщений об утечках или недопустимых доступах).
  • Функциональность – запустите программу с различными входными данными, чтобы убедиться, что поведение теперь соответствует ожиданиям.

Возможные проблемы

  • Отсутствие отладочной информации – если GDB не может найти символы, вероятно, программа была скомпилирована без флага -g. Перекомпилируйте с использованием gcc -g -O0.
  • Core‑дампы не создаются – установите soft limit с помощью ulimit -c unlimited перед запуском программы. На некоторых системах требуется изменить /proc/sys/kernel/core_pattern.
  • Valgrind работает медленно – для больших программ Valgrind может быть слишком медленным. В этом случае используйте ASan для быстрой проверки и Valgrind только для конкретных тестовых случаев.
  • Ложные срабатывания ASan – иногда false‑positive сообщения возникают из-за использования неинициализированных указателей. Проверьте, инициализированы ли указатели перед использованием.

Следуя этому руководству, вы сможете быстро находить и исправлять ошибки в C-программах на Linux, используя стандартный набор инструментов. Удачной отладки!

Часто задаваемые вопросы

Как скомпилировать C-программу с отладочными символами?
Что делать, если программа падает с ошибкой сегментации?
Как установить точку останова и просмотреть переменные в GDB?
Как включить генерацию core‑дампов?

Полезное

Установите необходимые инструменты
Скомпилируйте программу с отладочными символами
Запустите программу под GDB
Осмотрите состояние программы в GDB
Проверьте утечки памяти с помощью Valgrind или AddressSanitizer

Эта статья помогла вам решить проблему?