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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top