Поиск…


Синтаксис

  • имя-программы 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)

Наиболее распространенные ошибки:

  1. Незаконные ошибки чтения / записи
==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

Это происходит, когда код начинает получать доступ к памяти, которая не принадлежит программе. Размер доступной памяти также дает вам представление о том, какая переменная была использована.

  1. Использование неинициализированных переменных
==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 .

  1. Незаконное освобождение памяти
==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 .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow