메모리릭 발생 위치에 Breakpoint 설정하기

출처 : 인터넷에서...

 

메모리릭 발생 위치에 Breakpoint 설정하기

 

메모리릭이 발생하면 디버거를 종료했을 때 이런 메시지가 출력된다.

Detected memory leaks!
Dumping objects ->
{103144} normal block at 0x01C79B18, 12 bytes long.
Data: <            > 18 9B C7 01 18 9B C7 01 CD CD CD CD

왠만하면 어느 파일의 몇 번째 줄에서 메모리릭이 발생했다고 알려주지만, 이 경우처럼 디버거가 알려주지 못하는 경우도 많고, for문 안에서 메모리릭이 발생하는 경우처럼 위치만 알아서는 정확히 언제 발생하는지 알기 어려울 때도 있다. 이럴 때 사용할 수 있는 것이 중괄호안에 들어있는 숫자다. 이 숫자는 메모리 할당 번호(Memory Allocation Number)인데, 번호가 103144라는 것은 이 프로그램에서 할당받은 메모리 중에서 103144번째 블록이라는 뜻이다(헉... 내 프로그램이 메모리를 이렇게 많이 할당받았던가 -0-;;).

프로그램 코드의 적당한 위치에

_crtBreakAlloc = 103144; 
라고 적어주고 디버거를 실행하면 이 메모리를 할당하려고 할 때 프로그램을 Break 시켜준다. 디버그 버전에서는 힙에 메모리를 할당할 때마다 crtdbg 라이브러리(이렇게 표현해도 되나?)가 이 변수를 체크해서 Break 해주는 것이다. 디버깅중에 Watch 윈도우에서 변수 값을 바꿔서 다른 메모리 할당 번호에서 멈출 수도 있다. 전역 변수 값을 변경하는 대신에

_CrtSetBreakAlloc(103144); 
라고 함수를 호출해주어도 마찬가지 효과가 있다.

MSDN 기술문서 중 "Detecting and Isolating Memory Leaks"를 참고했음.
 
//------------------------------------------------------------------------------------
사용 방법 설명
 

Detected memory leaks!
Dumping objects ->
{103144} normal block at 0x01C79B18, 12 bytes long.
Data: <            > 18 9B C7 01 18 9B C7 01 CD CD CD CD

추가 헤더 파일 : #include <crtdbg.h>
 
[MFC]
~App::InitInstance() 함수 상위에 아래와 같이 문제가 발생된 메모리 블럭 설정
    ...
 
    _CrtSetBreakAlloc(103144);
    _CrtMemDumpAllObjectsSince(0);
}
 
[Win32/Console]
main()
{
    ...
    _CrtSetBreakAlloc(103144);
    _CrtMemDumpAllObjectsSince(0);

by 스파이크 | 2008/06/29 23:02 | Debugging | 트랙백 | 덧글(0)

valgrind 메모리 릭 체크

test.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *str = (char*) malloc(1024);
    printf("flsdkjfslkjfsdklfj\n\n\n");
    printf("\n\n");
    return 0;
}

 

컴파일( -g 옵션을 넣어야 파일과 라인을 알수 있다. 그리고 -o옵션보다 먼저 써줘야 한다.)

gcc -g -o test test.c

 

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./test

 

하면

==17708==
==17708== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 1)
==17708== malloc/free: in use at exit: 1,024 bytes in 1 blocks.
==17708== malloc/free: 1 allocs, 0 frees, 1,024 bytes allocated.
==17708== For counts of detected errors, rerun with: -v
==17708== searching for pointers to 1 not-freed blocks.
==17708== checked 59,020 bytes.
==17708==
==17708== 1,024 bytes in 1 blocks are definitely lost in loss record 1 of 1
==17708==    at 0x4021620: malloc (vg_replace_malloc.c:149)
==17708==    by 0x80483D0: main (test.c:6)
==17708==
==17708== LEAK SUMMARY:
==17708==    definitely lost: 1,024 bytes in 1 blocks.
==17708==      possibly lost: 0 bytes in 0 blocks.
==17708==    still reachable: 0 bytes in 0 blocks.
==17708==         suppressed: 0 bytes in 0 blocks.

 

이렇게 출력된다.

 

출력내용중(빨간색부분) test.c:6 를 보면 파일명과 라인을 알 수 있고

definitely lost: 1,024 bytes in 1 blocks. 를 보면 1의 블럭에서 1024  byte를 잃었다는 것을 알 수 있다.

 

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --log-file="./valgrind_log" ./test

 

를 하면 로그 파일로 볼수 있다.

 

 

Home : http://valgrind.org/ 

사용법 : http://valgrind.org/docs/manual/manual.html 

파일로 다운로드 : http://valgrind.org/docs/download_docs.html 

[출처] valgrind 메모리 릭 체크 - valgrind 아주 유용하다. 메뉴얼도 언젠가 꼭 봐보자..(영어 ㄷㄷㄷ;;)|작성자 kdepirate

1. Valgrind 설치

wget http://www.valgrind.org/downloads/valgrind-3.3.0.tar.bz2
tar xvfj valgrind-3.3.0.tar.bz2
cd valgrind-3.3.0
./configure
make
make install

 

2. Valgrind 테스트
valgrind --leak-check=yes main

3. 간단 실행법
valgrind --tool=memcheck --leak-check=full [프로그램] [실행인자들...]

by 스파이크 | 2008/06/15 13:34 | Liunx | 트랙백 | 덧글(0)

CString의 문자열을 토큰분리 하기...

MFC에서 사용되는 CString으로 선언된 문자열 변수의 내용을

토큰으로 분리하는 소스는 다음과 같다...

 

 

     // 문자열 선언

     CString value = "100,50,-20,88,-65,0,27";

 

     // 토큰 갯수 체크
    
int cnt = 0;

 

     // 임시 토큰 저장 변수
     CString tmp;

 

     // 토큰 일괄 불러오기
     while(1)
     {
          if(!AfxExtractSubString(tmp, value, cnt++, ','))
          {
               /* 토큰 불러오기가 완료되면
                   반복문을 종료함
               */
               
break;
          }
     }

 

 

     * AfxExtractSubString(A, B, C, D)

        - A : 문자열(토큰)를 받아올 스트링

        - B : 전체 문자열

        - C : 받아올 문자열(토큰)의 위치

        - D : 문자열(토큰) 사이의 구분자

by 스파이크 | 2008/06/09 16:11 | MFC | 트랙백 | 덧글(0)

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