Comment vérifier si un fichier exécutable ou un fichier DLL est construire en Release ou Debug mode (C++)
J'ai besoin de trouver le mode exe/dll a été construit à la recherche à ses en-têtes. [modifier] à l'Aide de c++, sans outils externes.[/edit]
Il y a une vieille discussion comment faire pour déterminer la dll a été construit en Release ou Debug mode.
http://forums.codeguru.com/archive/index.php/t-485996.html
Mais malheureusement je n'ai pas trouvé de réponse claire.
Qu'est-ce exactement est manquant à partir de cette discussion, ou ce que vous aimeriez avoir clarfied? Il n'y a pas de réponse claire à cette, car il n'y a aucun moyen de le savoir sans l'analyse de la dll de près.
Que considérez-vous comme Libération ou le mode Debug? Est-ce que votre exe/dll inclure une version de la ressource?
Il n'y a pas de garantie à 100% que la version est inclus.
Que considérez-vous comme Libération ou le mode Debug? Est-ce que votre exe/dll inclure une version de la ressource?
Il n'y a pas de garantie à 100% que la version est inclus.
OriginalL'auteur ChatCloud | 2012-06-20
Vous devez vous connecter pour publier un commentaire.
Si par "en-têtes" tu veux dire que PE sections ou des ressources (en-têtes ne vais pas vous dire quoi que ce soit, et les programmes ne sont généralement pas livrés avec leur développement têtes!), c'est genre de possible, dans certaines limites, et un mauvais fonctionnement. Sinon, c'est tout à fait impossible de s'efforcer à moins que vous avez écrit vous-même le programme.
Généralement, il est difficile de faire une telle chose, de manière fiable, d'autant plus que "debug" est un Microsoft Visual Studio simplification qui n'existe pas en tant que tel en vertu de la plupart des compilateurs. Par exemple, avec GCC, il est parfaitement possible d'avoir un optimisé construire qu'il contient les symboles de débogage. Il est même possible d'activer les optimisations sur et en dehors avec
#pragma
(et de changer le niveau d'optimisation et même la cible de la machine!) et donc avons optimisé les fonctions (ou groupes de fonctions) dans un unoptimized construire, et vice versa.La présence de symboles de débogage est votre meilleure proposition pour un programme que vous n'avez pas écrit. Il n'est pas possible (pas de façon réaliste, dans un simple, de façon automatisée, de toute façon) à dire à partir d'un binaire généré si il a été optimisé ou pas.
Les sections
.debug$S
et.debug$T
contient les symboles de débogage et de déboguer des types, respectivement. Il ya quelques autres articles commençant par.debug
en tant que bien, mais ils sont obsolètes. Un programme qui a été construit en "mode debug" et qui n'a pas ensuite été dépouillé contiendra toutes ou certaines de ces sections.À l'aide de C++ sans outils externes, vous aurez envie de sauter sur le DOS "MZ" stub et l'en-tête PE. Après cela viennent les en-têtes de section, que vous pouvez analyser. Complet documenation le format de fichier peut être téléchargé ici.
Plus probablement, de la lecture du fichier et faire une chaîne de match pour
.debug
sera tout aussi bon.De la même manière, vous pouvez regarder VERSIONINFO ou le fichier manifeste (ils permettent également de spécifier si un programme est une version de débogage), mais ils ne sont pas obligatoires. Vous pouvez écrire à peu près tout ce que vous voulez dans ces. Dans la mesure où, ils sont encore moins fiables que les symboles de débogage.
Un autre indice, le manque de fiabilité de nouveau, serait de vérifier quelles sont les versions des bibliothèques système, un programme a été lié avec. Si c'est la version de débogage, les chances sont que c'était une version de débogage. Cependant, on pourrait faire une version release et toujours en lien avec les bibliothèques de débogage, rien ne peut vous empêcher de faire cela.
La prochaine meilleure hypothèse serait l'absence d'appels à la CRT
assert
fonction (ce qui peut se faire avec une simple chaîne de match), depuis leassert
macro (à partir de laquelle il est normalement appelé) est entièrement dépouillés dans un build avecNDEBUG
défini. Aucune utilisation de ce symbole, pas de chaîne de caractères présents dans le binaire.Malheureusement, un programme qui n'a pas tout affirme serait identifiée à tort comme "la libération de la construction", indépendamment de sa réalisation, et il est tout à fait possible de redéfinir la
assert
macro pour faire quelque chose de complètement différent (commeprintf
un texte et continuer). Et enfin, vous ne savez pas si certains statique de la 3e partie de la bibliothèque qui vous lier avec (qui, évidemment, a déjà dépassé le préprocesseur) contient des appels àassert
que vous ne connaissez pas.Si vous voulez vérifier si un programme que vous avez écrit vous-même, vous pouvez exploiter le fait que l'optimiseur de supprimer complètement les choses qui sont sensiblement inaccessible ou n'est pas utilisé. Il peut prendre 2 ou 3 tentatives pour l'obtenir juste, mais, fondamentalement, il devrait être aussi simple que la définition d'une variable (ou une fonction exportée si votre compilateur/linker ne pas exporter les symboles qui ne sont pas utilisés) et l'écriture de deux ou trois magie des valeurs à partir d'un programme d'emplacement qui n'est pas accessible. Un compilateur optimisant aura au moins l'effondrement de ces plusieurs redondante se déplace en un seul, ou, plus probablement, entièrement eleminate tous.
Vous pouvez ensuite il suffit de faire une chaîne binaire de recherche pour la magie des valeurs. Si ils ne sont pas présents, c'est une optimisation du build.
.debug
. Une alternative serait de vérifier la version du runtime c++ est utilisé par l'application. par exemple, la recherche deMSVCR80D.dll
MSVCR90D.dll
MSVCR100D.dll
...Oui, c'est un autre (bien que peu fiable) chose que l'on pourrait espérer (comme indiqué ci-dessus, reportez-vous au paragraphe no. 6). Chose est, vous avez vraiment ne peut pas dire à coup sûr.
OriginalL'auteur Damon
La question est très bonne, et comme déjà indiqué, il n'existe pas de réelle évidente de (unique) des indicateurs indicateur de savoir si une image est de débogage ou libéré.
Comme expliqué ici et ici, la présence d'un Répertoire de Débogage n'est PAS un indicateur quant à savoir si ou non une image a été construit en Mode Release. Il est très fréquent que publié des images sont construits avec en charge le débogage . Comme une question de fait, presque TOUS les OS Windows les fichiers d'image sont construits avec en charge le débogage (sinon, il n'y aurait PAS de possibilité de lier ces a Publié des images avec les symboles des fichiers à partir de Microsoft Serveur de Symboles). Même si ces images sont de Libérer les images!
Même la présence de l' .section debug (en fait, les Sections les noms ne joue un rôle dans la PE spécifications, le nom d'une section peut être modifié et réglé comme vous le souhaitez - le Chargeur ne s'en inquiètent pas!) n'est PAS un indicateur de Libération vs Debug image.
OriginalL'auteur mox
Il y a un vieux inverser outil appelé LordPE. Il vous permettra d'ouvrir les deux fichiers et diff les en-têtes. J'ai compilé un programme "hello world" dans VS2008 en Release et Debug mode et comparés entre eux. Comme dans les autres affiches, je n'ai pas vu tout ce qui pourrait servir d'indicateur.
Mais ce que j'ai trouvé comme un indicateur a été le rembourrage dans le .section de texte de la binaire. Il n'y a plus d'une centaine d'octets avec la valeur 0xCC après le dernier octet de code dans le .texte de l'article dans la version de Débogage. Dans la version finale, il n'y avait pas 0xCC octets. 0xCC octets apparaissent comme int3 ou des points d'arrêt dans un débogueur.
OriginalL'auteur lynxjerm
Lorsque vous créez un projet C++ dans Visual Studio, il génère deux configurations pour vous. Les noms de ces configurations sont Debug et Libération. La configuration de Débogage comprend la génération d'informations de débogage, moins d'optimisation et de soutien pour Modifier&Continuer.
Mais ce n'est qu'un point de départ. Vous pouvez créer arbitraire configurations et même d'ajouter toutes les informations de débogage pour la Libération de configuration. Donc il n'est pas clair Debug ou Release construire.
Vous pouvez essayer d'identifier si le symbole de préprocesseur
_DEBUG
a été défini. C'est rarement changé et il est utilisé dans la version de la ressource. Le bit 0 de la FILEFLAGES champ indique généralement que les symboles _DEBUG a été défini lors de la compilation de la ressource.OriginalL'auteur harper
Que j'ai eu à vérifier des centaines de dll et exe, j'ai essayé Smerlin de la suggestion par l'exécution de depends.exe (ver 2.2) en mode console et de la recherche pour "MSVCRTD" dans le fichier de sortie généré par dépend.
OriginalL'auteur Martin