C Language
Valgrind
Поиск…
Синтаксис
- имя-программы Valgrind необязательные-аргументы <тест вход
замечания
Valgrind - это инструмент отладки, который можно использовать для диагностики ошибок управления памятью в программах на языке C. Valgrind может использоваться для обнаружения ошибок, таких как использование недопустимого указателя, включая запись или чтение за выделенным пространством или неправильный вызов функции free()
. Он также может использоваться для улучшения приложений посредством функций, которые выполняют профилирование памяти.
Для получения дополнительной информации см. Http://valgrind.org .
Запуск Valgrind
valgrind ./my-program arg1 arg2 < test-input
Это запустит вашу программу и опубликует отчет о любых распределениях и отчислениях, которые она сделала. Он также предупредит вас об общих ошибках, таких как использование неинициализированной памяти, указатели разыменования в странные места, списание конца блоков, выделенных с помощью malloc, или отказ от свободных блоков.
Добавление флагов
Вы также можете включить дополнительные тесты, такие как:
valgrind -q --tool=memcheck --leak-check=yes ./my-program arg1 arg2 < test-input
См. Valgrind --help для получения дополнительной информации о (многих) вариантах или просмотрите документацию по адресу http://valgrind.org/ для получения подробной информации о том, что означает выход.
Bytes lost - Забыв бесплатно
Вот программа, которая вызывает malloc, но не бесплатную:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *s;
s = malloc(26); // the culprint
return 0;
}
Без дополнительных аргументов valgrind не будет искать эту ошибку.
Но если мы --leak-check=yes
или --tool=memcheck
, он будет жаловаться и отображать строки, отвечающие за эти утечки памяти, если программа была скомпилирована в режиме отладки:
$ valgrind -q --leak-check=yes ./missing_free
==4776== 26 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4776== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==4776== by 0x80483F8: main (missing_free.c:9)
==4776==
Если программа не скомпилирована в режиме отладки (например, с флагом -g
в GCC), она все равно покажет нам, где утечка произошла с точки зрения соответствующей функции, но не для строк.
Это позволяет нам вернуться и посмотреть, какой блок был выделен в этой строке, и попытаться проследить вперед, чтобы понять, почему он не был освобожден.
Наиболее часто встречающиеся ошибки при использовании Valgrind
Valgrind предоставляет вам строки, в которых произошла ошибка в конце каждой строки в формате (file.c:line_no)
. Ошибки в valgrind суммируются следующим образом:
ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Наиболее распространенные ошибки:
- Незаконные ошибки чтения / записи
==8451== Invalid read of size 2
==8451== at 0x4E7381D: getenv (getenv.c:84)
==8451== by 0x4EB1559: __libc_message (libc_fatal.c:80)
==8451== by 0x4F5256B: __fortify_fail (fortify_fail.c:37)
==8451== by 0x4F5250F: __stack_chk_fail (stack_chk_fail.c:28)
==8451== by 0x40059C: main (valg.c:10)
==8451== Address 0x700000007 is not stack'd, malloc'd or (recently) free'd
Это происходит, когда код начинает получать доступ к памяти, которая не принадлежит программе. Размер доступной памяти также дает вам представление о том, какая переменная была использована.
- Использование неинициализированных переменных
==8795== 1 errors in context 5 of 8:
==8795== Conditional jump or move depends on uninitialised value(s)
==8795== at 0x4E881AF: vfprintf (vfprintf.c:1631)
==8795== by 0x4E8F898: printf (printf.c:33)
==8795== by 0x400548: main (valg.c:7)
Согласно ошибке, в строке 7 main
of valg.c
вызов printf()
передал неинициализированную переменную printf
.
- Незаконное освобождение памяти
==8954== Invalid free() / delete / delete[] / realloc()
==8954== at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954== by 0x4005A8: main (valg.c:10)
==8954== Address 0x5203040 is 0 bytes inside a block of size 240 free'd
==8954== at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954== by 0x40059C: main (valg.c:9)
==8954== Block was alloc'd at
==8954== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8954== by 0x40058C: main (valg.c:7)
Согласно valgrind, код освободил память незаконно (второй раз) в строке 10 valg.c
, тогда как она уже была освобождена в строке 9 , а сам блок был выделен памятью в строке 7 .