Чтение отчётов
Интерпретируйте вывод
«Чтение отчётов» — бесплатный урок 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 blocksindirectly lost: 0 bytes in 0 blockspossibly lost: 0 bytes in 0 blocksstill 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 — локальная установка не требуется.