본문 바로가기
IT/PROGRAM

valgrind C언어 메모리 누수 찾기

by SidePower 2020. 9. 8.

며칠전에 서버 관리자로부터 이메일이 왔습니다.
관리자한테서 연락이 오는건 흔한일이 아닌데요.ㅋ
내가 담당하는 프로세스가 시간이 지날수록
메모리를 계속 누적하고 있다는 거에요. ^^;;

갑자기 왠 청천벽력같은 소린가요 !!
내가 만든건 아니지만 수년간 잘 사용중인 건데요.


먼저 ps -ef 프로세스명으로 PID 값을 확인합니다.
top -p PID 명령어로 프로세스가 현재 자치하고 있는 메모리량을 확인했습니다.
헐~~아무리 메모리 사용이 많은 프로그램이라도
메가바이트(MB단)위까지는 이해가 됩니다면
수십 기가바이트(GB)로 표시되어 있어 깜짝 놀랐습니다.

C언어로 짠 프로그램이고 해더파일과 소스파일을 합치고
또 링크된 라이브러기까지 합치면 확인해야 될 소스만
10개 이상정도 되는거 같습니다.

이 많은 양을 어떻게 뒤져야 할지 막막합니다.

 


오류가 나거나 core 덤프라도 발생하면 gdb 를 이용해
디버그 모드로 재컴파일해서 바로 문제된
소스 위치까지 확인해서 수정가능할껀데요.흑

메모리가 해제되지 않고 누적만 되는거라
malloc 후에 free 를 사용하지 않은 부분으로 생각되어
전체 소스를 대상으로 찾아봅니다.
양이 너무 많다보니 사막에서 바늘찾기입니다.

답답해서 구글링 중에 득탬을 했어요.
메모리 누수를 찾아주는 valgrind 라는 프로그램이 있더라구요.
웬 횡재!!


바로 설치해서 사용해 봅니다.

yum 으로 간단하게 설치했습니다.

 

샘플 소스를 볼게요. 

간단하지만 바로 문제를 찾으셨다면 능력자시네요. ^^

free(pstr) 메모리해제하지 않은 source

valgrind 에서 분석해 볼게요.

실행 : valgrind 프로그램

HEAP SUMMAY : 프로그램 종료시 메모리 상태

                     2번 동적메모리 할당 하고 1번 해제(free) 함.

 

LEAK SUMMARY : 메모리 누수 정보 표시 (핵심 항목입니다.)

                     1 개의 블록에 10byte 메모리가 남아 있음.

definitely lost : free() 함수가 사용되지 않는 메모리 누수 (핵심 항목입니다.)

indirectly lost : 주소 포인터를 읽어버린 경우

possibley lost : 주소 포인터가 해제 되지 않고 남아 있는 경우.

still reachable : 종료 직전까지 메모리를 차지하는 경우.

 

메모리 누수가 있는 프로그램인지 바로 확인되조.. 멋진 툴입니다.

 

 

free() 함수를 사용해서 소스 수정해서 다시 볼게요.

다시 valgrind로 확인 하면 no leaks are possible - 누수 없습니다.

그리고 아래 상세 옵션으로 코딩 부분까지 체크가 가능합니다. 

 

valgrind --help 치시면 옵션들 상당히 많이 나올거에요.

 

메모리 누수 확인시 주로 사용되는 상세 옵션만 정리합니다. 

--leak-check=full : 메모리 관련 에러일 경우 소스파일과 라인수 표시

--error-limit=no : 모든 에러 표시

--log-file=로그파일명 : 결과파일 지정하는 옵션

 

-v : varbose 옵션. java에서도 들어봤을껀데요. 보여줄수 있는 모든 로그를 다 보여줍니다.

     위에 옵션들 다 들어 있어요. ㅋ

    사실 -v 이 옵션 하나면 되지만 부담스럽게 너무 많이 나와요.. ^^;;

valgrind -v 시작부분

너무 많아서 중간 내용은 짤랐습니다. ^^;;

끝부분입니다. 

valgrind -v 끝부분

빨간색이 소스 부분까지 보여준 내용입니다. ^^

 

너무 괜찮은 툴이라 꼭 알리고 싶네요.

반응형

댓글