2009-09-18 4 views
1

나는 힙 손상을 추적하고있다. 나는DPH_BLOCK_INFORMATION에서 "(null)"StackTrace를 피하는 방법?

gflags /p /enable myprogram.exe 

표준 페이지 힙 인증을 사용하도록 설정 한이는 손상 확인에 성공 : 나는 기대에 전체 페이지 힙 검증 (gflags /p /enable myprogram.exe /full)를 켜면

=========================================================== 
VERIFIER STOP 00000008: pid 0x1040: corrupted suffix pattern 

    10C61000 : Heap handle 
    19BE0CF8 : Heap block 
    00000010 : Block size 
    00000000 : 
===========================================================

이 오류가 발생할 수 있음을 부패가 시작될 때 발생하기 위해, 나는 더 이상 아무것도 얻지 못한다.

Advanced Windows Debugging: Memory Corruption Part II—Heaps을 읽는 동안 나는 희망을 갖기 시작했습니다. 이것은 의 장입니다. WinDbg를 설치하고 에 따라 user32.dll, kernel32.dll, ntdll.dll에 대한 디버그 기호를 다운로드했습니다. 프로그램이 디버거에서 중단 이제 때 힙 페이지에 대한 정보를 보려면이 명령을 실행할 수 있습니다 :

0:000> dt _DPH_BLOCK_INFORMATION 19BE0CF8-0x20 
ntdll!_DPH_BLOCK_INFORMATION 
    +0x000 StartStamp  : 0xabcdaaaa 
    +0x004 Heap    : 0x90c61000 
    +0x008 RequestedSize : 0x10 
    +0x00c ActualSize  : 0x38 
    +0x010 FreeQueue  : _LIST_ENTRY [ 0x0 - 0x0 ] 
    +0x010 TraceIndex  : 0 
    +0x018 StackTrace  : (null) 
    +0x01c EndStamp   : 0xdcbaaaaa

나는 (null) 스택 추적에 의해 놀라지입니다. 자, http://msdn.microsoft.com/en-us/library/ms220938%28VS.80%29.aspx는 다음과 같이 말합니다 :

StackTrace 필드는 다양한 이유에서 항상 null이 아닌 값을 포함하지는 않습니다. 우선 스택 추적 검색은 x86 플랫폼에서만 지원되며 둘째, x86 시스템에서도 스택 추적 감지 알고리즘이 완전히 신뢰할 수 없습니다. 블록이 할당 된 블록이면 스택 추적은 할당 순간을 나타냅니다. 블록이 해제 된 경우 스택 추적은 자유 시간 동안 수행됩니다.

그러나 누가 할당 순간부터 스택 추적을 볼 가능성을 높이는 데 어떤 생각이 있는지 궁금합니다.

읽어 주셔서 감사합니다.

답변

1

아하! 좀 더 gflags 옵션을 활성화하는 데 필요한 밝혀 :

이 효과가
gflags /i myprogram.exe +ust

: 나는 매개 변수 설명을 참조 할 때

ust - Create user mode stack trace database

가 간단 보인다합니다. 바보 나. 그러나 나는 또한 영향을 미치기 전에 추적 데이터베이스의 크기를 설정해야하는 것 같습니다 :

gflags /i myprogram.exe /tracedb 512

... 또는 무엇이든지 (MB).

1

Microsoft에 따르면 C 런타임 (CRT) 모듈의 malloc 함수는 일부 Windows 버전에서 FPO (프레임 포인터 누락)를 사용합니다. malloc 함수의 전체 스택 정보를 볼 수 없습니다. (http://support.microsoft.com/kb/268343)

가능하면 디버그 버전 CRT (예 : 이 문제를 해결하려면/MDd 옵션과 링크하십시오.