WinDbg Dr. Watson minidump - requer APO / dll originalmente construído para a versão instalada?

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

Pergunta

Eu tenho um arquivo mindmp de travamento de aplicação de um alvo. É possível para mim para reconstruir os arquivos DLL / APO para uma versão do software e ter windbg símbolos de carga corretamente?

O meu problema é que os nossos arquivos PDB só são mantidos por grandes lançamentos (infelizmente). Esta é uma compilação diária, que pode reconstruir-me, mas eu estou ficando até tropeçou em erros.

Com barulhento sym on! "Cabeçalho da imagem não corresponde cabeçalho de imagem de memória."

DBGENG:  C:\...\XXX.dll image header does not match memory image header.
DBGENG:  XXX.dll - Partial symbol image load missing image info
DBGHELP: Module is not fully loaded into memory.
DBGHELP: Searching for symbols using debugger-provided data.
DBGHELP: C:\...\XXX.pdb - mismatched pdb

Nota tenho construir o PDB com o dll, eles são do mesmo diretório RELEASE (devo ser a construção de depuração?)

Teses são compilações (como compilações estão instalados no alvo e bater) Eu deveria estar de alguma forma usando as DLLs compilação de depuração para obter mais informações símbolo?

Foi útil?

Solução

Na minha experiência, provavelmente não.

Se você tem o diretório de compilação exata e construir com os exata mesmos configurações do compilador, em seguida, este trabalho poder. Você definitivamente não vai ser capaz de carregar símbolos de uma compilação de depuração contra um despejo de memória liberação.

Você precisa ativar as opções 'load qualquer coisa':. .Symopt + 0x40 para obter windbg a ignorar as diferenças timestamp

Outras dicas

utilitário

O ChkMatch é projetado para este cenário exato. Contanto que você tem a .EXE original, você pode recompilar as fontes (com o mesmo compilador e configurações do compilador) e corrigir o novo .PDB para coincidir com a idade .EXE.

Neste exemplo, OriginalExecutable.exe é o executável que já não tem um ficheiro.PDB, e RebuiltPDB.pdb é um que foi produzido pela reconstrução do original fonte.

chkmatch -m OriginalExecutable.exe RebuiltPDB.pdb

Agora, desde que os dois arquivos têm seus nomes originais, o depurador deve aceitá-los como um par correspondente.

Se você ainda tem o código fonte exata a imagem foi compilado a partir de, depois reconstruí-lo a produzir um novo arquivo PDB e depois instruir WinDbg para forçar carregar este pdb quando você abre o despejo de memória - que funcionou uma vez em minha prática.

arquivos PDB estão vinculados a seus arquivos EXE por um GUID e um "idade" (é um número sequencial). Estes são incorporados no EXE, e para a APO. O GUID é regenerado em cada compilação completa, e a "idade" é alterado em cada compilação incremental.

O depurador usa estes para garantir que ele está olhando para o PDB correto para o arquivo EXE.

Eu não sabia sobre a ferramenta "chkmatch" mencionado por Steveman, mas eu suspeito que ele funciona por tentar remendar o GUID / ano para que eles correspondam.

Este é tarde demais para ajudar Doug, mas por causa de qualquer um que se depara com esta questão, outro segmento ( é possível carregar símbolos incompatíveis no Visual studio? ) apontou uma maneira de obter WinDbg para aceitar ficheiros.PDB sem correspondência

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