2010-06-03 5 views
3

내가 비주얼 스튜디오 9.0에서 "출력"창에서이 메시지를 인쇄 디버깅 오전 MFC 프로그램 :Visual C++ : 할당 크기가 잘못되었습니다. 디버거가이 메시지에서 멈추도록 강제하는 방법?

HEAP[AppName.exe]: Invalid allocation size - 99999998 (exceeded 7ffdefff) 

나는이 나쁜 "새로운", 초기화되지 않은 변수 또는 유사한 오류로 인해 확신 .

질문 : 스택 추적을보고 문제를 해결할 수 있도록이 메시지에서 디버거를 멈추게하려면 어떻게해야합니까?


편집 : 다음 스 니펫은 동일한 경고를 표시하지 않습니다. 대신 Invalid allocation size: 4294967295 bytes. 스타일 메시지가 생성됩니다.

int stupid = -1; 
char *bob = new char[stupid]; 

그리고 :

malloc(-1); 

그래서, 나는 그것이 자신의 메모리 관리와 시스템 DLL 내에서오고하거나 다른 API를 사용하고 생각한다.

답변

4

오류 메시지는 아마도 ntdll.dll의 HeapAlloc()에서 나옵니다.

나는 다음과 같은 코드로 메시지를 재현 할 수

는 :

HANDLE hHeap = HeapCreate(0, 0, 4096); 
LPVOID p = HeapAlloc(hHeap, 0, 0x99999998); 

메시지가 NTDLL.DLL에 DbgPrint()하여 디버거 출력 창으로 전송됩니다, 그래서 내가 거기에 중단 점을 설정하려고 할 것이다 (이것은 내 보낸 함수의 따라서 주소를 찾기 위해 심볼 파일이 필요하지 않습니다.) 그리고 콜 스택을 살펴보십시오.

+0

거기서 깨지는 데 문제가 있습니다. 나는'{,, ntdll.dll} _DbgPrint @ 4'의 다양한 조합을 시도했습니다. 어떤 아이디어? –

+0

하나의 방법은 ntdll.dll에서'dumpbin'을 사용하여'DbgPrint()'의 이미지베이스와 오프셋을 찾고, 둘을 합쳐서 함수의 가상 주소를 찾은 다음 그 주소에 브레이크 포인트를 만듭니다. 프로세스가 실행되면 완료됩니다. 따라서 단계별로 설정 한 다음 중단 점을 설정 한 다음 계속해야합니다. –

+0

언어를'Unknown '로 설정하고'{,, ntdll.dll} _DbgPrint' 함수를 사용하여 중단 점을 작동 시키십시오. 알았다! 힙 메시지로 연결되는'CListCtrl :: GetColumn' 호출. –

0

이 시도 :

메뉴 바에서 Debug -> Exceptions로 이동합니다. std::bad_alloc이라는 C++-Exception을 추가하고 Thrown 확인란을 선택하여 예외가 발생한 곳을 중지합니다.

+0

이 아이디어는 디버거의주의를 끌지 못했습니다. 디버거에 경고 문자열을 보내는 함수를 중단 할 수있는 방법이 있습니까? –

+0

죄송합니다 ... 아이디어가 없습니다. – Simon

0

해당 기능의 위치 또는 기능의 위치를 ​​알고 계십니까? 오류 메시지의 문자열에 대한 런타임 소스를 Grep하십시오. 디버그 -> 새 중단 점 대화 상자에서 함수 호출이나 파일/위치에 중단 점을 설정해보십시오.

그래도 작동하지 않으면 커다란 총을 부수어 낼 수 있지만 (힘들고 시간이 많이 소요됩니다) 기능이 구현 된 파일을 수정하십시오 (헤더에있는 경우 - .cpp 인 경우). 파일은 더 많은 작업입니다). 추가 :

__asm { 
    int 3; 
} 

수동으로 '디버거에 침입'opcode를 삽입하십시오. 이것은 디버거가 중단 점의 위치를 ​​올바르게 식별하지 못하는 DLL에서 중단 점을 강제 실행하는 데 자주 사용하는 트릭입니다.

1

이 오류 메시지는 Program Files \ Microsoft Visual Studio 9.0 \ VC \ crt \ src에있는 dbgheap.c의 409 줄에 인쇄됩니다. 거기에 중단 점을 설정할 수 있어야합니다.

+0

그건 같은 메시지가 아니야 : '_RPT1 (_CRT_ERROR, "잘못된 할당 크기 : % IU 바이트. \ n", nSize);' –

관련 문제