2017-01-10 2 views
2

아주 오래된, 큰 C++ 프로젝트를 디버깅하려고합니다.감지 된 메모리 누수

Detected memory leaks! 
Dumping objects -> 
{629} normal block at 0x0000000000084CA0, 16 bytes long. 
Data: < ?   > D0 A7 F0 3F 01 00 00 00 00 00 00 00 00 00 00 00 
{628} normal block at 0x0000000000084C20, 16 bytes long. 
Data: < ?   > 10 A9 F0 3F 01 00 00 00 00 00 00 00 00 00 00 00 
{5667963} normal block at 0x000000000709FB20, 88 bytes long. 
.... 
.... 
Data: <p  3  > 70 D0 0F 07 00 00 00 00 33 00 00 00 00 01 00 00 
Object dump complete. 
The program '[4892] Classifier.exe' has exited with code 0 (0x0). 

가 나는 그것의 아주 큰부터 프로그램을 붙여 드릴 수 없습니다 만 디버그 모드에서이

void main(int argc, char *argv[]) 
{ 
    try 
    { 

    _CrtDumpMemoryLeaks(); //memory leak detection 
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG); 
    .... 
    .... 
    } 
    catch() 
    { .... 
    } 
} 

이 프로그램이 성공적으로 실행처럼 간다 : 다음과 같은 오류를주고있다. 그러나, 출력에서 ​​위의 오류 메시지를 참조하십시오. 아니요 출력에서 ​​어디에서 메모리 누수가 탐지되었는지에 대한 정보를 얻을 수있는 라인 번호를 찾을 수 있습니다.

줄 번호를 보려면 추가해야 할 것이 있습니까?

는 보통 메모리의 629 할당을 의미합니다, 당신은

+1

을 제공합니다 메시지. –

+0

메모리 누수가 감지되면 메모리가 생성 된 위치를 알아 내야합니다. –

답변

5

_CrtSetBreakAlloc(629); 

629 덤프 로그에 표시되는 내용입니다 _CrtSetDbgFlag

후이 줄을 추가 감사드립니다. 디버그를 다시 실행하면 해당 할당에서 중단되고 호출 스택을 검사하여 그 내용을 확인할 수 있습니다.

+1

다음 실행에서 코드가 동일한 할당 순서를 수행하는 경우에만 트릭을 수행합니다. 따라서 매번 동일한 순서로 프로그램을 실행하여 순서를 시도하고 보증하십시오. –

+0

그리고 1 개 이상의 스레드가 "모든 희망을 버리십시오." 전체 코드 검사를하기 전에 여전히 가장 좋은 대답입니다. –

+0

불가능하지는 않지만 더 많은 노력과 인내가 필요합니다. 가치있는 질문 일뿐입니다. –

0

microsoft documentation에 따르면, 먼저 포함해야합니다 파일과 누수 된 메모리가 먼저 할당 된 행 번호의 이름을 보여줍니다 더 나은 보고서를 얻을

#define _CRTDBG_MAP_ALLOC 
#include <cstdlib> 
#include <crtdbg.h> 

그리고 프로그램이 new을 사용하는 경우 _CRTDBG_MAP_ALLOC

, 이 파일의 공정한 금액을 가지고있는 경우 귀하의 경우, 오래된 프로그램을 디버깅
#ifdef _DEBUG 
    #define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__) 
#else 
    #define DBG_NEW new 
#endif 

매우 유용되지 않습니다 :하지 malloc의 할당을 위해, 당신은이 매크로를 정의해야합니다. 그러나 수행 할 수있는 트릭이 있습니다.

#define new new (_NORMAL_BLOCK , __FILE__ , __LINE__) 

그러나이 트릭에는 몇 가지 단점이 있습니다. 예를 들어, 클래스가 new을 무시하거나 프로그램이 placement new을 사용하는 경우

연산자 newdelete도 다시 정의 할 수 있습니다. 여기에이 오래된 프로그램에서 누수를 감지 할 수있는 방법에 대한 좋은 기사입니다 : link

편집 : 여기 누군가가 오류 아니에요 기존 프로그램을 디버깅 매크로 DBG_NEW를 사용하는 또 다른 방법, link