Question

Avec g ++ avec -g options , je peux utiliser gdb pour des fins de débogage.

Quel est l'équivalent de cette option avec Visual Studio 2010 compilateur cl.exe?

Cette page a différentes bibliothèques (debug / release) pour la liaison.

Si je compile avec l'option de débogage avec cl.exe, dois-je utiliser les options liant la bibliothèque correspondante (/ MD / MT vs / MDd / MTd)?

Était-ce utile?

La solution

Il y a quelques pièces séparées à cette question: comment dire le compilateur / éditeur de liens pour générer et préserver « les informations de débogage » (mappage entre le code source et le code objet), comment dire au compilateur de compiler le code différemment à faire le débogage (pensez à assert () et #ifdef _DEBUG), et si les bibliothèques précompilés vous lien dans votre projet comprennent des informations de débogage.

-Zi (drapeau au compilateur CL pour lui dire de générer des informations de débogage) est l'équivalent du -g de gcc.

(Il existe d'autres formes de l'option -Z: -ZI si vous voulez que le « modifier et continuer » support dans l'IDE Visual Studio, mais si vous utilisez l'IDE que vous utilisez probablement son interface au compilateur paramètres au lieu de les manipuler directement et -Z7 si vous voulez les anciennes informations de débogage CodeView format, chaque fois que je l'ai invoquais CL directement, il a toujours été que je voulais -Zi)

.

Notez que l'utilisation de l'option -Zi (ou -ZI) va générer un fichier pdb par répertoire, le plus souvent, mais lorsque vous liez code ensemble, il peut provenir de fichiers OBJ représentés dans différents fichiers pdb, et vous veulent aussi combiner ces fichiers pdb séparés en un maître représentant le code lié ensemble -. c'est ce que l'interrupteur de debug pour l'éditeur de liens est pour

note également: cela peut sembler contre-intuitif, mais toujours utiliser -Zi (CL) et debug (pour link.exe). Même pour le code que vous allez libérer. Il n'augmente pas la taille de votre exécutable, ou donner des secrets à vos clients, étant donné que les informations de débogage passe dans un fichier séparé pdb (que vous n'expédier aux clients). S'il y a une chance que vous allez jamais avoir à déboguer, vous allez avoir la pdb. (Même pas est -Zi incompatible avec les optimisations, bien que -ZI est. Donc, vous pouvez compiler votre « debug » construit avec -ZI, et votre « version » construit avec « -Zi -O2 ».)

En ce qui concerne les bibliothèques: vous n'avez pas strictement besoin de correspondre à la propriété debug / release de la bibliothèque d'exécution C avec si votre code contient des informations de débogage, mais il est généralement une bonne idée - si vous allez déboguer le projet que vous voulez être en mesure de déboguer tout cela, et si vous n'allez pas déboguer vous n'avez pas besoin du poids supplémentaire. L'utilisation de versions debug / release d'une bibliothèque donnée n'affectera pas si elle a des symboles de débogage disponibles (espérons-le, si celui qui a compilé la bibliothèque a compris ce que je disais au paragraphe précédent), mais il aura une incidence sur des choses comme assert et _DEBUG #ifdef supplémentaires code dans cette bibliothèque.

Cela vaut pour toutes les bibliothèques que vous lien avec, mais surtout pour la bibliothèque d'exécution C - Microsoft a ajouté supplémentaire code de détection d'erreur à malloc () et free (). Donc, si quoi que ce soit dans votre projet utilise la saveur de débogage de la bibliothèque CRT, tout cela devrait être.

Les / options M (/ MTd et / MDd) sont étranges et magiques, à mon avis - ils sont alias juste pour un ensemble complexe d'autres choses qui se passent dans les coulisses. Prenez / MDd par exemple, documenté à « Définit _DEBUG, _MT et _DLL et provoque votre application à utiliser la mise au point de la version multithread- et spécifique DLL de la bibliothèque d'exécution. Il indique également au compilateur de placer le nom de la bibliothèque MSVCRTD. lib dans le fichier .obj « . Ici, cela affecte aussi bien le préprocesseur (définition _DEBUG et d'autres symboles de préprocesseur) et l'éditeur de liens (il met en fait un commentaire #pragma (linker) dans votre code source). Si vous vous souciez de ce qui se passe et ne le comprends pas, cela peut causer des problèmes réels - j'ai vu beaucoup de projets qui n'utilisent pas le get IDE embourbé dans des avertissements sur les deux msvcrt.lib et MSVCRTD.LIB étant lié dans, etc. au moment où vous comprenez comment utiliser ces (options / M) en toute sécurité, vous n'avez pas vraiment besoin d'eux plus! Je préfère faire les choses explicites: préciser « -D _DEBUG » directement où je besoin, spécifier les bibliothèques à liaison avec explicitement (et l'utilisation -nodefaultlib), puis les / options M ne sont pas nécessaires

.

Autres conseils

Vous cherchez un des débogage options de génération d'information (/Z7, /Zi ou /ZI).

Si vous utilisez un de ceux-ci, vous devez également passer le / option de DEBUG à l'éditeur de liens.

Vous aurez également besoin de se lier à la la version de débogage des bibliothèques d'exécution (ou de /MDd /MTd). Ceci est important car ces versions sont différentes de leurs homologues de libération (par exemple leurs routines d'allocation de mémoire ne sont pas compatibles).

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