소스 검증 툴은 크게 정적 분석 툴(static analysis tool)과 동적 분석 툴(dynamic analysis tool)로 구분 할 수 있습니다. 


정적 분석 툴은 분석하고자 하는 프로그램을 실행시키지 않더라도 소스만 보고 문제를 찾아준다는 장점이 있지만, 

아무래도 복잡한 소스는 문제를 완벽하게 찾아주지 못한다는 단점이 있습니다. 

대표적으로 Prevent(유료)가 있습니다. 

다양한 정적 분석 툴(http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis)


동적 분석 툴은 메모리에 관한 거의 모든 문제를 찾아준다는 정확성면에서 매우 큰 장점이 있지만,

프로그램을 실행 시켜야만 된다는 단점이 있습니다. 

(프로그램이 매우 크다거나.. 종료되지 않고 계속 도는 데몬이라면.. 분석이 어려울 수 있습니다. )

Valgrind(무료)는 대표적인 동적 분석 툴에 해당됩니다. 

동적 메모리 디버깅 툴: MEMWATCH, Valgrind, Electric Fence, etc..

그 외의 다양한 동적 분석 툴(http://en.wikipedia.org/wiki/Dynamic_code_analysis)



프로그래밍을 하다보면 메모리 누수(memory leak)를 찾지 못해 고생하는 일이 종종 발생하죠. 

소스를 보기가 막막하다면 Valgrind(발그린드)의 도움을 받아보는것이 정신건강에 좋습니다. 


자세한 설명은 메뉴얼을 참고하세요~ 

valgrind_manual.pdf



추천은 저를 춤추게 합니다 ^^



1. 설치 


기본적으로 fedora와 같은 linux에는 valgrind 패키지가 포함되어 있습니다. 

yum 명령어를 사용해서 손쉽게 설치가 가능합니다. 

$ yum install valgrind 



2. 실행


기본적으로 제공되는 도움말에 다음처럼 사용법을 제시하고 있습니다. 

usage: valgrind [options] <prog-and-args>


예를 들면 이런식으로 실행 하는거죠.

$ valgrind --leak-check=full ./testLeak 



3. 결과 분석 


malloc 후에 free를 하지 않은 프로그램을 돌려보면 이런식으로 결과가 나옵니다. 


1) process ID(28403)가 앞에 나옵니다. 

2) 명확하게 leak이 발생한 크기(4bytes)에 대한 정보가 첫 줄에 나옵니다. 

3) 'at'은 leak이 발생한 위치, 즉 malloc에 의해 메모리를 할당 했는데 free가 안됐다는걸 보여줍니다. 

4) 'by'는 leak이 발생한 함수 이름이 나오죠. 


$ valgrind --leak-check=full -q  ./testLeak

==28403== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1

==28403==    at 0x4A0515D: malloc (vg_replace_malloc.c:195)

==28403==    by 0x40056D: main (in /testLeak)

==28403==



4. 팁


옵션을 좀 더 살펴보면.. 

1) tool을 선택 가능합니다. 

--tool=memcheck 와 같이 지정해주면 됩니다. 

사실, 기본으로 [memcheck]가 선택되어 있기때문에 memcheck를 할꺼라면 별도로 지정해주지 않으셔도 됩니다. 


선택가능한 옵션은 이런것들이 있답니다. 

memcheck(memory), cachegrind(cache), callgrind(call-graph), helgrind(thread), etc..



2) 결과만 보고 싶다면 

-q 옵션을 붙여주면, 잡다한 메시지는 보여주지 않고 에러 메시지만 출력합니다. 


Posted by KT한
,