문제

다음 메시지 중 하나로 결국 충돌하는 소프트웨어를 디버깅하고 있습니다.

1. DAMAGE: after normal block (#24729280) at 0x00D710E0
2. Debug Assertion Failed
   Program: D:\Soft\Test.exe
   File: dbgheap.c
   Line: 1017

   Expression: _BLOCK_TYPE_IS_VALID(phead->nBlockUse)

이 소프트웨어는 정말 오래되었지만 지금은 변경하는 것은 옵션이 아닙니다. Visual C ++ 6.0에 작성되었습니다. 우리는 그것이 일종의 버퍼 오버플로라고 추측하고 있기 때문에 그것이 어디에서 일어나고 있는지 감지하는 방법을 찾으려고 노력하고 있습니다.

나는 정보를 찾았다 PageHeap (내가 원하는 것을 말할 수있는 것 같다) gflags, 그러나 나는 그것을 작동시킬 수없는 것 같습니다.

테스트 프로그램을 만들었습니다.

char* test;
test = new char[5];
test[5] = 'a';
delete[] test;

오류가 발생합니다.

DAMAGE: after normal block (#55) at 0x1671920

그런 다음 실행하여 PageHeap을 첨부하려고 시도했습니다.

gflags.exe /p /enable MemoryTest.exe /full

그런 다음 IT를 다시 시작하여 (Visual C ++ 6.0 인터페이스와 Windows 탐색기를 통해) 동일한 오류가 발생했습니다.

그런 다음 릴리스 버전을 컴파일하려고 시도하고 Visual C ++ 6.0 인터페이스를 통해 실행하여 오류를 얻었습니다.

User breakpoint called from code at 0x7c90120e

그리고 Windows 탐색기에서 방금 오류 보고서를 보내달라고 Windows 대화 상자를 받았습니다.

내가 무엇을 놓치고 있습니까?

도움이 되었습니까?

해결책

첨부를 통해 릴리스 모드로 응용 프로그램을 실행할 수 있습니다. Windbg.

  • 활성화 gflags (당신이 언급했듯이)
  • 릴리스 모드에서 응용 프로그램을 시작하십시오.
  • WindBG에 연결하여 사용하십시오 Attach to process Windbg의 옵션.
  • 릴리스 PDB를위한 올바른 경로를 구성하십시오.
  • PDB를 수동으로 다시로드하십시오.reload /f 자동 로딩의 경우 실패합니다.
  • 유스 케이스를 수행하십시오.

WINDBG는 예외가 발생할 때마다 실행을 중지합니다. 첫 번째 기회 예외마다 이유를 분석하십시오. 충돌의 오류 중 하나 일 수 있습니다.

다른 팁

GFLAGS/PAGEHEAP을 사용하기 전에 액세스 위반 예외를 확인하는 것이 좋습니다. 먼저 빌드-> 시작 디버그-> 프로세스 옵션에 첨부를 사용하여 프로세스를 첨부하십시오. 첨부되면 디버그-> 예외로 이동하여 액세스 위반 예외를 활성화하여 액세스 위반을 선택하고 항상 확인란을 선택하십시오. 그런 다음 디버거가 액세스 위반 예외를 포착하는지 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top