얼마전에 오랜만에 C 언어로 프로그램을 짤 일이생겼습니다. 3일동안 67kbyte 정도의 소스코드를 작성했고, 잘 돌아갔습니다. (얼마나 뿌듣하던지.^^)
그리고 나서 이 프로그램을 조금더 확장하는데, 메모리 문제가 있었습니다. 길면 몇 주를 돌아가야 할 프로그램이라 메모리 관리가 좀 더 철저해야 하는데, 작성을 그리 하지 않았으니... 그래서 이것 저것 손을 보며 고치고 있는데, 오랜만에 해서 그런지 원래 실력이 안되는 건지 쉽지가 않더군요.
메모리관련된 알아볼 수 없는 에러가 계속 발생해서 거의 GG 치고 GDB 를 사용했던 기억을 되살려서 Debugging 을 해야 하나.. 고민하고 있었는데, 예전에 같이 일하전 정설씨가 메모리 관련된 툴을 사용하는 것이 기억나서 물어보니 valgrind 라는 툴을 알려주었습니다.
이 프로그램으로 정말 편하게 메모리 관리와 관련된 문제를 해결 할 수 있었습니다. 그래서 블로그에 소개글을 한 남겨 봅니다. valgrid 홈페이지에 소개글을 보면(번역이 이상한건 이해해 주세요.^^;)
라고 적혀 있습니다. 저는 메모리 관련된 부분을 사용했는데요. 또 이 프로그램은 자유소프트웨어 여서 누구나 쉽게 사용할 수 있습니다.
프로그램 사용법은 아주 간단합니다. 우선 gcc를 이용해서 컴파일 할때 Debug 옵션인 -g 옵션을 주셔야 합니다. 그리고 다음과 같은 방법으로 실행합니다.
그러면 프로그램이 실행 되면서
이런 형식의 결과가 나옵니다. 내용은 그냥 봐도 어떤 내용인지 알 수 있습니다. 먼저 ERROR SUMMARY 가 있습니다. 여기 예신에서는 ERROR 가 없는데요. 이미 해제한 메모리에 다시 접근한다던가, 해제한 메모리를 다시 해제 한다던가 하는 치명적인 문제가 여기서 잡힙니다.
그 다음은 LEAK SUMMARY 입니다. 프로그램의 어디에서 할당된 메모리가 해제 되지 않았는지 나오고 마지막에 LEAK SUMMARY 에서 전체 얼마의 메모리가 할당되었고, 얼마나 해제 되지 않았는지 나옵니다.
정말 편리하죠? 이걸 이용해서 제가 작성한 프로그램을 손을 봤습니다.
자유소프트웨어에는 참, 좋은 프로그램이 많습니다.^^
그리고 나서 이 프로그램을 조금더 확장하는데, 메모리 문제가 있었습니다. 길면 몇 주를 돌아가야 할 프로그램이라 메모리 관리가 좀 더 철저해야 하는데, 작성을 그리 하지 않았으니... 그래서 이것 저것 손을 보며 고치고 있는데, 오랜만에 해서 그런지 원래 실력이 안되는 건지 쉽지가 않더군요.
메모리관련된 알아볼 수 없는 에러가 계속 발생해서 거의 GG 치고 GDB 를 사용했던 기억을 되살려서 Debugging 을 해야 하나.. 고민하고 있었는데, 예전에 같이 일하전 정설씨가 메모리 관련된 툴을 사용하는 것이 기억나서 물어보니 valgrind 라는 툴을 알려주었습니다.
이 프로그램으로 정말 편하게 메모리 관리와 관련된 문제를 해결 할 수 있었습니다. 그래서 블로그에 소개글을 한 남겨 봅니다. valgrid 홈페이지에 소개글을 보면(번역이 이상한건 이해해 주세요.^^;)
Valgrind 는 리눅스프로그램의 디버깅과 프로파일링을 하기 위한 도구이고, 몇 몇 대회에서 우승을 한 우수한 프로그램 입니다. Valgrind 를 이용하면, 메모리 관리 문제나, Threading문제 같은 해결하는데 많은 노력이 필요한 일들을 편리하게 자동화된 환경에서 찾아내고 해결할 수 있습니다. 또한 자세한 Profiling 을 할 수 도 있어서, 프로그램의 속도를 높이고 메모리 사용을 줄이는 일도 할 수 있습니다.
라고 적혀 있습니다. 저는 메모리 관련된 부분을 사용했는데요. 또 이 프로그램은 자유소프트웨어 여서 누구나 쉽게 사용할 수 있습니다.
프로그램 사용법은 아주 간단합니다. 우선 gcc를 이용해서 컴파일 할때 Debug 옵션인 -g 옵션을 주셔야 합니다. 그리고 다음과 같은 방법으로 실행합니다.
valgrind --leak-check=yes ./bs_tools sag ~/d1w5sa1.ent ~/d1w1we_.ent
그러면 프로그램이 실행 되면서
neosphere@neoslap:~/workspace/BioStructure/src/c$ valgrind --leak-check=yes ./bs_tools sag ~/d1w5sa1.ent ~/d1w1we_.ent
==18417== Memcheck, a memory error detector.
==18417== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.
==18417== Using LibVEX rev 1658, a library for dynamic binary translation.
==18417== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==18417== Using valgrind-3.2.1-Debian, a dynamic binary instrumentation framework.
==18417== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.
==18417== For more details, rerun with: -v
==18417==
==18417==
==18417== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 1)
==18417== malloc/free: in use at exit: 42,432 bytes in 1,966 blocks.
==18417== malloc/free: 11,944 allocs, 9,978 frees, 2,295,640 bytes allocated.
==18417== For counts of detected errors, rerun with: -v
==18417== searching for pointers to 1,966 not-freed blocks.
==18417== checked 80,492 bytes.
==18417==
==18417== 3,120 bytes in 26 blocks are definitely lost in loss record 2 of 8
==18417== at 0x4021620: malloc (vg_replace_malloc.c:149)
==18417== by 0x80495FE: _read_line (pdb_io.c:122)
==18417== by 0x804916B: read_pdb (pdb_io.c:16)
==18417== by 0x8049B71: sag (tools.c:86)
==18417== by 0x8049C54: main (tools.c:105)
.......
==18417==
==18417==
==18417== 512 bytes in 32 blocks are definitely lost in loss record 4 of 8
==18417== at 0x4021620: malloc (vg_replace_malloc.c:149)
==18417== by 0x8049CE6: pairing (sag.c:17)
==18417== by 0x804AFBA: sag_run (sag.c:435)
==18417== by 0x8049BA3: sag (tools.c:89)
==18417== by 0x8049C54: main (tools.c:105)
==18417==
==18417== LEAK SUMMARY:
==18417== definitely lost: 3,668 bytes in 61 blocks.
==18417== indirectly lost: 38,060 bytes in 1,903 blocks.
==18417== possibly lost: 0 bytes in 0 blocks.
==18417== still reachable: 704 bytes in 2 blocks.
==18417== suppressed: 0 bytes in 0 blocks.
==18417== Reachable blocks (those to which a pointer was found) are not shown.
==18417== To see them, rerun with: --show-reachable=yes
neosphere@neoslap:~/workspace/BioStructure/src/c$
이런 형식의 결과가 나옵니다. 내용은 그냥 봐도 어떤 내용인지 알 수 있습니다. 먼저 ERROR SUMMARY 가 있습니다. 여기 예신에서는 ERROR 가 없는데요. 이미 해제한 메모리에 다시 접근한다던가, 해제한 메모리를 다시 해제 한다던가 하는 치명적인 문제가 여기서 잡힙니다.
그 다음은 LEAK SUMMARY 입니다. 프로그램의 어디에서 할당된 메모리가 해제 되지 않았는지 나오고 마지막에 LEAK SUMMARY 에서 전체 얼마의 메모리가 할당되었고, 얼마나 해제 되지 않았는지 나옵니다.
정말 편리하죠? 이걸 이용해서 제가 작성한 프로그램을 손을 봤습니다.
이렇게 시작해서
==17935== LEAK SUMMARY:
==17935== definitely lost: 3,740 bytes in 64 blocks.
==17935== indirectly lost: 108,312 bytes in 6,868 blocks.
==17935== possibly lost: 0 bytes in 0 blocks.
==17935== still reachable: 704 bytes in 2 blocks.
==17935== suppressed: 0 bytes in 0 blocks.
==17935== Reachable blocks (those to which a pointer was found) are not shown.
==17935== To see them, rerun with: --show-reachable=yes
==18183== LEAK SUMMARY:이렇게 진행되서
==18183== definitely lost: 3,676 bytes in 62 blocks.
==18183== indirectly lost: 38,572 bytes in 1,905 blocks.
==18183== possibly lost: 0 bytes in 0 blocks.
==18183== still reachable: 704 bytes in 2 blocks.
==18183== suppressed: 0 bytes in 0 blocks.
==18183== Reachable blocks (those to which a pointer was found) are not shown.
이렇게 끝났습니다. 와~~ 다잡았다. 예전같으면 정말 오래 오래 거리고 스트레스도 많이 받을 작업이었는데, 3시간만에 끝났습니다.
==7855== LEAK SUMMARY:
==7855== definitely lost: 0 bytes in 0 blocks.
==7855== possibly lost: 0 bytes in 0 blocks.
==7855== still reachable: 704 bytes in 2 blocks.
==7855== suppressed: 0 bytes in 0 blocks.
==7855== Reachable blocks (those to which a pointer was found) are not shown.
==7855== To see them, rerun with: --show-reachable=yes
자유소프트웨어에는 참, 좋은 프로그램이 많습니다.^^
'IT n Linux' 카테고리의 다른 글
생물정보학자를 위한 클러스터 만들기 #4v1 Perceus 설정하기 (1) | 2007.10.27 |
---|---|
Perceus 1.3.1 등장 (0) | 2007.10.13 |
c 의 abs 함수는 double 형을 지원하지 않는다. (1) | 2007.10.05 |
2년만에 받아보는 성정. 그러나 기쁘지 않다. (1) | 2007.06.22 |
Acegi - Spring 을 위한 보안 시스템 (0) | 2007.02.13 |