0Pricing
C Academy · Урок

Чтение отчётов

Интерпретируйте вывод

«Чтение отчётов» — бесплатный урок C Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.

Строение отчёта

Отчёт Valgrind состоит из трёх частей:

  • префикс ID процесса в каждой строке
  • Один или несколько блоков ошибок по мере их возникновения
  • Итоговая сводка HEAP и LEAK при завершении

Умение читать каждую часть превращает стену текста в точный список задач.

Префикс PID

Каждая строка Valgrind начинается с ==PID==, например ==12345==.

Это ID процесса, а не часть вывода Вашей программы. Он позволяет отделить сообщения Valgrind от вывода программы через printf, когда оба вывода направляются в один терминал.

==12345== Memcheck, a memory error detector
==12345== Command: ./prog
==12345==

Пример блока ошибки

Вот настоящий блок с ошибкой записи:

==12345== Invalid write of size 4
==12345== at 0x4005A1: main (prog.c:6)
==12345== Address 0x520304c is 0 bytes after a block of size 20 alloc'd
==12345== at 0x4838B40: malloc
==12345== by 0x40058E: main (prog.c:5)

Прочитайте первую строку

В первой строке указаны вид и размер ошибки: 'Invalid write of size 4'.

Размер 4 означает доступ к 4 байтам, обычно к значению типа int. Уже эта строка сообщает, какую категорию ошибки следует искать, ещё до дальнейшего чтения отчёта.

Прочитайте трассировку стека

Строка at соответствует самому внутреннему кадру — месту возникновения ошибки. Каждая строка by содержит вызывающую функцию на уровень выше.

Читайте строки сверху вниз: от самого глубокого кадра к самому внешнему. Первый кадр с именем Вашего файла почти всегда указывает на место ошибки.

==12345==    at 0x4005A1: do_work (work.c:12)
==12345==    by 0x4006F0: main (main.c:8)

Прочитайте примечание об адресе

Строка Address ... указывает расположение доступа относительно известного блока:

  • 0 bytes after a block of size 20 alloc'd — переполнение сразу за концом блока
  • 4 bytes inside a block of size 4 free'd — использование после освобождения
  • on thread 1's stack — доступ к стеку

В ней также указано, где этот блок был выделен или освобождён.

Сводка HEAP

При завершении Вы получаете сведения о выделении памяти:

==12345== HEAP SUMMARY:
==12345== in use at exit: 20 bytes in 1 blocks
==12345== total heap usage: 3 allocs, 2 frees, 1,044 bytes allocated

Значение 'in use at exit' больше нуля означает, что что-то не было освобождено.

Сводка LEAK

Ниже сводки кучи утечки распределяются по категориям:

definitely lost: 20 bytes in 1 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 0 bytes in 0 blocks
still reachable: 0 bytes in 0 blocks

Добавьте --leak-check=full, чтобы прикрепить трассировку к каждому потерянному блоку.

Сводка ERROR

В самой последней строке подсчитывается всё:

ERROR SUMMARY: 2 errors from 2 contexts

«Контекст» — это уникальное место ошибки. Если строка с ошибкой выполняется в цикле миллион раз, это всё равно один контекст. Ваша цель — 0 errors from 0 contexts.

Порядок устранения ошибок

Работайте с отчётом методично:

  • Сначала исправьте ошибки недопустимого доступа — они вызывают повреждение данных
  • Затем исправьте ошибки неинициализированных значений
  • После этого устраните утечки с пометками definitely и indirectly lost
  • После каждого исправления запускайте программу снова: одна корневая причина часто устраняет сразу несколько сообщений

Подавление известных сообщений

Некоторые ошибки исходят из библиотек, которые Вы не можете исправить, например из среды выполнения C или графического драйвера. Создайте файл подавления, чтобы скрыть такие сообщения, не маскируя собственные ошибки.

--gen-suppressions=all выводит готовые записи подавления. Сохраните их и снова передайте с помощью --suppressions=file.

valgrind --gen-suppressions=all ./prog
valgrind --suppressions=mine.supp ./prog

Быстрая проверка

Интерпретируйте одну строку отчёта.

Итоги

Теперь Вы умеете читать отчёты Valgrind от начала до конца:

  • Префиксы ==PID== обозначают строки Valgrind и отделяют их от вывода программы
  • Каждый блок ошибки содержит её вид, размер, трассировку стека и примечание об адресе
  • Сводки HEAP/LEAK учитывают выделенную и потерянную память
  • Сводка ERROR подсчитывает уникальные контексты; стремитесь к нулю

Сначала устраняйте ошибки доступа, затем утечки, повторно запуская программу после каждого изменения.

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

Урок «Чтение отчётов» бесплатный?

Да — полный текст урока «Чтение отчётов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.

Чему я научусь в уроке «Чтение отчётов»?

Интерпретируйте вывод Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C Academy?

Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Чтение отчётов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C Academy?

Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужен Valgrind
  2. Обнаружение утечек
  3. Недопустимый доступ
  4. Чтение отчётов
← Назад к C Academy