dph_block_information에서 "(null)"스택 트레이스를 피하는 방법?
문제
나는 힙 부패를 추적하는 폭발을 가지고 있습니다. 표준 페이지 힙 확인을 활성화했습니다
gflags /p /enable myprogram.exe
그리고 이것은 부패를 확인하는 데 성공합니다.
=========================================================== VERIFIER STOP 00000008: pid 0x1040: corrupted suffix pattern 10C61000 : Heap handle 19BE0CF8 : Heap block 00000010 : Block size 00000000 : ===========================================================
전체 페이지 힙 확인을 켜면 (gflags /p /enable myprogram.exe /full
) 부패가 도입 될 때 오류가 발생할 것으로 기대하면 더 이상 아무것도 얻지 못합니다.
나는 읽는 동안 내 희망을 얻기 시작했다 고급 Windows 디버깅 : 메모리 손상 파트 II— HEAPS, 이것은 장입니다 고급 Windows 디버깅. WindBG를 설치하고 디버그 기호를 다운로드했습니다 user32.dll
, kernel32.dll
, ntdll.dll
~에 따르면 http://support.microsoft.com/kb/311503. 이제 프로그램이 디버거에서 중단되면이 명령을 발행하여 힙 페이지에 대한 정보를 볼 수 있습니다.
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 필드에 여러 가지 이유로 널 값이 아닌 값이 항상 포함되지는 않습니다. 우선 스택 추적 감지는 X86 플랫폼에서만 지원됩니다. 두 번째는 X86 시스템에서도 스택 트레이스 감지 알고리즘이 완전히 신뢰할 수 없습니다. 블록이 할당 된 블록 인 경우 스택 추적은 할당 모멘트입니다. 블록이 풀리면 스택 추적은 자유 순간입니다.
그러나 할당 순간에서 스택 추적을 볼 가능성이 높아지는 사람이 누구나 생각하는지 궁금합니다.
읽어 주셔서 감사합니다!
해결책
아,! 더 많은 것을 가능하게해야했습니다 gflags
옵션 :
gflags /i myprogram.exe +ust
이 효과가있는 다음과 같습니다.
ust - Create user mode stack trace database
매개 변수 설명을 볼 때 간단 해 보입니다. 바보 나. 그러나 트레이스 데이터베이스의 크기가 적용되기 전에 다음을 설정해야합니다.
gflags /i myprogram.exe /tracedb 512
... 또는 무엇이든 (MB).
다른 팁
Microsoft에 따르면, C Runtime (CRT) 모듈의 Malloc 함수는 일부 Windows 버전에서 FPO (Frame Pointer Oceision)를 사용합니다. Malloc 함수의 전체 스택 정보가 표시되지 않을 수 있습니다. (http://support.microsoft.com/kb/268343)
가능하면 디버그 버전 CRT (예 : /MDD 옵션)를 연결 하여이 문제를 해결하십시오.