Partager via


Faq sur le débogage du code natif

Comment puis-je déboguer les violations d’accès lors de l’exécution de mon programme en dehors du débogueur Visual Studio ?

Set the Just-in-time debugging option and run your program stand-alone until the access violation occurs. Then, in the Access Violation dialog box, you can click Cancel to start the debugger.

Comment puis-je déboguer une violation d’accès C++ ?

Si vous obtenez une violation d’accès sur une ligne de code qui déférent plusieurs pointeurs, il peut être difficile de déterminer quel pointeur a provoqué la violation d’accès. Dans Visual Studio, la boîte de dialogue exception nomme explicitement le pointeur qui a provoqué la violation d’accès.

Par exemple, étant donné le code suivant, vous devez obtenir une violation d’accès :

#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, la boîte de dialogue d’exception suivante doit s’afficher :

Capture d’écran d’une boîte de dialogue d’exception Microsoft Visual Studio montrant une violation d’accès en lecture pour « A-B> a été nullptr ». Le bouton Arrêt est sélectionné.

Si vous ne pouvez pas déterminer pourquoi le pointeur a provoqué une violation d’accès, suivez le code pour vous assurer que le pointeur à l’origine du problème a été attribué correctement. 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 involontairement quelque part dans le programme en créant un point d’arrêt de données pour le pointeur en question pour vous assurer qu’elle n’est pas modifiée ailleurs dans le programme. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.

Comment puis-je savoir si mes pointeurs endommagent une adresse mémoire ?

Vérifiez la corruption du tas. La plupart des altérations de la mémoire sont dues à la corruption du tas. Essayez d’utiliser l’utilitaire Global Flags (gflags.exe) ou pageheap.exe. Voir GFlags et PageHeap.

Pour trouver où l’adresse mémoire est modifiée :

  1. Définissez un point d’arrêt de données à 0x00408000. Consultez Définir un point d’arrêt de modification de données (C++ natif uniquement).

  2. When you hit the breakpoint, use the Memory window to view memory contents starting at 0x00408000. For more information, see Memory Windows.

Comment puis-je savoir qui transmet une valeur de paramètre incorrecte ?

Pour résoudre ce problème :

  1. Définissez un point d’arrêt d’emplacement au début de la fonction.

  2. Right-click the breakpoint and select Condition.

  3. In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.

  4. Entrez une expression, telle que Var==3, dans la zone de texte, où Var est le nom du paramètre qui contient la valeur incorrecte et 3 est la valeur incorrecte qui lui est transmise.

  5. Select the is True radio button, and click the OK button.

  6. Réexécutez le programme. Le point d’arrêt entraîne l’arrêt du programme au début de la fonction lorsque le Var paramètre a la valeur 3.

  7. Utilisez la fenêtre Pile des appels pour rechercher la fonction appelante et accéder à son code source. Pour plus d’informations, consultez How to : Use the Call Stack Window.

Quand j’appelle une fonction des centaines de fois, comment savoir quel appel a échoué ?

Exemple : Mon programme échoue sur un appel à une certaine fonction. CnvtV Le programme appelle probablement cette fonction quelques centaines de fois avant qu’il ne échoue. Si j’ai défini un point d’arrêt d’emplacement sur CnvtV, le programme s’arrête sur chaque appel à cette fonction, et je ne veux pas cela. Je ne sais pas quelles conditions provoquent l’échec de l’appel, donc je ne peux pas définir un point d’arrêt conditionnel. Que puis-je faire ?

You can set a breakpoint on the function with the Hit Count field to a value so high that it will never be reached. In this case, because you believe the function CnvtV is called a couple hundred times, you might set Hit Count to 1000 or more. Exécutez ensuite le programme et attendez que l’appel échoue. En cas d’échec, ouvrez la fenêtre Points d’arrêt et examinez la liste des points d’arrêt. Le point d’arrêt sur lequel CnvtV vous définissez s’affiche, suivi du nombre d’itérations restant :

CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)

Vous savez maintenant que la fonction a échoué sur le 101e appel. Si vous réinitialisez le point d’arrêt avec un nombre d’accès égal à 101 et réexécutez le programme, le programme s’arrête à l’appel à CnvtV l’origine de l’échec.

Où puis-je rechercher les codes d’erreur Win32 ?

WINERROR.H in the INCLUDE directory of your default system installation contains the error code definitions for the Win32 API functions.

You can look up an error code by typing the code in the Watch window or the QuickWatch dialog box. For example:

0x80000004,hr

Comment puis-je garder le focus lors de l’exécution pas à pas de mon application ?

Exemple : Mon programme a un problème d’activation de fenêtre. L’exécution pas à pas du programme avec le débogueur interfère avec ma capacité à reproduire le problème, car mon programme continue de perdre le focus. Existe-t-il un moyen d’éviter de perdre le focus ?

Si vous avez un deuxième ordinateur, utilisez le débogage à distance. Vous pouvez utiliser votre programme sur l’ordinateur distant pendant que vous exécutez le débogueur sur l’hôte. Pour plus d’informations, consultez Guide pratique pour sélectionner un ordinateur distant.

Comment puis-je déboguer des fonctions d’API Windows ?

Pour définir un point d’arrêt sur une fonction d’API Windows avec des symboles NT chargés :

  • In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). Dans le code 32 bits, utilisez la forme décorée du nom de la fonction. To set a breakpoint on MessageBeep, for example, you must enter the following.

    {,,USER32.DLL}_MessageBeep@4
    

    Pour obtenir le nom décoré, consultez Affichage des noms décorés.

    Vous pouvez tester le nom décoré et l’afficher dans le code désassemblage. En pause sur la fonction dans le débogueur Visual Studio, cliquez avec le bouton droit sur la fonction dans l’éditeur de code ou la fenêtre de pile des appels, puis choisissez Accéder au désassemblement.

  • Dans le code 64 bits, vous pouvez utiliser le nom non optimisé.

    {,,USER32.DLL}MessageBeep
    

Next steps

Vous pouvez en savoir plus sur le débogage natif de code dans Visual Studio à l’aide des liens suivants :