Frage

Unser nächtlicher Build-Prozess wurde für eine lange Zeit gebrochen, so dass es PDB-Dateien erzeugt, die ein paar Stunden unterschiedlich in Alter als die entsprechenden Bilddateien waren. Ich habe das Problem, da festgelegt.

Allerdings würde Ich mag ein Symbol Server zu verwenden beginnen, kann aber nicht wegen, die diese alters nicht übereinstimmen PDB-Dateien zu verwenden. Ich arbeite dieses Problem um durch die .symopt + 0x40 Methode in windbg verwenden. Das heißt, ich habe alle meine PDB-Dateien von Hand zu organisieren und nach Jahre nach Jahren der Freisetzungen, das summiert sich.

Ich bin auf der Suche nach einem Weg, um den Mechanismus zu ändern, die Verwendungen Windbg eines PDB-Alter zu markieren, und zwingen sie meine Image-Datei übereinstimmen. Das Dienstprogramm ChkMatch macht etwas Ähnliches, aber für pdb Unterschriften. Die Entwickler Staaten auf der Seite „ChkMatch ist in der Lage ein ausführbares und PDB-Datei Spiel zu machen, wenn sie unterschiedliche Signaturen haben aber das gleiche Alter (siehe diesen Artikel für weitere Informationen über PDB Unterschrift und Alter). Wenn das Alter unterscheidet, kann das Werkzeug nicht machen die Dateien entsprechen. "

habe ich einen Blick in einem Hexeditor und fand sogar, was wie die Bits sah das Alter entsprechend, aber es muss noch einige Tricks intern ziehen, weil ich es nicht arbeiten konnte.

Irgendwelche Ideen?

Bearbeiten : Ich weiß nicht, ob das hilft, aber in meinem Fall der Altersunterschied wurde durch unnötig Neuverknüpfung DLL verursacht, die die PDB-Dateien als auch neu erstellen würde. Allerdings wurde die Speicherung unseres Build-Prozess die ursprünglichen DLLs (vor dem relink) und die PDB nach dem relink. Ich dachte daran, irgendwie eine solche Situation von Hand neu zu erstellen. Was bedeutet, zwingt eine relink auf einer DLL, aber der PDB in beiden Fällen Speichern ab. Dann könnte ich eine binäre tun die beiden Dateien vergleichen von zu sehen, wie sie sich verändert. laufen vielleicht eine Art Software von Patchen, die dies automatisch tut? Wenn sie sehen, was genau in meiner Kontrolle Fall geändert, vielleicht könnte ich das gleiche tun, um den DLLs und PDBs gespeichert in meinem Unternehmen Prozess bauen?

Bearbeiten : ICH HABE ES HERAUSGEFUNDEN!!!! Dank einem der Kommentare auf der ersten Antwort, überprüfte ich aus einem Link zu den PDF-Dateien des Buchs „Undocumented Windows 2000 Secrets: Ein Programmierer-Kochbuch“. Und der Autor geht sehr ins Detail über das PDB-Dateiformat. Wie ich schon sagte, ich hatte geladen bereits die PDB in einem Hex-Editor und blätterte einige Bits um erscheinen, dass ich das Alter / Unterschrift Spiel gemacht, aber es hat nicht funktioniert. Nun, nachdem das Dienstprogramm aus dem W2k Geheimnis Buch mit zu „explodieren“, um die PDB in die eingeschlossenen Ströme, fand ich heraus, dass sie eine andere Beziehung auf das Alter in Strom 3 verstecken !!!!!!! Sobald ich, dass man auch umgedreht, abgestimmt in windbg auf. DAS IST RIESIG!!!! Vielen Dank .... Symbolserver Hier komme ich!

War es hilfreich?

Lösung

die windbg nicht pdb Alter ändern - er sieht es nur bis dass die ausführbare Datei entsprechen - der Compiler tut, wenn er (wieder) erzeugt ausführbare Datei und Debug-Dateien.

nun, basierend auf dem debuginfo.com Artikel, ist es nicht allzu schwer im richtigen Debug-Verzeichnis (vom Typ Codeansicht) zu gelangen, passen sie gegen PDB7 Unterschrift und Modifikationen entweder an Alter oder in einer GUID ausführbar. warum ist das nicht eine Option?

ich denke, möchten Sie pdb stattdessen aktualisieren? Ich habe Angst, PDB ist ein proprietäres Format. dort sind mehrere Nur-Lese-APIs (dbghelp.dll und dia sdk), aber soweit Änderungen gehen, müssen Sie die Details erraten, modifizieren zu können.

Andere Tipps

Oder Sie könnten nur den Vorschlag, hier verwenden zu haben windbg nicht übereinstimmen Signaturen und Alter ignorieren:

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

  

... Während standardmäßig es [windbg] auch nicht unerreichte Debug-Informationen erlaubt, Befehl .symopt Debugger laden kann das Standardverhalten ändern. Nachdem wir „.symopt + 0x40“ Befehl erteilt haben, wird der Debugger glücklich akzeptieren und unerreichte PDB und DBG-Dateien laden.

Hope, das hilft.

Obwohl als SamB sagte in PDB (Format 7, mein Test auf VS2010 basiert erzeugt Exe und PDB und Windbg 6.9.0003.113 X86) gibt nach Alter eine zusätzliche Referenz ist, so wird es total 3 Alter zu ändern in PDB-Datei. Leider SamB hat uns nicht gesagt, wie die Magie 3. Alter zu finden, die den Strom 3? Nein! nach meinem Test habe ich mehr als 100 pdb Ströme zu extrahieren, I 02 versucht (wenn SamB 0-indiziert ist) und 03, beide können nicht das Alter finden.

die anderen 2 Alte Befestigung ist einfach, sobald Sie einen Hex-Editor und windbg haben.

  • Finden Sie die GUID und Alter

symchk mit der Unterschrift (GUID) der Ihrer mismatched PDB-Datei zu erhalten: symchk your.exe / v / s.

Die typischerweise Ausgang enthält:

[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
  • Fix das 2 einfache Alter

Suchen Sie den letzten Teil der von der GUID: 8BDC5152B6E0, weil nur der letzte Teil ist Byte-Reihenfolge frei von Big-Endian / Little-Endian-Problem, es ist nur genau gleich wie in PDB-Dateien. Seien Sie vorsichtig, wie roh Hex-Wert suchen, um es genauer, sollten Sie die anderen Werte in der GUID überprüfen (müssen Byte-Reihenfolge in X86 bis rever) genau übereinstimmt. Es wird genau 2 GUIDs in der PDB-Datei gefunden werden, das begleitende Alter ist kurz vor dem ersten Byte der GUID. Ändern Sie es. Das ist es!

  • mein Brute Weg, um das dritte Alter zu erfahren.

    Dump die Hex-Nummer Ihrer PDB-Datei, ein Byte (2 Hex-Zahlen) pro Zeile. od -v -t x1 your.pdb | Sed 's / ^ [0-9a-f] * //; s / / \ n / g'> age_offset.txt

    erhalten die Zeilennummer jeden angepasste Alter, in meinem Fall ist es vier aufeinanderfolgende Zeilen, den Wert 88 01 00 00, vim age_offset.txt : G / 88 \ n01 \ n00 \ N00 / s / ^ / \ = (Zeile () ''. ':') /

    Dies ist ein ex-Modus-Befehl, der durch eine aktuelle Version von vim Unterstützung sein sollte.

    : v /: / d

    Damit werden alle Zeilen löschen, die es nicht enthält ‚:‘, sind die verbleibenden Linien Zeilennummern die der Versatz wird jeder angepasst Alter.

    :% s /:.*//

    Dies wird trimmen: 88 und allein der Offset Belassen

    .

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

    Mit diesem Befehl jede Zahl von 1 subtrahieren, ich tue dies, weil die Zeilennummer in vim 1-Index ist, und das Byte jeden Alters Offset soll 0-Index sein, um den Mitarbeiter Dienstprogramm glücklich zu machen.

    : w

    speichern Sie die Datei

    Nun haben wir eine Textdatei mit jeder Zeile erhalten enthält eine Dezimalzahl, der ein Offset, von dieser Versatz, die folgenden 4 Bytes ist Kandidat für Ihren Träumen Alter.

    Als nächstes versuche ich jedes -daten zu ändern und dann versuchen, es durch symchk zu überprüfen, bis sie paßt, eine jedes Mal nur Offset gepatcht werden.

    Zunächst einmal werde ich Backup ein PDB mit den zwei Altersgruppen (und GUID) geändert werden. Lassen Sie uns nannte es ori.pdb

    Hier ist der Batch-Skript, die harte Arbeit zu tun:

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

Gutes Glück, fand ich den richtigen Platz bei der 38. ausgeglichen.

Es ist nicht der schnellste Weg, um zu versuchen-Fehler aus dem richtigen Patch versetzt, aber es funktioniert für mich, es ist mein Prototyp um sicherzustellen, dass es nur 1 zusätzliches Alter zu beheben, sonst ist die mögliche Kombination ist riesig (ich habe 111 Alter Kandidat versuchen) und damit ein Versuch-Irrtum Art und Weise ist nicht pragmatisch.

Ich denke, es ist sehr einfach, ein Programm zu schreiben, um die gleiche Arbeit in einem schnelleren Weg zu tun.

BTW: nach meinem Test. chkmatch kann vs denken, es Mismatch Spiel während symchk und windbg melden.

windbg Befehl! Itoldyouso Spiel während .reload / f your_module.exe kann immer noch nicht überein.

Nachdem die drei Altersgruppen festgelegt sind, nicht nur Windbg sondern auch Visual Studio kann die PDB-Dateien laden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top