Comment puis-je déboguer une Violation d’accès de C++ ?How Can I Debug a C++ Access Violation?

Description du problèmeProblem Description

Mon programme provoque une violation d'accès.My program produces an access violation. Comment puis-je corriger cette erreur ?How can I debug this?

SolutionSolution

Si vous obtenez une violation d’accès sur une ligne de code qui déréférence plusieurs pointeurs, il peut être difficile de trouver le pointeur à l’origine de la violation d’accès.If you get an access violation on a line of code that dereferences multiple pointers, it can be difficult to find out which pointer caused the access violation. À compter de Visual Studio 2015 Update 1, la boîte de dialogue d’exception nomme désormais de manière explicite le pointeur à l’origine de la violation d’accès.Starting in Visual Studio 2015 Update 1, the exception dialog box now explicitly names the pointer that caused the access violation.

Par exemple, le code suivant doit générer une violation d’accès :For example, given the following code, you should get an access violation:

#include <iostream>  
using namespace std;  
  
class ClassC {
public:
  void printHello() {
    cout << "hello world";
  }
};

class ClassB {
public:
  ClassC* C;
  ClassB() {
    C = new ClassC();
  }
};

class ClassA {
public:
  ClassB* B;
  ClassA() {
    // Uncomment to fix
    // B = new ClassB();
  }
};

int main() {
  ClassA* A = new ClassA();
  A->B->C->printHello();

}

Si vous exécutez ce code dans Visual Studio 2015 Update 1, la boîte de dialogue d’exception suivante doit s’afficher :If you run this code in Visual Studio 2015 Update 1, you should see the following exception dialog:

AccessViolationCPlusAccessViolationCPlus

Si vous n’arrivez pas à déterminer la raison pour laquelle le pointeur a provoqué une violation d’accès, tracez le code pour vérifier que le pointeur à l’origine du problème a été correctement assigné.If you cannot determine why the pointer caused an access violation, trace through the code to make sure that the pointer causing the problem has been assigned correctly. S’il est passé en tant que paramètre, vérifiez qu’il est passé correctement et qu’une copie superficielle n’est pas accidentellement créée.If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Vérifiez ensuite que les valeurs ne sont pas modifiées de manière non intentionnelle à un endroit du programme. Pour cela, créez un point d’arrêt sur variable pour le pointeur en question pour vous assurer qu’il n’est pas en cours de modification autre part dans le programme.Then verify that the values are not being unintentionally changed somewhere in the program by creating a Data Breakpoint for the pointer in question to make sure it isn't being modified elsewhere in the program. Pour plus d’informations sur les points d’arrêt sur variable, consultez la section consacrée à ce sujet dans Using Breakpoints.For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.

Voir aussiSee Also

Forum Aux Questions sur le débogage du code natifDebugging Native Code FAQs