2012-06-28 1 views
28

je dois déboguer un projet C++, mais comme une dépendance ne compile pas en mode débogage et je n'ai pas été en mesure de résoudre cette question jusqu'à présent, je voudrais essayer de déboguer le projet en mode de libération.Comment déboguer en mode release?

Actuellement, l'application se bloque en raison d'un pointeur nul, mais je n'ai pas le code à l'origine de l'erreur. Comme les points de rupture sont apparemment ignorés en mode release, j'aimerais savoir quelle est la meilleure façon de trouver l'erreur.

Répondre

52

Dans VS, faites un clic droit de votre projet, choisissez "Propriétés".

  1. Cliquez sur le nœud C/C++. Définissez le format d'informations de débogage sur compatible C7 (/ Z7) ou sur Base de données de programme (/ Zi).

  2. Développez Linker et cliquez sur le nœud général. Définissez Activer la liaison incrémentielle sur Non (/ INCREMENTAL: NO).

  3. Sélectionnez le nœud de débogage. Définissez Générer les informations de débogage sur Oui (/ DEBUG).

  4. Sélectionnez le nœud d'optimisation. Définissez les références sur Oui (/ OPT: REF).

    si/OPT: REF est spécifié,/OPT: ICF est activé par défaut.

C'est déchiré directement à partir de la documentation de Microsoft:

Je le fais tout le temps et à peu près jamais déboguer en mode débogage plus. Comme vous le savez, de nombreuses erreurs qui se produisent dans une version de construction peuvent ne pas se produire dans une version de débogage (presque certainement les erreurs qui surviennent lors de l'appel de la base de données).

Aussi, je travaille sur un projet qui utilise une tonne de traitement d'image et effectue beaucoup de compression/décompression de grandes images. L'utilisation d'une version de débogage lente est simplement irréalisable.

+0

problème résolu grâce!Je ne sais pas beaucoup sur les effets de tous ces paramètres, il est donc préférable de ne les utiliser que pour le débogage et de les supprimer à nouveau lors de la mise en place d'une version actuelle. – Pedro

+5

@Pedro: Oui, il vaut probablement mieux les annuler et laisser les valeurs par défaut pour la validation. En général, je crée un nouveau type de construction pour cette configuration, c'est-à-dire, "release w/symbols". Cela dit, ça ne peut pas faire de mal d'aller étudier ce que font ces commutateurs. –

4

Vous ne pouvez pas toujours simplement modifier les paramètres du projet et recompiler.
Parfois, vous avez une version publiée que vous souhaitez déboguer, ou un fichier de vidage envoyé par un client.

Lors de la compilation d'un projet C++ en version avec des optimisations, le débogueur n'affiche parfois pas les bonnes informations d'objet. Les variables locales sont généralement les premières à partir, et plusieurs fois, les informations de cet objet sont perdues pour le débogueur.

La raison est que le compilateur utilise les registres matériels disponibles pour contenir les informations et utilise des optimisations pour éviter l'allocation de variables locales.

Je l'ai suggéré un moyen de trouver les informations manquantes ici:

Debugging Release Projects in C++ - Finding the Lost Object Information

+0

La réponse de @Ed est géniale si vous avez accès au code et à l'IDE. La réponse de Yochai mérite d'être lue. –

Questions connexes