Post-mortem depuração crash-despejo sem ter a versão exata de um DLL do Windows no servidor de símbolos

StackOverflow https://stackoverflow.com/questions/2237017

Pergunta

Dentro do meu aplicativo, eu uso a função MiniDumpWriteDump (veja dbghelp.dll) para escrever um arquivo despejo de memória sempre que meus aplicativo falhar.

Eu também usar um servidor de símbolos para armazenar todos os meus arquivos executáveis ??e arquivos PDB, de modo que sempre que um cliente me envia um arquivo crash-despejo, o depurador automaticamente pega a versão correta do executável e as informações de depuração.

Eu também armazenar Windows DLL do (ntdll.dll, kernel32.dll, ...) e suas informações de depuração no servidor de símbolos (usando Symchk). As informações de depuração é obtido a partir do servidor de símbolos públicos da Microsoft.

Na maioria das vezes isso funciona perfeito, exceto quando:

  • um cliente deixa de funcionar em um dos do Windows DLL o
  • e os usos de clientes da DLL que eu não colocar no servidor de símbolos

Isso é porque ele é muito reversível para armazenar todos os sabores de todos os Windows DLL na Symbol Server (especialmente com os patches semanais).

Assim, se um cliente deixa de funcionar em, digamos, a versão 5.2.123.456 de NTDLL.DLL, e eu não colocar esta versão exata do DLL em minha Symbol Server, então eu estou preso. Mesmo servidor símbolo público da Microsoft não ajuda, porque ele só fornece as informações de depuração, e não o DLL é em si.

Minha solução atual é a de pedir ao cliente para sua DLL, mas isso não é sempre fácil. Portanto, eu estou procurando uma solução melhor.

Existe uma maneira de obter o depurador mostrando uma pilha de chamadas correto, ou carregar as informações de depuração de um DLL específico, mesmo se você não tiver a versão exata do DLL?

Como alternativa, há uma maneira de obter todas as versões de todos (ou a importante) Windows DLL do (da Microsoft)?

EDIT:

Nesse meio tempo eu encontrei uma maneira muito fácil de resolver este problema. Com a ModuleRescue utilidade (ver http://www.debuginfo.com/tools/modulerescue.html ) você pode gerar manequim DLL a partir de um arquivo de minidespejo. Com estes manequim DLL, o depurador está satisfeito, e corretamente começa a carregar os símbolos de depuração dos servidores da Microsoft.

Foi útil?

Solução

É possível relaxar resolução símbolo do WinDbg; ver o meu para uma pergunta semelhante. Por outro lado, a solução que proponho aqui se baseia no fato de que as DLLs são idênticas para além de ter diferentes GUIDs que identificam os seus símbolos de depuração. Uma versão diferente de uma DLL é provavelmente vai ter um binário diferente, então os símbolos provavelmente não vão corresponder corretamente, mesmo se você pode levá-los a carga.

Outras dicas

Eu tenho certeza servidor de símbolos da Microsoft também fornece os binários. Eu estou olhando em minha loja e eu ver uma tonelada de arquivos da Microsoft .dll. Tenho minha _NT_SYMBOL_PATH definido como

SRV*F:\Symbols\Microsoft*http://msdl.microsoft.com/download/symbols

Desta forma, ele irá procurar minha loja local primeiro, antes de tentar copiá-los para baixo do servidor público da Microsoft.

Você pode ter múltipla servidores símbolo no seu caminho de símbolo. Então, basta configurar o caminho de símbolo para apontar para seu próprio servidor para seus próprios módulos particulares, e para o servidor MS pública para os módulos SO, consulte Símbolo Path :

Isto pode ser facilmente combinado com o armazenamento de símbolo pública Microsoft usando os seguintes ajustes iniciais:

_NT_SYMBOL_PATH=srv*c:\mysymbols*http://msdl.microsoft.com/download/symbols;cache*c:\mysymbols

O Microsoft Public Símbolo loja está documentada como http://msdl.microsoft.com/download/symbols .

? Que parte não está funcionando?

Eu nunca estive em sua situação, exatamente, mas eu esperaria que o depurador para lhe dar a parte correta da pilha de chamadas que estava em seu código, até a chamada para o dll escuro. Claro que, a partir daí até os símbolos queda real estaria indisponível, mas você não pode ver que NTDLL API estava sendo chamado e quais argumentos foram passados ??a esse chamado?

Você não diz qual ferramenta você está usando para depuração minidump:. WinDBG ou VS

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