본문 바로가기

IT/Server

[Linux] valgrind를 이용한 디버깅 (Linux Debugging)

valgrind (밸그린드) 에 대한 사용법을 간단히 정리합니다.

 

http://valgrind.org (공식 사이트)

 

 

밸그린드는 x86, AMD64 아키텍쳐 환경의 메모리 릭을 탐지하고 프로파일링 하는 리눅스 메모리 디버깅 툴입니다. (위키디피아에서 어원의 유래가 북구 유럽 신화의 Valhalla 로 가는 주 입구에서 비롯됬다고 하네요. -_- )

보통 메모리 할당과 해제, 초기화되지 않은 메모리, 배열의 오버플로우, 포인터 해제 등과 같은 문제들을 잡아주지요.(올레!~)

 

자 어쨌든 설치를 하고,

 

$ sudo apt-get install valgrind

 

사용법을 봅시다.

 

 

유용해 보이는 옵션(제 기준 -_-)은 빨간색 밑줄로 표시했습니다.

 

간단한 예를 보도록 하죠. 실행 예는 다음과 같습니다.

 

$ valgrind --leak-check=yes ./test

 

 

1. 메모리 릭 탐지

 

int main(int argc, char** argv)

{

fprintf( stderr, "OK!\n" );

char* a = malloc( 10 ); //과감히 메모리 릭을 발생시켜주자구!

return 0;

}

 

 

 

결과는 다음과 같습니다.

 

LEAK SUMMARY에서 정확히 10바이트 손실이 되었다고 보고합니다.

물론 우리는 HEAP SUMMARY를 통해 문제의 라인 위치를 알 수 있고 gdb등을 통해 그 부분을 추적하면 문제 해결이 가능하겠지요.

 

 

2. 유효하지 않는 포인터 참조

 

int main(int argc, char** argv)

{

fprintf( stderr, "OK!\n" );

int* a = malloc( 10 );

a[ 10 ] = 3; //메모리는 0 ~ 9 까지 유효하지만 10을 참조하고 있지요.

free( a );

return 0;

}

 

 

 

결과는 다음과 같습니다.

 

 

메모리 주소와 함께 유효하지 않는 4바이트의 크기의 기록이라고 지적해 줍니다. (하지만, 배열을 선언하고 잘못된 인덱스 참조하는것은 찾아내지 못합니다. 오직 동적 메모리 할당에서만 유효!)

 

 

3. 초기화 하지 않은 변수 사용

 

int main(int argc, char** argv)

{

int x;

if( x == 3 )

fprintf( stderr, "OK!\n" );

return 0;

}

 

 

 

결과는 다음과 같습니다.

 

 

오오오... 좋군요. 초기화하지 않은 변수라고 언급하는 군요. 마지막으로 한 개 만 더.

 

 

4. 잘못된 메모리 해제

 

 

int main(int argc, char** argv)

{

int* a = malloc(10);

free(a);

free(a);

return 0;

}

 

 

 

결과는 다음과 같습니다.

 

 

유휴~ 설명은 굳이 필요 없겠지요?

 

 

3. 도구와 연동하기

밸그린드 옵션에 보면 --tool 이라는 것이 있습니다. valgrind와 메모리 체크 툴을 연동하도록 좀 더 확장성있게 제공이 되는 것인데 사용자는 이를 유용하게 사용할 수 있겠지요. 현재 존재하는 툴 리스트는 다음과 같습니다.

  • memcheck
  • Cachegrind
  • Callgrind
  • Massif
  • Helgrind

 

그런데 Callgrind가 좀 그래픽적으로 보기 쉬워 보이더군요. 그래서 Callgrind 사용법만 잠깐 보도록합시다.

 

http://kcachegrind.sourceforge.net/html/Home.html (다운 및 설치법, 콘솔 상에서 kcachegrind 실행이 되면 설치되어 있음)

실행을 하게 되면 해당 폴더에 callgrind.out.XXX 라는 파일이 생성됩니다.

$ valgrind --tool=callgrind ./test

 

그럼 callgrind의 그래픽 툴인 kcachegrind를 실행해서 해당 프로시져 로직 등의 정보를 리스트 및 다이어그램 등으로 확인할 수 있습니다.

$ kcachegrind callgrind.out.11288

(클릭하세요.)

4. 기타 사용법

 

부수 정보 출력

$ valgrind --leak-check=yes ./test

로그파일로 결과화면을 출력

$ valgrind --leak-check=yes -v --log-file="./test.log" ./test

 

그 외 --show-reachable=yes 옵션도 많이 사용하는 것 같긴 하지만, 이 옵션을 이용하면 "still reachable" 이라는 결과를 출력하지는 않습니다. still reachable은 메모리를 할당하고 해제하지 않는 부분이 있더라도 그 프로그램은 "아마도" 정상일 것이라고 가정하는 부분을 알려주는 부분이지요.

 

 

 

참고 : - Beginning Linux Programming 4th Edition 628-633 (WROX)-

- http://blog.pages.kr/archive/20090704 -

- http://www.cprogramming.com/debugging/valgrind.html -

'IT > Server' 카테고리의 다른 글

[Linux] 자주 쓰이는 리눅스 명령어 완벽 정리  (2) 2014.03.25
[Linux] 리눅스 vi 편집기 명령어  (0) 2014.01.23
[Linux] Linux Command  (0) 2014.01.23
[Linux] putty 프로그램  (0) 2014.01.23
[Linux] make 명령어 안될경우  (0) 2014.01.23