Valgrind
- Valgrind Memcheck
- 메모리 누수 및 메모리 오류를 감지하는 tool
- c++ 프로그램에서 찾을 수 있는 문제
- 접근할 수 없는 memory access
- heap block overrun, stack overrun, free 된 memory
- undefined values
- 메모리의 할당/해제가 잘못 짝지어진 경우
-malloc - free / new - delete / new[] - delete[]
- 메모리 할당 시 시작과 끝이 겹치는 경우
- memory overlap (ex : memcpy)
- Memory allocation function의 매개변수로 음수를 넣는 경우
- Memory Leaks
valgrind 사용 준비
- 프로그램 컴파일 시, -g 옵션을 추가하기
- 필요에 따라 -O0, -O1, -O2 를 활용 가능
- 단, O1 옵션 사용 시, 행 번호가 일치하지 않을 수 있음
- O2 이상을 활용하는 경우, 초기화되지 않은 값에 대한 오류를 출력하므로 O2 이상으로 최적화 하지 말것
valgrind 사용 방법
- Memcheck는 Execution Memory profiling을 제공할 수 있음
- 기본 사용방법
valgrind --leak-check=yes myprog arg1 arg2
valgrind --tool=memcheck ./binary
--leak-check=full --show-leak-kinds=all
- 별도의 shared library (.so)를 dynamic load 시,
--extra-debuginfo-path = 경로
- 디버그 정보를 유지하며 스택 추적 (단, valgrind 의 메모리 사용량이 증가함)
valgrind message
- definitely lost (definitely leak)
- 더 이상 사용하지 않으나 heap 영역에 할당된 메모리가 해제되지 않음
- heap-allocated memory that was never freed to which the program no longer has a pointer
- This memory is definitely orphaned
- indirectly lost
- heap-allocated memory that was never freed to which the only pointers to it also are lost.
- For example, if you orphan a linked list, the first node would be definitely lost, the subsequent nodes would be indirectly lost.
- possibly lost
- heap-allocated memory that was never freed to which valgrind cannot be sure whether there is a pointer or not.
- still reachable
- heap-allocated memory that was never freed to which the program still has a pointer at exit.
Refs
To Do…
- callgrind
- a call-graph generating cache and branch prediction profiler
- –tool=callgrind 옵션을 이용하여 설정 가능
- Callgrind