Valgrind


코드 checking tool에는 크게 static과 dynamic checking tool이 있습니다.
Static tool은 코드를 실행하지 않고 버그를 잡아주는 방법을 채택하고 있으며, 여기에는 lint, coverity 그리고 서울대에서 개발한 airac등이 있습니다.  이에 반해 Dynamic tool은 코드를 실행시키면서 버그를 잡아주는 방법을 사용합니다.  여기에는 purify, boundschecker, insure++ 등이 있습니다.

Valgrind는 이중 dynamic tool에 해당하며 run-time상에 발생하는 Memory관련 버그를 잡아 줍니다.  Valgrind가 다른 tool과 다른 점은 Open-source이며 무료라는 점입니다.  Linux관련 code의 품질에 많은 도움이 될 것으로 예상됩니다.  Valgrind가 잡아주는 버그들은 이런 것 들입니다.

Use of uninitialized memory : 초기화 되지 않은 memory를 사용하는 것
Reading/writing memory after it has been free'd : free한 이후의 memory를 access하는 것
Reading/writing off the end of malloc'd blocks : malloc한 memory의 범위를 넘어서 access하는 것
Memory leak : 잃어버린 malloc된 memory

사용방법은 간단합니다.  main이 실행 file이라고 하면, 아래와 같이 실행시키면 됩니다.

valgrind main

Error message를 이해하기가 조금 어려울 수도 있으나 끈기 있게 따라가면 버그가 보입니다.
http://valgrind.org/
이곳에 가셔서, download받으신 후 compile 하고 install하시면 됩니다.  막히시면 말씀하시고요.

참고로, valgrind의 구현 방법은 CPU instruction을 emulation하는 engine인 virtual machine을 사용하고 있습니다.  따라서 CPU마다 instruction이 다르기 때문에 관련 부분을 새로 작성해야 합니다.  현재까지 지원되는 platform은 X86/Linux, AMD64/Linux, PPC32/Linux, PPC64/Linux이며, 향후 지원계획은 official web site에 가시면 보실 수 있습니다.

그리고, virtual machine을 이용한 emulation덕분에 코드는 10배정도 느리게 동작 합니다.  일반적으로 CPU가 워낙 빨라서 약간 느려지는 정도이지만, Timing critical한 경우에는 emulation의 수행 때문에 영향을 받을 수도 있는 것을 염두에 두십시오.

Valgrind와 함께 즐거운 소프트웨어가 되시길 바라면서…

 

 

by 제임스 | 2006/07/10 04:00 | 메인스토리 | 트랙백(1) | 핑백(1) | 덧글(13)

트랙백 주소 : http://jamestic.egloos.com/tb/139733
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from 엘레노아의 작업로그 at 2007/07/10 11:51

제목 : DEBUG에 관한 고민 : valrgind
DEBUG에 특별히 유틸리티를 쓰지 않는 주의이긴 하지만 (gdb 정도가 나의 친구 ~_~) , 가끔은 (비록 thread에서 제대로 동작하는지 의심스러울 때가 많지만...;) 쓸만한 유틸리티라고 생각되어 첨부한다. 아무것도 설명하지 않고 줄줄이 링크만 단다면 너무 무책임해 보이니 간단하게 설명하자면, 메모리에 관련된 여러가지 버그들을 잡아주는 유틸리티이다. 뭐 여기에 대해서 줄줄이 설명을 달 의향도 있었지만 (정말?) 인터넷이 너무나도 발달하......more

Linked at mongdaru : 리눅스 디.. at 2010/05/14 11:00

... 라는 막강한 툴이 있습니다. --> 실컷 깔고 인스톨했더니 mips에서는 지원이 안된다. -_-;; http://www.buggymind.com/114http://jamestic.egloos.com/139733 http://bibreen.cafe24.com/moniwiki/wiki.php/Valgrind ... more

Commented by stone at 2006/07/10 13:10
앗! 이렇게 좋은 툴을 공짜로 제공해 주는군요.
MIPS가 지원이 안되는 것이 좀 아쉽습니다 (추후 계획도 low priority 군요).
Commented by 제임스 at 2006/07/11 09:57
네... 대단한 정신이죠. ARM도 안되서 MIPS까지 가려면 좀 걸리겠죠?
마음 같아서는 하나 만들고 싶은 생각이 굴뚝입니다만... 하하하
Commented by stone at 2006/07/11 13:03
희안한건... symbol table이 없어도 잡아내던데...
즉, compile 시에 -g option 이 없어도 가능 하더군요.
어떤 방법을 쓴걸까요? 궁금...
Commented by 제임스 at 2006/07/11 16:14
-g 안쓴것이 확실한가요? strip main해서 size를 비교해보세요. 변화가 있는지 없는지요
Commented by stone at 2006/07/12 20:02
확실합니다. 시험해 보시죠.
Commented by 제임스 at 2006/07/12 22:19
http://valgrind.org/docs/manual/quick-start.html#quick-start.intro의 4번의 코드로 시험을 했습니다.
==2430== Invalid write of size 4
==2430== at 0x8048344: f (in /home/nomos/test/valgrind/a.out)
==2430== by 0x8048360: main (in /home/nomos/test/valgrind/a.out)

==2476== Invalid write of size 4
==2476== at 0x8048344: f (main.c:7)
==2476== by 0x8048360: main (main.c:12)
아래의 것이 -g option을 사용한것인데요.... 근데 이걸 말하는것 맞나요
혹시 -g option을 안썼는데도 버그가 있다는걸 안다는 이야긴가요?
Commented by 제임스 at 2006/07/12 23:28
답이 YES라면.... 윗글 보세요 ^^
Commented by haskell at 2007/11/11 19:21
CPU 인스트럭션을 에뮬레이션해서 버그를 찾아낸다면 버그를 찾아내는데 심볼이 필요하지는 않을 것 같습니다. 다만 찾은 버그를 사용자에게 리포팅할 때 심볼 정보가 없으면 Hexa 주소를 언급해야겠지요.
Commented by 제임스 at 2007/11/13 12:29
네, 그런것 같죠...... 고맙습니다 ^^
Commented by 이강인 at 2010/01/09 22:46
Valgird설 설명이 별로 없 없던차에 참고가 되었습니다.
Commented by 제임스 at 2010/01/17 22:18
그렇군요. 다행입니다. 강인님.
Commented by coffeejava at 2010/02/03 10:02
메모리 릭이 때문에 이저것저것 검색하다가,제임스님 블로그에 접속하게 되었습니다. 발자국 남가고 갑니다~ ㅋ
Commented by 제임스 at 2010/02/04 19:01
coffeejava님 반갑습니다. 참 오랜만이네요.
근황도 잠깐 봤고요. memory leak 정도야 쉽게 처리하실 것 같은데요? 하하
농담이고요. 처음 부터 설계가 되지 않으면 memory leak은 끝까지 해결하기 어려운 것 같아요.

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶