C Language
Valgrind
수색…
통사론
- 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)
가장 일반적인 오류는 다음과 같습니다.
- 불법 읽기 / 쓰기 오류
==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)
오류에 따르면, valg.c
의 main
7 행에서 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에서 불법 메모리 (a 초 시간) 해제 valg.c
이미 라인 9에서 해방 된 반면, 상기 블록 자체는 라인 (7)의 메모리를 할당한다.