Quelles sont certaines des raisons pour lesquelles un Communiqué de construire irait différemment que d'une version de Débogage
J'ai un Visual Studio C++ 2005 de programme qui s'exécute différemment en mode Release, que dans le mode de Débogage. En mode release, il y a une (apparente) un plantage survenant. En mode debug, il ne plante pas. Quelles sont certaines des raisons qui font qu'une version Release serait de travailler différemment que d'une version de Débogage?
Il est également intéressant de mentionner que mon programme est assez complexe et fait appel à plusieurs 3ème partie les bibliothèques pour le traitement XML, message de courtage, etc...
Merci d'avance!
- Alors j'ai essayé de répondre à votre question, peut-être que cela n'aide pas beaucoup à résoudre le problème. Tout d'abord, obtenir une bonne repro. Deuxièmement, activer les informations de débogage dans la version release. Crash toujours là? pas --> peut-être le chronométrage ou de l'initialisation. Oui --> utiliser (à distance) débogueur
Vous devez vous connecter pour publier un commentaire.
Survivre à la Version donne un bon aperçu.
Choses que j'ai rencontrés - la plupart sont déjà mentionnés
L'initialisation d'une Variable
de loin le plus fréquent. Dans Visual Studio, les versions de débogage explicitement initialiser la mémoire allouée à des valeurs, voir, par exemple, Les Valeurs De La Mémoire ici. Ces valeurs sont généralement faciles à repérer, provoquer des limites d'erreur lorsqu'il est utilisé comme un index ou une violation d'accès lorsqu'il est utilisé comme un pointeur. Non initialisé le booléen est vrai, cependant, et peut causer de la mémoire non initialisée bugs de passer inaperçues pendant des années.
Dans les versions Release où la mémoire n'est pas explicitement initialisée on ne conserve que le contenu qu'il avait avant. Cela conduit à la "drôle de valeurs" et "aléatoire" se bloque, mais comme souvent déterministes accidents qui nécessitent un apparemment sans rapport avec commande à exécuter avant la commande qui fait se bloque. Ceci est causé par la première commande "configuration" à l'emplacement de mémoire avec des valeurs spécifiques, et lorsque les emplacements de mémoire sont recyclés à la deuxième commande les voit comme des initialisations. C'est plus commun avec des non initialisée pile variables de segment, mais le dernier est arrivé à moi aussi.
Raw initialisation de la mémoire peut aussi être différente dans un communiqué de construire si vous démarrez à partir de visual studio (débogueur) vs à partir de l'explorateur. Qui fait de la "plus belle" une sorte de libération de construire des bugs qui n'apparaissent jamais sous le débogueur.
Valide Optimisations viennent en deuxième position dans mon exeprience. La norme C++ permet à beaucoup d'optimisations de prendre place ce qui peut être surprenant, mais sont tout à fait valables par exemple, lorsque deux pointeurs alias le même emplacement de mémoire, de l'ordre de l'initialisation n'est pas considéré, ou plusieurs threads modifier les emplacements mémoire même, et vous vous attendez à un certain ordre dans lequel le fil B voit les modifications apportées par filetage A. Souvent, le compilateur est mis en cause pour ces. Pas si vite, jeune yedi! - voir ci-dessous
Calendrier Release n'est pas juste "courir plus vite", pour une variété de raisons (optimisations, les fonctions de journalisation en fournissant un fil un point de synchronisation, code de débogage, comme l'affirme pas exécuté etc.) aussi la chronologie relative entre les opérations de changer de façon spectaculaire. La plupart des communes de problème découvert par qui est des conditions de course, mais aussi les blocages et simple "autre ordre" exécution de message/timer/event-based code. Même s'ils sont des problèmes de timing, ils peut être étonnamment stable entre les générations et les plates-formes, avec des reproductions que "le travail est toujours, sauf sur PC 23".
Garde Octets. Debug souvent mis (en plus) de la garde d'octets instances sélectionnées et les allocations, pour se protéger contre de l'indice des débordements et parfois underflows. Dans les rares cas où le code s'appuie sur les décalages ou les tailles, par exemple, la sérialisation des premières structures, ils sont différents.
Autre code différences Quelques instructions - e.g affirme - évaluer pour rien dans les versions release. Parfois, ils ont des effets secondaires différents. C'est fréquent avec les macro ruse, comme dans le classique (attention: plusieurs erreurs)
Qui, dans un communiqué de construire, évalue à if (foo && bar)
Ce type d'erreur est très très rare avec la normale de code C/C++, et les macros sont correctement écrits.
Compilateur Bugs Ce vraiment jamais jamais arrive. Bien qu'il fait, mais vous êtes pour la plus grande partie de votre carrière de mieux en supposant qu'il ne l'est pas. Dans une décennie de travail avec VC6, j'en ai trouvé un où je suis toujours convaincu que c'est un non compilateur bug, par rapport à des dizaines de modèles (peut-être même des centaines de cas) avec un manque de compréhension de l'écriture (un.k.un. le standard).
Dans la version de débogage souvent des affirmations et/ou les symboles de débogage est activé. Cela peut conduire à différentes disposition de la mémoire. Dans le cas d'un pointeur incorrect, le débordement d'un tableau ou similaire accès à la mémoire vous accédez dans un cas critique mauvaise mémoire (par exemple, le pointeur de fonction) et dans d'autres cas, peut-être juste quelques non-critique de la mémoire (par exemple, juste un doc chaîne est saccagé)
Les Variables ne sont pas initialisées explicitement seront ou pourraient ne pas être remis à zéro en version Release.
Version Release (espérons-le) permettrait de courir plus vite que votre version de débogage. Si vous utilisez plus d'un thread, vous pouvez voir plus d'entrelacement, ou tout simplement un thread en cours d'exécution plus rapide que les autres, qui vous a peut-être pas remarqué dans la version debug.
J'avais un problème similaire n'y a pas longtemps, qui a fini par être causée par la pile soient traités différemment dans les diverses versions. D'autres choses qui peuvent différer:
Elle dépend à la fois dans le fournisseur de compilateur et les bibliothèques que vous compilez avec les indicateurs de DÉBOGAGE. Alors que le code de DÉBOGAGE ne doit jamais affecter l'exécution de code (devrait pas avoir d'effets secondaires), il le fait parfois.
En particulier, les variables peuvent être initialisées uniquement en mode de DÉBOGAGE et de la gauche non initialisé en mode RELEASE. Le TSL dans Visual Studio compilateurs sont différents en DEBUG et RELEASE modes. L'idée est que les itérateurs sont entièrement contrôlés en DEBUG afin de détecter d'éventuelles erreurs (à l'aide de invalidé les itérateurs, par exemple un itérateur dans un vecteur est invalidée si l'insertion se produit après l'itérateur est récupéré).
La même chose arrive avec des bibliothèques tierces, le premier que je peux penser à est de QT4, qui permettra de mettre fin à votre programme avec une assertion si un thread différent de celui qui a créé l'objet graphique effectue des opérations de peinture.
Avec tous les changements, votre code et empreinte mémoire sera différent dans les deux modes. Un pointeur (la lecture de la position que l'on passe la fin d'un tableau) problème peut passer inaperçue si cette position est lisible.
Affirmations sont destinés à tuer l'application au cours de DÉBOGAGE et de disparaître de la RELEASE, donc je ne pense pas que sur des affirmations comme étant à votre problème. Un voyou pointeur ou d'accéder à un passé la fin de ma première suspects.
Il y a quelques temps il y avait des problèmes avec certaines optimisations du compilateur casser le code, mais je n'ai pas lu les plaintes ces derniers temps. Il pourrait y avoir un problème d'optimisation de là, mais ce ne serait pas mon premier suspect.
Release sont généralement compilé avec l'optimisation activée dans le compilateur, tandis que les versions de débogage ne sont généralement pas.
Dans certaines langues, ou lors de l'utilisation de beaucoup de différentes bibliothèques, cela peut provoquer des plantages intermittents, en particulier lorsque le niveau d'optimisation choisi est très élevé.
Je sais que c'est le cas avec la gcc compilateur C++, mais je ne suis pas sûr à propos de Microsoft du compilateur.
http://www.debuginfo.com/tips/userbpntdll.html
En raison du fait que la garde octets sont ajoutés dans les versions de débogage, vous pouvez être en mesure de "sécurité", l'accès à la mémoire qui est hors-limites pour un tableau (en particulier les tableaux dynamiques), mais cela va provoquer une violation d'accès dans la version release. Cette erreur peut passer inaperçue, provoquant une corruption de segment de mémoire et, éventuellement, une violation d'accès dans un lieu sans rapport avec l'origine de l'erreur.
Utiliser PageHeap (ou, si vous avez des Outils de Débogage installé, vous pouvez utiliser gflags) pour découvrir les bugs liés à corrompre le tas.
http://support.microsoft.com/?id=286470
Dans mon expérience, la raison la plus courante semble être que les configurations diffèrent à plusieurs égards de la libération/paramètres de construction. E. g. différentes libs sont inclus, ou le debug est différente de la taille de la pile de la version de publication.
Pour éviter cela dans nos projets Visual Studio 2005, nous utilisons les feuilles de propriétés de manière intensive. De cette façon, la release et debug configurations peuvent partager des paramètres communs.
Ce post avec les liens fournis sont très utiles pour la fixation de problème.
ajouter à la liste ci-dessus, la différence dans les conventions d'appel peuvent également conduire à ce problème - Il a échoué dans la version construire qu'avec l'optimisation pour moi.
j'ai déclaré que __stdcall et défini en tant que __cdecl ( par défaut). [étrangement cet avertissement n'est pas choisi, même en avertir le niveau 4 MSVC?]