L'Application se bloque dit : violation d'Accès lecture de l'emplacement
Mon application se bloque après environ 18 heures. Je ne suis pas en mesure de déboguer le point dans le code où ça se bloque. J'ai vérifié la pile d'appel - il ne fournit pas toute l'information en tant que telle. Les derniers appels dans la pile d'appel sont grisées-sens, je ne vois pas le code de cette partie-qu'ils appartiennent tous à des bibliothèques MFC.
Cependant, j'ai cette "MicroSoft Visual Studio' pop-up quand il se bloque, qui dit :
Exception non gérée à 0x7c809e8a dans NIMCAsst.exe: 0xC0000005:
Violation d'accès lecture de l'emplacement 0x154c6000.
Pourrait les informations ci-dessus, utile pour comprendre d'où il s'écroule.Est-il un logiciel qui pourrait m'en dire un particulier, l'adresse de mémoire est tenue par lequel la variable dans le code.
- Exactement pourquoi ne pouvez-vous pas de débogage?
- Il vient se bloque à un certain point au hasard.Il va à l'intérieur de dll MFC et il se bloque et la pile d'appel ne dit pas à quel point dans mon code a pris le contrôle.
- Si vous avez un débogueur, vous devriez être en mesure de voir clairement ce que la ligne de votre code d'appels dans le MFC. Si pas, c'est soit potimization activé ou que vous avez .fichiers pdb pas synchrone avec l'exécutable.
Vous devez vous connecter pour publier un commentaire.
Si vous ne pouvez pas intercepter l'exception, parfois, vous avez juste à passer par votre code, ligne par ligne, très désagréable, mais je préfère mettre de l'argent sur votre code dans la bibliothèque MFC (toujours avec mes bugs). De vérifier la façon dont vous utilisez la mémoire et que vous êtes de passage dans le MFC fonctions très attentivement.
Probablement l'accident est provoqué par un dépassement de tampon ou d'un autre type de corruption de la mémoire. Cela a écrasé une partie de la pile de la tenue de l'adresse de retour qui a fait le débogueur pas en mesure de reconstruire la trace de la pile correctement. Ou, que le code qui a causé l'accident, vous n'avez pas correct sybols (si la trace de la pile indique un nom de module, ce serait le cas).
Ma première hypothèse consisterait à examiner le code appelant le code qui est tombé en panne d'éventuels problèmes qui pourraient en être la cause. Vous obtenez toutes les autres exceptions ou les conditions d'erreur avant le crash? Peut-être que vous êtes ignorant un retour d'erreur? Avez-vous essayez d'utiliser la Debug Tas? Qu'en est adplus? Application verifier à son tour sur le tas des contrôles?
D'autres possibilités pour exécuter un outil comme pclint sur le code pour vérifier pour d'évidentes questions de l'utilisation de la mémoire. Êtes-vous à l'aide de threads? Peut-être qu'il est une condition de course. La liste pourrait continuer indéfiniment vraiment.
Les informations ci-dessus ne vous raconte de mémoire qui a accédé illégalement.
Vous pouvez utiliser des exceptions pour affiner l'endroit où le problème se produit, mais alors vous devez avoir au moins une idée dans quel coin chercher.
Vous disent que vous avez de voir la pile d'appel, qui suggère que vous êtes à l'aide d'un débogueur. Le code source de la MFC est disponible (mais peut-être pas avec tous les vc++ éditions), donc en principe, on peut tracer à travers elle. Qui de VC++ version utilisez-vous?
Le fait que le bug prend tellement de temps à se produire à croire qu'elle est une corruption de mémoire. Une autre fonction de l'écriture d'un endroit qu'il ne possède pas. Cela fonctionne un temps long, mais enfin, la fonction modifie un pointeur qui MCF besoins, et après un certain temps, MFC accède au pointeur et vous en êtes informé.
Parfois, la "localisation" peuvent être reconnus comme des données, dans ce cas, vous avez un indice. F. e. si l'erreur dit:
Violation d'accès lecture de l'emplacement 0x31323334
vous feriez la reconnaître comme une partie d'une chaîne ASCII "1234", et cela pourrait vous conduire à le coupable.
Comme dit Patrick, c'est presque certainement votre code donnant MFC valeurs non valides. On imagine que vous êtes de passage dans une longueur incorrecte si la bibliothèque est la lecture de trop loin. Mais il y a vraiment une multitude de causes possibles.
Est le crash clairement reproductible?
Si oui, Utilisez les fichiers de Log! Vous devez utiliser un fichier de log et d'ajouter un certain nombre de déclarations qui vient du journal le fichier source/numéro de la ligne du passé. Commencez avec un peu de déclarations au point d'entrée (principale gestionnaire d'événements) et les plus communs de chemins d'exécution. Après le crash d'inspecter la dernière entrée dans le fichier de log. Puis ajouter de nouvelles entrées dans la voie de la/les chemins que doivent avoir été transmis etc. Généralement, après quelques itérations de ce travail, vous trouverez le point de défaillance. Dans le cas de votre temps d'attente est long le fichier journal peut devenir énorme et à chaque itération va prendre un autre de 18 heures. Vous devrez peut-être ajouter un peu de la technique de la rotation des fichiers journaux etc. Mais avec cette technique, j'ai été en mesure de trouver des comparables bugs.
Quelques questions supplémentaires:
Est votre application multithread?
Faut-il utiliser les tableaux ne sont pas gérés par la stl ou comparables conteneurs (qu'il n'utilise C-Strings, C/C++-Tableaux etc)?
Essayez d'attacher un débogueur au processus et ont le débogueur se brisent sur des violations d'accès.
Si ce n'est pas possible, alors nous utilisons un outil appelé "processus en mode Utilisateur dumper" pour créer une image mémoire du processus à l'endroit où la violation d'accès s'est passé. Vous pouvez trouver ce à télécharger ici:
http://www.microsoft.com/downloads/details.aspx?FamilyID=E089CA41-6A87-40C8-BF69-28AC08570B7E&displaylang=en
Comment cela fonctionne: Vous de configurer des règles par processus (ou éventuellement à l'échelle du système), et disposer de l'outil créer un minidump ou un vidage complet au moment où il détecte toute partie d'une liste d'exceptions - l'un d'eux étant une violation d'accès. Après le cliché a été faite la demande continue normalement (et donc, si la violation d'accès n'est pas gérée, vous verrez alors cette boîte de dialogue).
Noter que TOUTES les violations d'accès dans votre processus sont capturés, même celles qui sont ensuite traitées plus tard, également un vidage complet pouvez créer un tout à créer en fonction de la quantité de mémoire que l'application est à l'aide de (10 à 20 secondes pour un processus long de 100 à 200 MO de mémoire privée). Pour cette raison, il est probablement pas une bonne idée pour permettre à l'échelle du système.
Vous devriez alors être en mesure d'analyser la décharge à l'aide d'outils comme WinDbg (http://www.microsoft.com/whdc/devtools/debugging/default.mspx) pour comprendre ce qui s'est passé - dans la plupart des cas, vous trouverez que vous avez seulement besoin d'un minidump, pas un vidage complet (toutefois, si votre application ne pas utiliser beaucoup de mémoire, puis il arent vraiment beaucoup d'inconvénients d'avoir un full dump autres que la taille du fichier et le temps qu'il faut pour créer le cliché).
Enfin, soyez averti que le débogage des violations d'accès à l'aide de WinDbg peut être un assez involed et complexe processus - si vous pouvez obtenir une trace de la pile d'une autre façon, alors vous pourriez vouloir essayer en premier.
C'est la cause de la possible fuite de mémoire, il y a différents blogs pourrait enseigner la vérification de fuites de mémoire dans l'application, il vous suffit de faire des observations sur la Physique de la Mémoire du processus du Gestionnaire des Tâches de Windows, vous pouvez trouver à un moment où la mémoire continuer à augmenter & exécuter de mémoire. Vous pouvez également essayer de lancer avec windbg outil pour identifier les fuites de mémoire dans votre code. Je n'ai pas utilisé cet outil de simplement donner quelques têtes sur ce sujet.