Domanda

Il nostro processo nightly build è stata interrotta per un lungo periodo di tempo, in modo tale che essa ha generato file PDB che erano un paio d'ore diverse per età che i file di immagine corrispondenti. Da allora ho risolto il problema.

Tuttavia, vorrei iniziare a utilizzare un server di simboli, ma non può a causa di dover utilizzare questi file PDB età non corrispondenti. Io lavoro intorno a questo problema utilizzando il .symopt + 0x40 metodo windbg. Ciò significa che devo organizzare tutti i miei file PDB a mano, e dopo anni su anni di stampa, che aggiunge fino.

Sto cercando un modo per modificare il meccanismo che WinDBG usi per segnare l'età di un PPB, e costringerlo a abbinare il mio file di immagine. Il ChkMatch fa qualcosa di simile, ma per le firme PPB. Gli stati degli sviluppatori su pagina "ChkMatch è in grado di fare delle partite in file eseguibile e PDB se hanno firme diverse, ma la stessa età (si veda questo articolo per ulteriori informazioni sulla firma PDB ed età). Se i differisce età, lo strumento non può fare i file di corrispondenza ".

ho preso uno sguardo all'interno di una HexEditor, e anche trovato quello che sembrava i bit corrispondenti all'età, ma deve tirare alcuni trucchi più internamente, perché io non sono riuscito a farlo funzionare.

Tutte le idee?

Modifica : Non so se questo aiuta, ma nel mio caso particolare, la differenza di età è stato causato da inutilmente ricollegamento dll, che ricreare i file PDB pure. Tuttavia, il nostro processo di generazione è stato memorizzando le DLL originali (prima del relink), e il progetto preliminare di bilancio dopo il ricollegamento. Ho pensato a qualche modo ricreare una situazione del genere a mano. Significato, forzando una relink su una DLL, ma risparmiando fuori PPB in entrambi i casi. Poi ho potuto fare un confronto binario dei due file per vedere come hanno cambiato. Forse eseguire una sorta di patch software che fa questo automaticamente? Vedendo che cosa esattamente è cambiato nel mio caso di controllo, forse avrei potuto fare lo stesso con le DLL e PDBS salvati nelle mie aziende processo di generazione?

Modifica : L'AVEVO CAPITO!!!! Grazie a uno dei commenti sulla prima risposta, ho controllato un link per i PDF del libro "2000 Segreti Undocumented Windows: a programmatori Cookbook". E l'autore va in grande dettaglio circa il formato di file PDB. Come ho detto prima, avevo già caricato il progetto preliminare di bilancio in un editor esadecimale e capovolto alcuni bit in giro che appare che ho fatto il match eta / firma, ma non ha funzionato. Ebbene, dopo aver utilizzato l'utilità dal libro segreti W2k a "esplodere" il progetto preliminare di bilancio nei corsi d'acqua compresi, ho scoperto che si nascondono un altro riferimento all'età nel flusso 3 !!!!!!! Una volta che ho girato che uno così, è abbinato a windbg. Questo è enorme !!!! Grazie mille .... server di simboli qui vengo!

È stato utile?

Soluzione

il windbg non modificherà l'età di PDB - sembra solo fino a corrispondere a quella del file eseguibile - il compilatore fa quando (ri) genera file eseguibili e di debug.

Ora, basata sull'articolo debuginfo.com, non è troppo difficile per arrivare alla directory di debug corretto (di tipo CodeView), abbinare contro firma PDB7 e apportare modifiche a uno di età o il GUID all'interno di un eseguibile. perché è che non è un'opzione?

credo, si desidera aggiornare PDB, invece? ho paura, pdb è un formato proprietario. ci sei più API di sola lettura (Dbghelp.dll e dia SDK), ma per quanto riguarda le modifiche vanno, è necessario indovinare i dettagli per essere in grado di modificare.

Altri suggerimenti

In alternativa si potrebbe utilizzare il suggerimento qui per avere windbg ignorare le firme non corrispondenti ed età:

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

  

... Mentre per impostazione predefinita [windbg] inoltre non permette di caricare le informazioni di debug senza pari, il comando .symopt debugger può modificare il comportamento predefinito. Dopo aver rilasciato il comando “.symopt + 0x40”, il debugger sarà lieto di accettare e caricare PDB senza pari e file DBG.

Spero che questo aiuti.

Anche se, come ha detto Samb, a PDB (formato 7, il mio test si basa sulla VS2010 generato .exe e PDB, e windbg 6.9.0003.113 X86) c'è un ulteriore riferimento all'età, in modo del tutto ci saranno 3 secoli per modificare nel file PDB. Purtroppo, Samb non ci ha detto come trovare la magia terza età, il flusso di 3? no! secondo la mia prova, ho estratto più di 100 corsi d'acqua PDB, ho provato 02 (se Samb è 0-indicizzati) e 03, entrambi non riesco a trovare l'età.

Fissaggio le altre 2 le età è facile, non appena si dispone di un editor esadecimale e windbg.

  • Trova il GUID e l'età

utilizzando Symchk per ottenere la firma (un GUID) del file PDB non corrispondenti: Symchk your.exe / v / s.

La volontà tipicamente uscita contiene:

[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
  • Fissare i 2 secoli più facili

Cerca l'ultima parte del del GUID: 8BDC5152B6E0, perché solo l'ultima parte è da big-endian / little-endian problema-libera ordine dei byte, è esattamente come nel file PDB. Fare attenzione per la ricerca come valore esadecimale grezzo, per renderlo più preciso, è necessario verificare gli altri valori nel GUID (necessità di Rever ordine di byte in X86) corrisponde esattamente. Ci saranno esattamente 2 GUID trovati all'interno del file PDB, all'età di accompagnamento è poco prima del primo byte del GUID. Modificarlo. Questo è tutto!

  • il mio modo bruta per scoprire il 3 ° età.

    il dump del numero esadecimale del file PDB, un byte (numeri esadecimali 2) per linea. od -v -t x1 your.pdb | sed 's / ^ [0-9a-f] * //; s / / \ n / g'> age_offset.txt

    ottenere il numero di riga di ogni età corrisponde, nel mio caso si tratta di 4 righe consecutive che ha valore 88 01 00 00, vim age_offset.txt : G / 88 \ n01 \ N00 \ N00 / s / ^ / \ = (linea () ''. ':') /

    Questo è un comando ex modalità, che dovrebbe essere il sostegno di una versione recente di vim.

    : v /: / d

    Questo eliminerà tutte le linee che non contiene ':', le linee sono rimaste numeri di linea che è l'offset di ogni età corrispondente.

    :% s /:.*//

    Questo assetto: 88 e lasciando l'offset da sola

    .

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

    Questo comando sottrarre ogni numero da 1, Lo faccio perché il numero di riga in vim è 1-index, e l'offset di ogni età dovrebbe essere 0-index Byte per rendere l'utilità di co-lavoratore felice.

    : w

    salvare il file

    Ora abbiamo un file di testo con ogni riga contiene un numero decimale che rappresenta un offset, da questo offset, i seguenti 4 byte è candidato per la tua età sognare.

    Avanti sto cercando di modificare ogni potenziale età e quindi provare a controllare da Symchk fino a che non corrisponde, ogni volta che sarà patchato un solo compensato.

    Prima di tutto, io backup di un progetto preliminare di bilancio con le 2 secoli (e GUID) essere modificato. Diciamo chiamavano ori.pdb

    Ecco lo script batch per fare il duro lavoro:

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

Buona fortuna, ho trovato il posto giusto all'offset 38a.

Non è il modo più veloce per provare errori la corretta compensazione di patch, ma funziona per me, è il mio prototipo per assicurarsi che c'è solo 1 età in più per risolvere, in caso contrario, la combinazione possibile è enorme (ho 111 età candidato per provare) e quindi un modo try-errore non è pragmatica.

Credo che sia molto facile scrivere un programma di utilità per fare lo stesso lavoro in un modo più veloce.

A proposito: secondo la mia prova. chkmatch può segnalare partita mentre Symchk e windbg vs pensare che non corrispondente.

windbg comando! Itoldyouso partita mentre .reload / f your_module.exe ancora non può corrispondere.

Dopo i 3 secoli esserlo, non solo windbg ma anche Visual Studio possono caricare i file PDB.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top