valgrind memcheck

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
--xtree-memory
  • Memory leak 찾기 options
--leak-check=full --show-leak-kinds=all
  • 별도의 shared library (.so)를 dynamic load 시,
--trace-children = yes
  • 별도의 symbol 파일이 있는 경우
--extra-debuginfo-path = 경로
  • 디버그 정보를 유지하며 스택 추적 (단, valgrind 의 메모리 사용량이 증가함)
 --keep-debuginfo=yes

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