Szukaj…


Składnia

  • valgrind nazwa-programu opcjonalne-argumenty < wejście testowe

Uwagi

Valgrind to narzędzie do debugowania, którego można używać do diagnozowania błędów związanych z zarządzaniem pamięcią w programach C. Valgrind może być wykorzystywany do wykrywania błędów, takich jak nieprawidłowe użycie wskaźnika, w tym zapisywanie lub czytanie poza przydzielone miejsce lub wykonywanie nieprawidłowego wywołania funkcji free() . Może być również wykorzystywany do ulepszania aplikacji dzięki funkcjom profilowania pamięci.

Aby uzyskać więcej informacji, zobacz http://valgrind.org .

Uruchamianie Valgrind

valgrind ./my-program arg1 arg2 < test-input

Spowoduje to uruchomienie programu i wygenerowanie raportu o wszelkich dokonanych przydziałach i przydziałach. Ostrzeże Cię również o typowych błędach, takich jak używanie niezainicjowanej pamięci, dereferencje wskaźników do dziwnych miejsc, odpisywanie końca bloków przydzielonych za pomocą malloc lub brak zwolnienia bloków.

Dodawanie flag

Możesz także włączyć więcej testów, takich jak:

valgrind -q --tool=memcheck --leak-check=yes ./my-program arg1 arg2 < test-input

Zobacz valgrind --help, aby uzyskać więcej informacji o (wielu) opcjach, lub zapoznaj się z dokumentacją na http://valgrind.org/, aby uzyskać szczegółowe informacje o tym, co oznacza wyjście.

Utracone bajty - zapomnienie o uwolnieniu

Oto program, który wywołuje Malloc, ale nie jest bezpłatny:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    char *s;

    s = malloc(26); // the culprint 

    return 0;
}

Bez dodatkowych argumentów valgrind nie będzie szukał tego błędu.

Ale jeśli --leak-check=yes lub --tool=memcheck , narzeka i wyświetli linie odpowiedzialne za te wycieki pamięci, jeśli program został skompilowany w trybie debugowania:

$ 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== 

Jeśli program nie zostanie skompilowany w trybie debugowania (na przykład z flagą -g w GCC), nadal pokaże nam, gdzie nastąpił przeciek pod względem odpowiedniej funkcji, ale nie wiersze.

To pozwala nam cofnąć się i zobaczyć, który blok został przydzielony w tym wierszu i spróbować prześledzić naprzód, aby zobaczyć, dlaczego nie został zwolniony.

Najczęstsze błędy napotkane podczas korzystania z Valgrind

Valgrind udostępnia linie, w których błąd wystąpił na końcu każdej linii, w formacie (file.c:line_no) . Błędy w valgrind są podsumowane w następujący sposób:

ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Najczęstsze błędy to:

  1. Nielegalne błędy odczytu / zapisu
==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

Dzieje się tak, gdy kod zaczyna uzyskiwać dostęp do pamięci, która nie należy do programu. Rozmiar dostępnej pamięci daje również wskazanie, która zmienna została użyta.

  1. Zastosowanie niezainicjowanych zmiennych
==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)

Zgodnie z błędem w wierszu 7 main wartości valg.c wywołanie printf() przekazało niezainicjowaną zmienną do printf .

  1. Nielegalne uwolnienie pamięci
==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)

Według Valgrinda kod uwolnił pamięć nielegalnie (drugi raz) w linii 10 valg.c , podczas gdy został już zwolniony w linii 9 , a sam blok został przydzielony pamięci w linii 7 .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow