방법: 메모리 할당 번호에 중단점 설정
이 항목은 다음 언어에 적용됩니다.
Edition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
네이티브 전용 |
||||
Pro, Premium 및 Ultimate |
네이티브 전용 |
참고
대화 상자 및 메뉴 명령은 실제 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다.설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다.자세한 내용은 설정에 대한 작업을 참조하십시오.
메모리 누수 보고서에 있는 파일 이름과 줄 번호를 보면 누수된 메모리가 할당된 위치를 알 수 있습니다. 그러나 메모리 할당 위치를 안다고 해서 반드시 문제를 식별할 수 있는 것은 아닙니다.프로그램을 실행하는 도중에 할당이 여러 번 호출되지만 특정 호출에 대해서만 메모리 누수가 발생할 수 있습니다.문제를 식별하려면 누수된 메모리가 할당된 위치와 누수 발생 조건을 알아야 합니다.그러기 위해서는 메모리 할당 번호가 필요합니다.메모리 할당 번호는 파일 이름과 줄 번호 다음의 중괄호에 표시됩니다.예를 들어, 다음 출력에서 메모리 할당 번호는 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 번째 개체는 아닐 수도 있습니다.대부분의 경우 그렇지 않습니다.
할당 번호를 사용하여 메모리가 할당된 위치에 중단점을 설정할 수 있습니다.먼저 프로그램의 시작 부분에 위치 중단점을 설정하십시오.이 위치에서 프로그램이 중단되면 간략한 조사식 대화 상자나 조사식 창에서 메모리 할당 중단점을 설정할 수 있습니다.
절차
조사식 창에서 메모리 할당 중단점을 설정하려면
조사식 창에서 이름 열에 다음 식을 입력합니다.
_crtBreakAlloc
CRT 라이브러리의 다중 스레드 DLL 버전을 사용할 경우(/MD 옵션) 다음과 같이 컨텍스트 연산자를 포함해야 합니다.
{,,msvcr100d.dll}_crtBreakAlloc
RETURN 키를 누릅니다.
디버거에서 호출을 계산하고 값 열에 결과를 표시합니다.메모리를 할당할 때 중단점을 설정하지 않은 경우에는 이 값이 –1입니다.
값 열에 있는 값을 중단할 메모리 할당 번호로 대체합니다.예를 들어, 위의 출력에서는 중단할 메모리 할당 번호가 18입니다.
원하는 메모리 할당에 중단점을 설정한 다음 디버깅을 계속할 수 있습니다.이전과 같은 조건에서 프로그램을 실행하려면 할당 순서가 변경되지 않도록 주의하십시오.지정된 메모리 할당에서 프로그램이 중단되면 호출 스택 창과 다른 디버거 정보를 살펴 보고 메모리가 할당된 조건을 확인할 수 있습니다.필요한 경우 해당 지점에서 프로그램을 계속 실행하면 개체의 진행 상황과 할당 취소가 제대로 이루어지지 않는 이유도 알 수 있습니다.
참고
개체에 데이터 중단점을 설정하는 것이 좋습니다.자세한 내용은 방법: 데이터 중단점 설정(네이티브 전용)을 참조하십시오.
대개 디버거에서 메모리 할당 중단점을 설정하는 것이 더 쉽지만 경우에 따라 코드에서 설정할 수도 있습니다.
코드에서 메모리 할당 중단점을 설정하려면
다음과 같은 줄을 추가합니다(열 여덟째 메모리 할당인 경우).
_crtBreakAlloc = 18;
_CrtSetBreakAlloc 함수를 대신 사용해도 같은 효과가 있습니다.
_CrtSetBreakAlloc(18);