Como evitar “(nulo)” StackTrace em DPH_BLOCK_INFORMATION?
Pergunta
Eu estou tendo uma explosão rastrear alguns corrupção de pilha. Eu habilitado página padrão pilha de verificação com
gflags /p /enable myprogram.exe
e isso consegue confirmar a corrupção:
=========================================================== VERIFIER STOP 00000008: pid 0x1040: corrupted suffix pattern 10C61000 : Heap handle 19BE0CF8 : Heap block 00000010 : Block size 00000000 : ===========================================================
Quando eu ativar a verificação de pilha de página inteira (gflags /p /enable myprogram.exe /full
) na expectativa de que isso fará com que um erro ocorra no momento da corrupção é introduzida, recebo nada mais.
Eu comecei a levantar minhas esperanças ao ler avançadas do Windows Debugging: corrupção de memória parte II-Heaps , que é um capítulo do avançadas do Windows Debugging . Eu instalei WinDbg, e baixado símbolos de depuração para user32.dll
, kernel32.dll
, ntdll.dll
acordo com http://support.microsoft. com / kb / 311503 . Agora, quando as paradas de programa no depurador eu posso emitir este comando para ver informações sobre a pilha de página:
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
Estou consternado com o rastreamento de pilha (null)
. Agora, http://msdn.microsoft.com/ en-us / library / ms220938% 28VS.80% 29.aspx diz:
O campo StackTrace vai nem sempre contêm um valor não nulo, por várias razões. Primeiro de tudo detecção de rastreamento de pilha é suportado apenas em x86 plataformas e segundo, mesmo em x86 máquinas os algoritmos de detecção de rastreamento de pilha não são totalmente confiáveis. Se o bloco é um bloco alocado o rastreamento de pilha é o momento de alocação. Se o bloco foi libertado, o rastreamento de pilha é o momento livre.
Mas eu me pergunto se alguém tem alguma opinião sobre aumentando as chances de ver o rastreamento de pilha a partir do momento de alocação.
Obrigado por ler!
Solução
Ah ha! Acontece que eu precisava para permitir mais opções gflags
:
gflags /i myprogram.exe +ust
O que tem esse efeito:
ust - Create user mode stack trace database
Parece simples quando eu ver descrição dos parâmetros. Tolo me. Mas eu também parecem necessidade de definir o tamanho do banco de dados de rastreamento antes que ele terá efeito:
gflags /i myprogram.exe /tracedb 512
... ou o que quer (em MB).
Outras dicas
De acordo com a Microsoft, a função malloc no módulo C run-time (CRT) usa a omissão ponteiro do quadro (FPO) em algumas versões do Windows. Você não pode ver as informações de pilha completa de função malloc. (Http://support.microsoft.com/kb/268343)
Se possível, tente vincular a versão CRT de depuração, por exemplo, ligação opção / MDd com, para resolver esta questão.