Quelles sont les raisons typiques des bogues et des comportements de programme anormaux qui ne se manifestent qu'en mode compilation, mais qui ne se produisent pas en mode débogage?
Réponses
Trop de publicités?De nombreuses fois, dans le mode de débogage en C++, toutes les variables ne sont pas initialisées, tandis que la même chose ne se produit pas en mode release, sauf mention explicite.
Vérifiez tout de débogage macros et les variables non initialisées
Est-ce que votre programme utilise le filetage, puis l'optimisation peut également causer des problèmes en mode release.
Vérifiez également que toutes les exceptions, par exemple, ne sont pas directement liées à la libération de mode, mais parfois, on a juste l'ignorer certaines exceptions, comme mem violation d'accès dans VC++, mais la même chose peut être un problème au moins dans d'autres OS comme Linux, Solaris. Idéalement, votre programme ne doit pas attraper ces exceptions critiques comme un accès à un pointeur NULL.
J'ai été mordu par un certain nombre de bugs dans le passé, qui ont été bien dans les versions Debug, mais planter dans les versions Release. Il existe de nombreuses causes sous-jacentes (y compris bien sûr ceux qui ont déjà été résumées dans ce fil) et j'ai été pris par l'ensemble des suivants:
- Membre des variables ou des fonctions de membre dans un
#ifdef _DEBUG
, de sorte qu'une classe est une taille différente dans une version de débogage. Parfois,#ifndef NDEBUG
est utilisé dans un communiqué de construire - De même, il y a un autre
#ifdef
qui se trouve être seulement présent dans l'une des deux versions - La version de débogage utilise les versions de débogage du système des bibliothèques, en particulier le segment de mémoire et les fonctions d'allocation de mémoire
- Inline fonctions dans un communiqué de construire
- L'ordre d'inclusion des fichiers d'en-tête. Cela ne devrait pas causer de problèmes, mais si vous avez quelque chose comme un
#pragma pack
qui n'a pas été reset, puis cela peut conduire à de mauvaises problèmes. Des problèmes similaires peuvent également se produire en utilisant les en-têtes précompilés et forcé comprend - Caches: vous pouvez avoir des code comme les caches, qui sera utilisé dans les versions release, ou cache des limites de taille différente
- Les configurations de projet: le debug et release configurations peuvent avoir différents paramètres de construction (ce qui est susceptible de se produire lors de l'utilisation d'un IDE)
- Des conditions de course, les problèmes de synchronisation et de divers effets secondaires qui se produisent à la suite de débogage uniquement code
Quelques conseils que j'ai accumulé au fil des années pour arriver à la partie inférieure de debug/release bugs:
- Essayez de reproduire un comportement anormal dans une version de débogage si vous le pouvez, et même mieux, écrire un test unitaire pour le capturer
- Pensez à ce qui diffère entre les deux: les paramètres du compilateur, les caches, les débogage uniquement code. Essayez de minimiser les différences temporairement
- Créer une libération de construire avec des optimisations éteint (donc, vous êtes plus susceptibles d'obtenir des données utiles dans le débogueur), ou de l'optimisation de debug. En minimisant les changements entre debug et release, vous êtes plus susceptibles d'être en mesure d'isoler la différence est à l'origine du bug.
Les autres différences pourraient être:
- Dans un langage usé, le collecteur est généralement plus agressif en mode de publication.
- La disposition de la mémoire peut souvent être différente.
- La mémoire peut être initialisée différemment (par exemple, elle peut être mise à zéro en mode débogage, ou réutilisée de manière plus agressive lors de la libération);
- Les sections locales peuvent être encouragées à enregistrer des valeurs dans l'édition, ce qui peut entraîner des problèmes avec les valeurs à virgule flottante.