Valgrind는 메모리 누수를 탐지하는 리눅스용 디버깅 툴입니다. Mac에서도 사용이 가능하나 현재 Mac OS X 10.12까지만 지원하고 있습니다.
1) 메모리 누수 탐지
사용될 코드)
다음과 같은 코드를 실행하면, 메모리가 1바이트씩 100번 할당되고, 모두가 free되지 않은 채 프로그램이 종료됩니다.
이를 Valgrind를 통해 검사해보면,
다음과 같은 결과를 볼 수 있습니다.
이 때 —leak-check=full 옵션을 사용해서 다시 돌려보면,
프로그램의 어떤 함수서 leak가 발생하고 있는지 확인 할 수 있고,
gcc로 컴파일할 때 -g 옵션을 주게 되면, 위와 같이 어떤 파일의 몇번 째 줄에서 발생했는지 볼 수 있습니다.
예시로 만든 코드가 단순해 큰 의미가 없어 보이지만, 프로그램이 커지고 할당을 잡아주는 부분이 많아지다 보면 이런 기능이 정말 유용하게 쓰입니다.
코드를 수정해 할당된 메모리를 모두 해제해 주게 되면,
no leaks are possible이라는 메세지를 볼 수 있습니다.
2) uninitialized value 사용 경고
Valgrind에선 uninitialized value가 사용되었을 때도 경고를 해주는데요,
다음과 같은 코드를 예시로 들면,
컴파일과 실행에는 아무런 문제가 없는 것을 볼 수 있습니다.
이 프로그램을 Valgrind로 검사해보면
이렇게 uninitialized value가 main.c 파일의 19번째 줄, printf함수 부분에서 사용되었다고 경고해줍니다.
그리고 —track-origins=yes 옵션을 사용해주면
사진의 중앙 부분에서 uninitialized value가 stack allocation에 의해 생성됨을 알 수 있습니다.
스택에 선언된 정적 배열 str을 초기화해주면 문제가 사라집니다.