2009-04-21 5 views
2

Une application c/C++ lance cette erreur, comment commencer à déboguer (meilleure idée que d'ajouter des instructions d'impression)?L'instruction "<address>" référencé la mémoire à "<address>". La mémoire n'a pas pu être lue."

+0

Il n'y a pas de langage appelé "c/C++" ... Pourquoi ne pas simplement spécifier lequel? Si c'est à la fois C et C++ comme l'indiquent vos balises, vous pourriez le dire. – unwind

+0

De quel débogueur es-tu le plus familier? Il est temps de le faire –

+2

peut-être qu'il ne sait pas dans quoi il est écrit. –

Répondre

1

Difficile de suggérer quoi que ce soit, sans le code. Essayez d'utiliser un débogueur et de définir des points d'arrêt dans votre code juste avant d'avoir rencontré le problème.

6

La deuxième adresse est-elle un très petit nombre, comme 0x00000001 ou 0x00000000? Si c'est le cas, vous avez probablement oublié d'initialiser un pointeur.

Dans tous les cas, des astuces de débogage standard s'appliquent: commencez à isoler le problème en notant quand cela arrive et en réduisant les choses à partir de là.

+1

Petit nombre: initialisé un pointeur sur NULL, jamais assigné une valeur correcte. Nombre aléatoire loin de votre espace d'adressage (en particulier si la plupart ou tous les octets du pointeur sont dans la plage 0x20-0x7f!): Oublié d'initialiser le pointeur, contient des octets d'autres objets. – MSalters

1

En fonction de votre environnement de développement, un fichier carte pour votre programme peut aider

2

Le message d'erreur suggère que vous êtes en développement avec Visual Studio. Eh bien, au moins c'est le seul environnement de développement où j'ai vu ce message d'erreur dans ce libellé.

Si tel est le cas, vous pouvez utiliser le débogage d'exception intégré pour intercepter la violation d'accès et obtenir ainsi la pile d'appels. Pour cela dans le VC++ 2003 je suis actuellement ouvert, allez dans Debug-> Exceptions, ouvrez 'Win32 Exceptions', cliquez sur "Violation d'accès c0000005" et réglez "Quand l'exception est levée" sur "Break". dans le débogueur ".

+0

J'ai reçu cette erreur d'un logiciel de marque connue qui s'est écrasé, j'étais sous l'hypothèse que le message venait de Windows. J'ai toujours pensé qu'il était triste de constater que la mémoire ne pouvait pas être "lue" ou "écrite". –

+0

Pourquoi y a-t-il aussi des marques de discours? C'est comme si on essayait de paraphraser ou quelque chose comme ça. – dreamlax

2

Comme d'autres l'ont dit, si cela est reproductible sur votre machine de développement, lancez un débogueur et soit des points d'arrêt/étape ensemble dans le code. Cependant, si cela se produit sur la machine d'un client et qu'un débogueur n'est pas disponible, vous pouvez obtenir les mêmes informations (callstack, registres, etc.) en utilisant SetUnhandledExceptionFilter et en écrivant les informations dans un fichier journal, ou en faisant un minidump. Je suspecte qu'un callstack serait l'endroit de départ le plus utile, ainsi vous pourriez employer une des fonctions de StackWalk dans le gestionnaire et écrire dans un dossier de notation. Cela nécessite au moins un fichier map ou un ensemble de symboles (PDB) pour cette version de l'application.

Questions connexes