며칠전에 서버 관리자로부터 이메일이 왔습니다.
관리자한테서 연락이 오는건 흔한일이 아닌데요.ㅋ
내가 담당하는 프로세스가 시간이 지날수록
메모리를 계속 누적하고 있다는 거에요. ^^;;
갑자기 왠 청천벽력같은 소린가요 !!
내가 만든건 아니지만 수년간 잘 사용중인 건데요.
먼저 ps -ef 프로세스명으로 PID 값을 확인합니다.
top -p PID 명령어로 프로세스가 현재 자치하고 있는 메모리량을 확인했습니다.
헐~~아무리 메모리 사용이 많은 프로그램이라도
메가바이트(MB단)위까지는 이해가 됩니다면
수십 기가바이트(GB)로 표시되어 있어 깜짝 놀랐습니다.
C언어로 짠 프로그램이고 해더파일과 소스파일을 합치고
또 링크된 라이브러기까지 합치면 확인해야 될 소스만
10개 이상정도 되는거 같습니다.
이 많은 양을 어떻게 뒤져야 할지 막막합니다.
오류가 나거나 core 덤프라도 발생하면 gdb 를 이용해
디버그 모드로 재컴파일해서 바로 문제된
소스 위치까지 확인해서 수정가능할껀데요.흑
메모리가 해제되지 않고 누적만 되는거라
malloc 후에 free 를 사용하지 않은 부분으로 생각되어
전체 소스를 대상으로 찾아봅니다.
양이 너무 많다보니 사막에서 바늘찾기입니다.
답답해서 구글링 중에 득탬을 했어요.
메모리 누수를 찾아주는 valgrind 라는 프로그램이 있더라구요.
웬 횡재!!
바로 설치해서 사용해 봅니다.
yum 으로 간단하게 설치했습니다.
샘플 소스를 볼게요.
간단하지만 바로 문제를 찾으셨다면 능력자시네요. ^^
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 이 옵션 하나면 되지만 부담스럽게 너무 많이 나와요.. ^^;;
너무 많아서 중간 내용은 짤랐습니다. ^^;;
끝부분입니다.
빨간색이 소스 부분까지 보여준 내용입니다. ^^
너무 괜찮은 툴이라 꼭 알리고 싶네요.
'IT > PROGRAM' 카테고리의 다른 글
이클립스 STS 화면 글자 색깔 테마 변경하기 Light . Classic . Dark (82) | 2020.12.21 |
---|---|
스프링부트 JSP 대신 타임리프 (Thymeleaf) 사용하기 (12) | 2020.12.10 |
H2 Database 사용하기 (273) | 2020.10.29 |
리눅스 C언어 문자열 분리 strtok 사용법 그리고 대체함수 (0) | 2020.10.16 |
C언어 프로그램 메모리 누수 찾기 (252) | 2020.08.21 |
댓글