Question

Notre processus nocturne a été brisé depuis longtemps, de sorte qu'il a généré des fichiers PDB qui étaient quelques heures différentes dans l'âge que les fichiers d'image correspondant. J'ai depuis résolu le problème.

Cependant, je voudrais commencer à utiliser un serveur de symboles, mais ne peut pas en raison d'avoir à utiliser ces fichiers pdb âge ne correspondent pas. Je travaille autour de ce problème en utilisant la méthode .symopt + 0x40 dans windbg. Cela signifie que je dois organiser tous mes fichiers pdb à la main, et après des années et des années de presse, qui ajoute.

Je cherche un moyen de modifier le mécanisme qui WinDBg utilise pour marquer l'âge d'un pdb, et le forcer à correspondre mon fichier image. L'utilitaire ChkMatch fait quelque chose de similaire, mais pour les signatures pdb. Les états de développement sur la page « ChkMatch est capable de faire une correspondance de fichier exécutable et PDB si elles ont des signatures différentes mais le même âge (voir cet article pour plus d'informations sur la signature PDB et âge). Si les diffère de l'âge, l'outil ne peut pas faire les fichiers correspondent. "

Je pris un coup d'oeil à l'intérieur d'un hexeditor, et même trouvé ce qui ressemblait à des bits correspondant à l'âge, mais il faut tirer quelques tours plus interne, parce que je ne pouvais pas le faire fonctionner.

Toutes les idées?

EDIT : Je ne sais pas si cela aide, mais dans mon cas particulier, la différence d'âge a été causée par dll inutilement re-lier, qui recréent les fichiers PDB ainsi. Cependant, notre processus de stockait les fichiers originaux (avant le Relink), et le pdb après la Relink. Je pensais à recréer en quelque sorte une telle situation en main. Ce qui signifie, en forçant un Relink sur une DLL, mais économiser de l'pdb dans les deux cas. Alors que je pouvais faire une comparaison binaire des deux fichiers pour voir comment ils ont changé. Peut-être exécuter une sorte de logiciel qui rapiéçage fait automatiquement? En voyant ce qui a changé exactement dans mon cas de contrôle, peut-être que je pouvais faire la même chose pour les DLL et PDB enregistrés dans mes entreprises processus de construction?

EDIT : I figured it out !!!! Merci à l'un des commentaires sur la première réponse, j'ai vérifié un lien vers les pdfs du livre « Secrets Windows 2000 Undocumented: Un livre de recettes de programmation ». Et l'auteur va dans les détails sur le format de fichier pdb. Comme je l'ai déjà dit, je l'avais déjà chargé le pdb dans un éditeur hexadécimal et renversé quelques morceaux autour apparaissant que je fait le match âge / signature, mais cela n'a pas fonctionné. Eh bien, après avoir utilisé l'utilitaire à partir des secrets W2K livre « exploser » l'pdb dans les cours d'eau compris, j'ai découvert qu'ils cachent une autre référence à l'âge dans le courant 3 !!!!!!! Une fois que je feuilletais celui-là aussi, il correspondait en windbg. C'EST ÉNORME!!!! Merci beaucoup .... serveur symbole J'ARRIVE!

Était-ce utile?

La solution

le windbg ne modifiera pas l'âge de pdb - il semble que ce à correspondre à celui de l'exécutable - le compilateur fait quand il (re) génère des fichiers exécutables et de débogage.

, basé sur l'article debuginfo.com, il est pas trop difficile d'arriver dans le répertoire de débogage approprié (de type CodeView), correspondre contre la signature de PDB7 et apporter des modifications à l'âge ou GUID dans un exécutable. pourquoi est-ce pas une option?

Je suppose que vous voulez mettre à jour à la place pdb? j'ai peur, pdb est un format propriétaire. il sont plusieurs API de lecture seule (dbghelp.dll et dia sdk), mais pour autant que les modifications vont, vous devez deviner les détails pour pouvoir modifier.

Autres conseils

Ou vous pouvez simplement utiliser la suggestion d'avoir windbg ignorer les signatures ne correspondent pas et âge:

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

  

... Alors que par défaut, il [windbg] également ne permet pas de charger des informations de débogage inégalés, commande du débogueur .symopt peut changer le comportement par défaut. Après que nous avons publié « .symopt + 0x40 » commande, le débogueur se fera un plaisir d'accepter et charger des fichiers PDB et DBG inégalée.

Hope this helps.

Bien que SamB dit, dans l'APB (format 7, mon test est basé sur VS2010 généré .exe et pdb, et WinDBg 6.9.0003.113 X86) il y a une référence supplémentaire à l'âge, donc tout à fait, il y aura 3 ans pour modifier dans le fichier PDB. Malheureusement, SamB ne nous a pas dit comment trouver la magie 3e âge, le courant 3? non! selon mon test, j'extraire plus de 100 cours d'eau pdb, j'ai essayé 02 (si SamB est 0-indexé) et 03, les deux ne trouve pas l'âge.

Fixation des 2 autres âges est facile, dès que vous avez un éditeur hexadécimal et windbg.

  • Trouvez le GUID et l'âge

à l'aide Symchk pour obtenir la signature (un GUID) du fichier PDB ne correspondent pas: Symchk your.exe / v / s.

La volonté typiquement sortie contient:

[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
  • Fixer les 2 ans plus facile

Recherchez la dernière partie du du GUID: 8BDC5152B6E0, car seule la dernière partie est l'ordre des octets sans de big-endian / question petit-boutiste, il est juste exactement le même que dans les fichiers pdb. Faites attention à la recherche en tant que valeur hexadécimale brute, pour le rendre plus précis, vous devriez vérifier les autres valeurs dans le GUID (besoin de rever octet ordre X86) correspond exactement. Il y aura exactement 2 GUIDs trouvés dans le fichier PDB, l'âge d'accompagnement est juste avant le premier octet du GUID. Modifiez-le. Ca y est!

  • ma façon brute pour trouver le 3ème âge.

    vider le numéro hexadécimal de votre fichier PDB, un octet (2 nombres hexadécimaux) par ligne. od -v -t x1 your.pdb | sed 's / ^ [0-9a-f] * //; s / / \ n / g'> age_offset.txt

    obtenir le numéro de ligne de chaque appariés pour l'âge, dans mon cas, il est 4 lignes consécutives qui a une valeur 88 01 00 00, vim age_offset.txt : G / 88 \ n01 \ n00 \ n00 / s / ^ / \ = (la ligne () ''. ':') /

    Ceci est une commande de mode ex, qui devrait être le soutien d'une version récente de vim.

    : v /: / d

    Ceci supprimera toutes les lignes qui ne contient pas « : », les lignes sont restées les numéros de ligne qui est le décalage de tous les temps identifié.

    :% s /:.*//

    taillera: 88 et en laissant le décalage seul

    .

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

    Cette commande Soustraire tous les numéros de 1, je le fais parce que le numéro de ligne dans vim est 1-index, et l'octet de décalage de chaque âge devrait être 0-index à l'utilitaire collègue heureux.

    : w

    enregistrer le fichier

    Maintenant, nous obtenons un fichier texte avec chaque ligne contient un nombre décimal représentant un décalage, de ce décalage, les 4 octets suivants est candidat à votre âge de rêver.

    Ensuite, je suis en train de modifier tout âge potentiel et puis essayer de le vérifier par Symchk jusqu'à ce qu'elle corresponde, à chaque fois qu'un décalage sera patché.

    Tout d'abord, je sauvegarde une PDB avec les 2 ans (et GUID) soit modifié. Faisons l'appelaient ori.pdb

    Voici le script batch pour faire le travail:

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

Bonne chance, j'ai trouvé au bon endroit au 38ème offset.

Il est pas le meilleur moyen d'essayer d'erreur le décalage correct de patch, mais ça marche pour moi, c'est mon prototype pour vous assurer qu'il ya seulement 1 ans supplémentaire pour fixer, sinon, la combinaison possible est énorme (je l'ai 111 candidats d'âge pour essayer) et donc une façon essayer d'erreur n'est pas pragmatique.

Je pense qu'il est très facile d'écrire un utilitaire pour faire le même travail d'une manière plus rapide.

BTW: d'après mon test. chkmatch peut tout de match Symchk et windbg vs pense que ce décalage.

windbg commande! Itoldyouso correspondance en .reload / f your_module.exe ne peut toujours pas correspondre.

Après les 3 ans étant fixes, non seulement WinDBg mais aussi Visual Studio peut charger les fichiers pdb.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top