Pergunta

O nosso processo de compilação noturno foi quebrado por um longo tempo, de tal forma que ele gerou arquivos PDB que eram poucas horas diferentes na idade do que os arquivos de imagem correspondentes. Tenho visto que corrigiu o problema.

No entanto, eu gostaria de começar a usar um servidor de símbolos, mas não pode devido a ter que usar esses arquivos PDB incompatíveis idade. I contornar esse problema usando a .symopt + 0x40 método em windbg. Isso significa que tenho de organizar todos os meus arquivos APO lado, e depois de anos e anos de lançamentos, que acrescenta-se.

Eu estou procurando uma maneira de modificar o mecanismo que usa WinDbg para marcar a idade de um APO, e forçá-lo para coincidir com o meu arquivo de imagem. O utilitário ChkMatch faz algo semelhante, mas para assinaturas APO. Os estados desenvolvedor na página "ChkMatch é capaz de fazer um jogo arquivo executável e PDB se eles têm assinaturas diferentes, mas a mesma idade (ver este artigo para obter mais informações sobre a assinatura PDB e idade). Se os difere de idade, a ferramenta não pode fazer os arquivos corresponder. "

Eu dei uma olhada dentro de um editor hexadecimal, e ainda encontrou o que parecia ser os bits correspondentes à idade, mas deve puxar mais alguns truques internamente, porque eu não poderia obtê-lo para o trabalho.

Todas as idéias?

Editar : Não sei se isso ajuda, mas no meu caso particular, a diferença de idade foi causado por desnecessariamente religação dll, que recriam os arquivos PDB também. No entanto, o nosso processo de compilação foi armazenar as DLLs originais (antes da relink) e o APO após a relink. Eu pensei em alguma forma recriando tal situação à mão. Significado, forçando um relink em uma DLL, mas salvar fora da APO em ambos os casos. Então eu poderia fazer uma comparação binária dos dois arquivos para ver como eles mudaram. Talvez executar algum tipo de patch de software que faz isso automaticamente? Ao ver o que exatamente mudou no meu caso controle, talvez eu poderia fazer o mesmo para as DLLs e PDBs guardados no meu processo de construção empresas?

Editar : Eu percebi isso !!!! Graças a um dos comentários sobre a primeira resposta, eu verifiquei um link para os pdfs do livro "indocumentado Windows 2000 Secrets: Um programadores Cookbook". E o autor entra em grandes detalhes sobre o formato de arquivo PDB. Como eu disse antes, eu já tinha carregado o APO em um editor hexadecimal e capotou alguns bits em torno aparecendo que fiz a Faixa Etária / assinatura, mas não funcionou. Bem, depois de usar o utilitário dos segredos W2k reservar para "explodir" a APO nos córregos incluídos, eu descobri que eles escondem uma outra referência à idade no fluxo de 3 !!!!!!! Uma vez que eu lancei que um bem, é compensada no windbg. ESTE É ENORME !!!! Muito obrigado .... servidor de símbolos aqui vou eu!

Foi útil?

Solução

o windbg não modificarão idade da APO - ele só olha-lo para corresponder ao executável - o compilador faz quando (re) gera arquivos executáveis ??e de depuração.

Agora, com base no artigo debuginfo.com, não é muito difícil para chegar ao diretório de depuração adequada (do tipo CodeView), combiná-lo contra a assinatura PDB7 e fazer modificações em qualquer idade ou GUID dentro de um executável. por isso é que não é uma opção?

i adivinhar, você quer atualizar pdb em vez disso? Receio APO é um formato proprietário. lá está várias APIs somente leitura (DBGHelp.dll e dia SDK), mas, tanto quanto modificações ir, você precisa adivinhar os detalhes para ser capaz de modificar.

Outras dicas

Ou você pode simplesmente usar a sugestão aqui para ter windbg ignorar assinaturas incompatíveis e idade:

http://www.debuginfo.com/articles/debuginfomatch.html

... Embora por padrão, ele [windbg] também não permite carregar informações de depuração incomparável, comando .symopt depurador pode alterar o comportamento padrão. Depois emitimos comando “.symopt + 0x40”, o depurador irá alegremente aceitar e carregar PDB incomparável e arquivos DBG.

Espero que isso ajude.

Embora, como disse Samb, na PDB (formato de 7, o meu teste é baseado em VS2010 gerado .exe e PDB, e windbg 6.9.0003.113 X86) há uma referência extra para idade, tão totalmente haverá 3 idades para modificar no arquivo PDB. Infelizmente, Samb não nos disse como encontrar a magia idade 3º, o fluxo de 3? não! de acordo com o meu teste, eu extrair mais de 100 córregos PDB, tentei 02 (se Samb é 0-indexados) e 03, ambos não consegue encontrar a idade.

Corrigindo os outros 2 idades é fácil, assim que você tem um editor hexadecimal e windbg.

  • Encontre o GUID e idade

usando symchk para obter a assinatura (a GUID) do seu arquivo PDB incompatíveis: symchk your.exe / v / s.

A vontade tipicamente saída contém:

[SYMCHK] ------------------------------------
SymbolCheckVersion  0x00000002
Result              0x00010001
DbgFilename         CPP_Snippet.dbg
DbgTimeDateStamp    0x00000000
DbgSizeOfImage      0x00000000
DbgChecksum         0x00000000
PdbFilename         E:\zrf\C_CPP\CPP_Snippet.pdb
PdbSignature        {6D8D99B0-E96B-4093-9D97-8BDC5152B6E0}
PdbDbiAge           0x00000188
  • Corrija as 2 idades mais fácil

Pesquisar na última parte do do GUID: 8BDC5152B6E0, porque somente a última parte é a partir questão big-endian / little-endian byte-free-fim, que é exatamente o mesmo que em arquivos PDB. Tenha o cuidado de pesquisar como valor hexadecimal cru, para torná-la mais precisa, você deve verificar os outros valores na GUID (necessidade de rever byte-ordem em X86) corresponde exatamente. Haverá exatamente 2 GUIDs encontrados no interior do arquivo PDB, a idade que acompanha é apenas antes do primeiro byte do GUID. Modificá-lo. É isso aí!

  • minha bruta maneira de descobrir a 3ª idade.

    despejar o número hexadecimal do seu arquivo PDB, um byte (números 2 hex) por linha. od -v -t x1 your.pdb | sed 's / ^ [0-9a-f] * //; s / / \ n / g'> age_offset.txt

    obter o número da linha de cada idade correspondida, no meu caso é 4 linhas consecutivas que tem valor 88 01 00 00, vim age_offset.txt : G / 88 \ n01 \ n00 \ n00 / s / ^ / \ = (linha () ''. ':') /

    Este é um comando do modo ex, que deve ser o apoio de uma versão recente do vim.

    : v /: / d

    Isto irá apagar todas as linhas que não contém ':', as linhas permaneceram são números de linha que é o deslocamento de todos os tempos combinados.

    :% s /:.*//

    Isto irá cortar:. 88 e deixando o deslocamento sozinho

    :% s /.*/\= (submatch (0) - 1) /

    Este comando subtrair cada número por 1, eu faço isso porque o número da linha no vim é 1-índice, eo deslocamento de byte de cada idade deve ser 0-index para tornar o feliz utilidade colega de trabalho.

    : w

    Salve o arquivo

    Agora temos um arquivo de texto com cada linha contém um número decimal que representa um deslocamento, a partir deste deslocamento, os seguintes 4 bytes é candidato para sua idade sonhando.

    Em seguida eu estou tentando modificar todas as idades potencial e, em seguida, tentar verificá-lo por symchk até que ele corresponda, cada vez que compensou apenas um será corrigido.

    Primeiro de tudo, eu vou um PDB de backup com as 2 idades (e GUID) ser modificado. Vamos chamou-ori.pdb

    Aqui está o script lote para fazer o trabalho duro:

for /F usebackq %%i in (`type age_offset.txt`) DO (
  copy /y ori.pdb CPP_Snippet.pdb
  @rem dd if=ori.pdb bs=1c count=4 skip=%%i | xxd -g1 | grep "88 01 00 00" || echo "Bad data at %%i" && goto exit
  dd if=pdb_age.dat of=CPP_Snippet.pdb bs=1c count=4 seek=%%i conv=notrunc
  symchk CPP_Snippet.exe /s . && echo "Found it at offset %%i" && goto exit
  )
:exit

Boa sorte, eu encontrei o lugar certo no deslocamento 38.

Não é o caminho mais rápido para tentar a erros o deslocamento correto para corrigir, mas funciona para mim, é meu protótipo para certificar-se há apenas 1 ano de idade extra para correção, caso contrário, a combinação possível é enorme (eu tenho 111 idade candidato para tentar) e, portanto, uma forma try-erro não é pragmático.

Eu acho que é muito fácil escrever um utilitário para fazer o mesmo trabalho de forma mais rápida.

BTW: de acordo com o meu teste. chkmatch pode relatar jogo enquanto symchk e windbg vs acho que incompatibilidade.

comando windbg! Itoldyouso corresponder enquanto .reload / f your_module.exe ainda não pode igualar.

Após os 3 idades a ser fixo, não só windbg mas também visual studio pode carregar os arquivos PDB.

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