8 votes

Est-il possible de régénérer les symboles d'un exe ?

Un de mes collègues a expédié un correctif à un client, et a ensuite supprimé le fichier pdb. Le build en question se bloque (par intermittence) et nous avons quelques dumps de crash. Nous avons tout le code source dans le contrôle de version, et nous pouvons le compiler en un .exe équivalent et obtenir des symboles pour celui-ci. Cependant, ces symboles ne correspondent pas exactement à ceux du crash dump. Il semble que plusieurs des fonctions soient décalées d'un décalage constant, mais nous n'en avons examiné qu'une poignée.

J'aimerais pouvoir faire ce qui suit (je peux simuler certaines parties manuellement, mais c'est une énorme quantité de travail) : obtenir une trace de la pile pour chaque thread dans la décharge et caster les pointeurs dans la décharge au type approprié et les faire apparaître dans le débogueur de Visual Studio. J'utilise 2005, si cela a de l'importance.

Existe-t-il un outil qui nous permette de recréer un pdb à partir du code source, de tous les fichiers .obj et du .exe original ? Ou bien existe-t-il un paramètre lorsque nous compilons/lien pour dire "faire exactement comme cet autre exe que vous venez de faire" ou quelque chose comme ça ?

Mise à jour rapide, basée sur les réponses obtenues jusqu'à présent : J'ai le fichier exe que nous avons envoyé au client, mais pas le pdb qui lui correspond, si cela peut aider. Je préférerais ne pas leur envoyer une nouvelle version (si possible), parce qu'il faut environ une semaine d'exécution pour obtenir les dumps de crash, et le client est déjà à l'étape "pourquoi n'est-ce pas déjà corrigé ? (Si nous envoyons une nouvelle version, je préférerais que ce soit une version qui corrige le problème ou qui comporte un débogage supplémentaire dans la zone concernée, et pas seulement le même code). Je sais qu'il est possible de faire une partie de cela manuellement avec beaucoup d'approximation ; c'est ce que nous faisons actuellement. Mais c'est pénible et j'espère qu'il existe un moyen de l'automatiser.

1voto

Vous ne pouvez pas recréer une PDB pour correspondre à un exécutable préexistant. La PDB contient une "empreinte digitale" qui est unique pour chaque compilation. À moins que vous ne puissiez faire réapparaître l'ancien fichier PDB par magie, vous devriez frapper votre collègue de travail à l'arrière de la tête (à la Gibbs, si vous regardez NCIS), recompiler le tout, stocker le fichier PDB dans un endroit sûr, envoyer un nouvel exécutable à votre client et laisser venir les pannes.

1voto

Michael Trausch Points 2349

Si votre système de construction vous permet de recréer n'importe quel binaire à partir de n'importe quelle révision que vous avez dans votre historique, alors vous devriez être capable d'obtenir l'ID de construction du client, et de régénérer cette même ID de construction exacte, avec tous les binaires et ainsi de suite. Cela prendra un certain temps si vous avez un grand projet, bien sûr, mais cela produira également le fichier de débogage dont vous avez besoin.

Si vous n'avez aucun moyen d'effectuer une reproduction exacte d'un build, alors regardez cette situation, réfléchissez bien à d'autres qui pourraient se présenter, et commencez à agir pour rendre possible la régénération de tous les builds réussis et des fichiers associés dans l'historique du projet. Cela rendra beaucoup plus facile de pouvoir travailler sur des problèmes de ce genre à l'avenir.

0voto

ruslik Points 8442

Lorsque vous avez les sources, il est assez facile de trouver la correspondance entre elles et le fichier exe. Il suffit de leur demander de vous envoyer le fichier exe avec le crash log et d'utiliser IDA.

Ce que vous demandez est beaucoup plus difficile que cela, si l'on considère également que vous en avez besoin pour "un seul usage".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X