본문 바로가기

Programming/Linux

valgrind 사용법

리눅스에서 프로그램을 만들다 보면 Memory Leak 체크를 할 필요성을 느낍니다.
이럴경우, Memory Leak을 찾는 툴이 valgrind입니다.
프로그램은 사이트(http://valgrind.org/)에서 받을 수 있구요~ ^^

다운받은 파일을 압축을 풀고 그 폴더에 들어간 뒤, valgrind파일을 실행시킵니다.

제가 가장 편하게 사용하는 메모리릭 체크 방법은 다음과 같습니다.
 
valgrind --leak-check=full --log-file=memcheck.txt -v --error-limit=no [프로그램경로] [인자]
 
--leak-check=full : 메모릭에러가 날 경우 소스파일명과 라인위치 출력

               이 옵션을 사용할려면 디버깅컴파일을 해야합니다. (컴파일시 -g 옵션)
--log-file : 체크결과를 저장할 로그파일명

이렇게 실행하고 나면 로그파일이 만들어지는데 이 두 부분만 보면 됩니다.


LEAK SUMMARY ( Memory Leak 요약 )
==18431== LEAK SUMMARY:
==18431==    definitely lost: 1,025 bytes in 1 blocks
==18431==    indirectly lost: 0 bytes in 0 blocks
==18431==      possibly lost: 12,749,264 bytes in 112 blocks
==18431==    still reachable: 4,240 bytes in 16 blocks
==18431==         suppressed: 0 bytes in 0 blocks
==18431== Reachable blocks (those to which a pointer was found) are not shown.
==18431== To see them, rerun with: --leak-check=full --show-reachable=yes
1블록에서 1,025만큼의 메모리 Leak이 발생했다는 걸 알 수 있습니다.
definitely lost외에 항목은 불분명한 것이므로 굳이 볼 필요는 없습니다.

LEAK DETAIL
definitely lost로 로그파일을 검색하게 되면 상세내용을 찾을 수 있습니다.
==18431== Thread 1:
==18431== 1,025 bytes in 1 blocks are definitely lost in loss record 2 of 9
==18431==    at 0x4C2179E: malloc (vg_replace_malloc.c:236)
==18431==    by 0x40A16F: make_friend_best(char*, int, int) (friend_srch.c:798)
==18431==    by 0x406A45: Friend(int, int, int, int, int, int, int, char*, char*, char*, char*, char*, int, char*, char*) (friend_thread.c:600)
==18431==    by 0x4052C6: main (friend_srch_main.c:75)
이 로그를 보게되면, 동적할당 하는 부분에서 릭이 발생했고
friend_srch.c소스에 798라인이 그 부분이라는 걸 알 수 있습니다.


메모리 릭 찾기 참 쉽죠잉?