반응형

http://blog.naver.com/kimig82?Redirect=Log&logNo=80086088092

3.2 메모리릭 발생 위치에 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"를 참고했음.

=================================================================================================

Visual Studio 디버거
방법: 메모리 할당 번호에 중단점 설정

이 항목은 다음 언어에 적용됩니다.

Visual Studio Edition

Visual Basic

C#

C++

J#

Express

아니요

아니요

Native

아니요

Standard

아니요

아니요

Native

아니요

Pro/Team

아니요

아니요

Native

아니요

Note참고

실제 설정이나 버전에 따라서 화면에 나타나는 대화 상자와 메뉴 명령이 도움말의 설명과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 Visual Studio 설정을 참조하십시오.

메모리 누수 보고서에 있는 파일 이름과 줄 번호를 보면 누수된 메모리가 할당된 위치를 알 수 있습니다. 그러나 메모리 할당 위치를 안다고 해서 반드시 문제를 식별할 수 있는 것은 아닙니다. 프로그램을 실행하는 도중에 할당이 여러 번 호출되지만 특정 호출에 대해서만 메모리 누수가 발생할 수 있습니다. 문제를 식별하려면 누수된 메모리가 할당된 위치와 누수 발생 조건을 알아야 합니다. 그러기 위해서는 메모리 할당 번호가 필요합니다. 메모리 할당 번호는 파일 이름과 줄 번호 다음의 중괄호에 표시됩니다. 예를 들어, 다음 출력에서 메모리 할당 번호는 18입니다. 이는 누수된 메모리가 18번째로 프로그램에 할당된 메모리 블록임을 뜻합니다.

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

프로그램을 실행하는 동안 CRT 라이브러리는 CRT 라이브러리나 MFC와 같은 다른 라이브러리가 할당한 메모리를 비롯하여 할당된 모든 메모리 블록을 계산합니다. 따라서 할당 번호가 N인 개체는 프로그램에 할당된 N 번째 개체입니다. 그러나 코드에서 할당한 N 번째 개체는 아닐 수도 있습니다. 대부분의 경우 그렇지 않습니다.

할당 번호를 사용하여 메모리가 할당된 위치에 중단점을 설정할 수 있습니다. 먼저 프로그램의 시작 부분에 위치 중단점을 설정하십시오. 이 위치에서 프로그램이 중단되면 간략한 조사식 대화 상자나 조사식 창에서 메모리 할당 중단점을 설정할 수 있습니다.

프로시저

조사식 창에서 메모리 할당 중단점을 설정하려면

  1. 조사식 창에서 이름 열에 다음 식을 입력합니다.

    _crtBreakAlloc

    CRT 라이브러리의 다중 스레드 DLL 버전을 사용할 경우(/MD 옵션) 다음과 같이 컨텍스트 연산자를 포함해야 합니다.

    {,,msvcr71d.dll}_crtBreakAlloc
  2. RETURN 키를 누릅니다.

    디버거에서 호출을 계산하고 값 열에 결과를 표시합니다. 메모리를 할당할 때 중단점을 설정하지 않은 경우에는 이 값이 –1입니다.

  3. 열에 있는 값을 중단할 메모리 할당 번호로 대체합니다. 예를 들어, 위의 출력에서는 중단할 메모리 할당 번호가 18입니다.

원하는 메모리 할당에 중단점을 설정한 다음 디버깅을 계속할 수 있습니다. 이전과 같은 조건에서 프로그램을 실행하려면 할당 순서가 변경되지 않도록 주의하십시오. 지정된 메모리 할당에서 프로그램이 중단되면 호출 스택 창과 다른 디버거 정보를 살펴 보고 메모리가 할당된 조건을 확인할 수 있습니다. 필요한 경우 해당 지점에서 프로그램을 계속 실행하면 개체의 진행 상황과 할당 취소가 제대로 이루어지지 않는 이유도 알 수 있습니다.

Note참고

개체에 데이터 중단점을 설정하는 것이 좋습니다. 자세한 내용은 방법: 데이터 중단점 설정(네이티브 전용)을 참조하십시오.

대개 디버거에서 메모리 할당 중단점을 설정하는 것이 더 쉽지만 경우에 따라 코드에서 설정할 수도 있습니다.

코드에서 메모리 할당 중단점을 설정하려면

  • 다음과 같은 줄을 추가합니다(열 여덟째 메모리 할당인 경우).

    _crtBreakAlloc = 18;

_CrtSetBreakAlloc 함수를 대신 사용해도 같은 효과가 있습니다.

_CrtSetBreakAlloc(18);

참고 항목

반응형

+ Recent posts