수색…


통사론

  • valgrind 프로그램 이름 선택적 인수 < 테스트 입력

비고

Valgrind는 C 프로그램의 메모리 관리와 관련된 오류를 진단하는 데 사용할 수있는 디버깅 도구입니다. Valgrind는 할당 된 공간을 지나서 쓰거나 읽거나 유효하지 않은 free() 호출을하는 등 잘못된 포인터 사용과 같은 오류를 탐지하는 데 사용할 수 있습니다. 또한 메모리 프로파일 링을 수행하는 기능을 통해 응용 프로그램을 향상시키는 데에도 사용할 수 있습니다.

자세한 내용은 http://valgrind.org를 참조하십시오.

러닝 밸그 린드

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/ 의 설명서를 참조하십시오.

잃어버린 바이트 - 무료로 잊어 버림

다음은 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== 

프로그램이 디버그 모드로 컴파일되지 않은 경우 (예 : GCC의 -g 플래그 사용) 누출 위치가 관련 함수와 관련하여 표시되지만 행은 표시되지 않습니다.

이렇게하면 우리가 돌아가서 그 줄에 어떤 블록이 할당되었는지 살펴보고 앞으로 추적되지 않은 이유를 추적 할 수 있습니다.

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)

오류에 따르면, valg.cmain 7 행에서 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에서 불법 메모리 (a 초 시간) 해제 valg.c 이미 라인 9에서 해방 된 반면, 상기 블록 자체는 라인 (7)의 메모리를 할당한다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow