Déboguer uniquement du code utilisateur avec Just My Code

Just My Code est une fonctionnalité de débogage de Visual Studio qui ignore automatiquement les appels au système, au framework et à d'autres codes non-utilisateur. Dans la fenêtre Pile des appels, Uniquement mon code réduit ces appels dans des frames [External Code].

Just My Code fonctionne différemment dans les projets .NET et C++.

Activer ou désactiver la fonctionnalité "Just My Code"

Pour la plupart des langages de programmation, just My Code est activé par défaut.

  • Pour activer ou désactiver Uniquement mon code dans Visual Studio, sous Outils>Options (ou Déboguer>Options) >Débogage>Général, cochez ou décochez Activer Uniquement mon code.

Capture d’écran de l’option Activer uniquement mon code dans la boîte de dialogue Options.

Capture d’écran de l’option Activer uniquement mon code dans la boîte de dialogue Options.

Remarque

Activer uniquement mon code est un paramètre global qui s’applique à tous les projets Visual Studio dans tous les langages.

Uniquement mon code (débogage)

Pendant une session de débogage, la fenêtre Modules indique quels modules de code le débogueur traite comme Mon code (code utilisateur), ainsi que leur état de chargement de symboles. Pour plus d’informations, consultez Familiarisez-vous avec la façon dont le débogueur s’attache à votre application.

Capture d’écran du code utilisateur dans la fenêtre Modules.

Capture d’écran du code utilisateur dans la fenêtre Modules.

Dans la fenêtre Pile des appels ou Tâches, Uniquement mon code réduit le code non-utilisateur dans un frame de code annoté grisé et étiqueté [External Code].

Capture d’écran d’External Code dans la fenêtre Pile des appels.

Capture d’écran d’External Code dans la fenêtre Pile des appels.

Conseil

Pour ouvrir les fenêtres Modules, Pile des appels, Tâches ou la plupart des autres fenêtres de débogage, vous devez être dans une session de débogage. Pendant le débogage, sous Déboguer>Fenêtres, sélectionnez les fenêtres que vous souhaitez ouvrir.

Pour voir le code dans un frame [External Code] réduit, cliquez avec le bouton droit dans la fenêtre Pile des appels ou Tâche, puis sélectionnez Afficher le code externe dans le menu contextuel. Les lignes de code externe étendues remplacent le cadre [Code externe].

Capture d’écran d’External Code Show dans la fenêtre Pile des appels.

Capture d’écran d’External Code Show dans la fenêtre Pile des appels.

Remarque

Afficher le code externe est un paramètre de profileur utilisateur actuel qui s’applique à tous les projets dans toutes les langues ouvertes par l’utilisateur.

Un double-clic sur une ligne de code externe développée dans la fenêtre Pile des appels met en évidence la ligne de code appelante en vert dans le code source. Pour les DLL ou d’autres modules introuvables ou chargés, un symbole ou une page source introuvable peut s’ouvrir.

À compter de Visual Studio 2022 version 17.7, vous pouvez décompiler automatiquement le code .NET en double-cliquant sur le code externe dans la fenêtre Pile des appels. Pour plus d’informations, consultez Générer du code source à partir d’assemblys .NET pendant le débogage.

.NET "Just My Code" (uniquement mon code)

Dans les projets .NET, Just My Code utilise des fichiers de symbole (.pdb) et des optimisations de programme pour classifier le code utilisateur et non-utilisateur. Le débogueur .NET considère que les fichiers binaires optimisés et non chargés .pdb sont du code non utilisateur.

Trois attributs du compilateur affectent également ce que le débogueur .NET considère comme du code utilisateur :

Le débogueur .NET considère que tout autre code est du code utilisateur.

Pendant le débogage .NET :

  • Déboguer>Effectuer un pas à pas détaillé (ou F11) sur du code non-utilisateur effectue un pas à pas du le code jusqu’à la ligne suivante du code utilisateur.
  • Déboguer>Pas à pas sortant (ou Maj+F11) sur du code non-utilisateur s’exécute jusqu’à la ligne suivante du code utilisateur.

S’il n’y a plus de code utilisateur, le débogage continue jusqu’à ce qu’il se termine, qu’il atteigne un autre point d’arrêt ou qu’il génère une erreur.

Si le débogueur s’arrête dans du code non-utilisateur (par exemple, vous utilisez Déboguer>Tout arrêter et faites une pause dans du code non-utilisateur), la fenêtre Aucune source s’affiche. Vous pouvez ensuite utiliser une commande Déboguer>Exécuter pas à pas pour accéder à la ligne suivante de code utilisateur.

Si une exception non gérée se produit dans du code non-utilisateur, le débogueur s’arrête à la ligne de code utilisateur où l’exception a été générée.

Si les exceptions de première chance sont activées pour l’exception, la ligne de code utilisateur appelante est mise en surbrillance en vert dans le code source. La fenêtre Pile des appels affiche le frame annoté étiqueté [External Code].

C++ Juste mon code

À compter de Visual Studio 2017 version 15.8, Uniquement mon code est également pris en charge pour l’exécution pas à pas du code. Cette fonctionnalité nécessite également le commutateur de compilateur /JMC (débogage Uniquement mon code). Le commutateur est activé par défaut dans les projets C++. Pour la prise en charge de la fenêtre Pile des appels et de la pile des appels dans Uniquement mon code, le commutateur /JMC n’est pas obligatoire.

À classer comme code utilisateur, la base de données PDB pour le fichier binaire contenant le code utilisateur doit être chargée par le débogueur (utilisez la fenêtre Modules pour vérifier l’état de chargement).

Pour le comportement de la pile d’appels, comme dans la fenêtre Pile des appels, Uniquement mon code en C++ considère ces fonctions uniquement comme du code non-utilisateur :

  • Fonctions avec des informations sources supprimées dans leur fichier de symboles.
  • Fonctions où les fichiers de symboles indiquent qu’il n’existe aucun fichier source correspondant au cadre de la pile.
  • Fonctions spécifiées dans les fichiers *.natjmc dans le dossier %VsInstallDirectory%\Common7\Packages\Debugger\visualiseurs.

Pour le comportement d’exécution pas à pas du code, Uniquement mon code en C++ considère ces fonctions uniquement comme du code non-utilisateur :

  • Fonctions pour lesquelles le fichier PDB correspondant n’a pas été chargé dans le débogueur.
  • Fonctions spécifiées dans les fichiers *.natjmc dans le dossier %VsInstallDirectory%\Common7\Packages\Debugger\Visualisateurs.

Remarque

Pour la prise en charge pas à pas du code dans Just My Code, le code C++ doit être compilé à l’aide des compilateurs MSVC dans Visual Studio 15.8 Preview 3 ou version ultérieure, et le commutateur du compilateur /JMC doit être activé (il est activé par défaut). Pour plus d’informations, consultez Personnaliser le comportement de la pile d’appels C++ et de l’exécution pas à pas du code et ce billet de blog. Pour le code compilé avec un compilateur plus ancien, les fichiers .natstepfilter sont le seul moyen de personnaliser l’exécution pas à pas du code, qui est indépendante de Uniquement mon code. Consultez Personnaliser le comportement de l’exécution pas à pas du code C++.

Pendant le débogage C++, le code non utilisateur est ignoré par défaut. Pendant le débogage C++ :

  • Déboguer>Pas à pas détaillé (ou F11) sur les étapes de code non utilisateur passe au-dessus du code ou s’exécute sur la ligne suivante du code utilisateur, si Pas à pas détaillé est appelé à partir de code non-utilisateur.
  • Déboguer>Pas à pas sortant (ou Maj+F11) sur le code non utilisateur s’exécute sur la ligne suivante de code utilisateur (en dehors du cadre de pile actuel).

S’il n’y a plus de code utilisateur, le débogage se poursuit jusqu’à sa fin, atteint un autre point d’arrêt ou génère une erreur.

Si le débogueur s’arrête dans du code non-utilisateur (par exemple, vous utilisez Déboguer>Tout arrêter et faites une pause dans du code non-utilisateur), l’exécution pas à pas du code continue dans le code non-utilisateur.

Si le débogueur atteint une exception, il s’arrête sur l’exception, qu’il s’agisse de code utilisateur ou de code non utilisateur. Les options Non gérée par l’utilisateur de la boîte de dialogue Paramètres des exceptions sont ignorées.

Personnaliser le comportement de la pile d’appels C++ et de l’exécution pas à pas du code

Pour les projets C++, vous pouvez spécifier les modules, les fichiers sources et les fonctions que la fenêtre pile des appels traite comme du code non utilisateur en les spécifiant dans fichiers *.natjmc. Cette personnalisation s’applique également à l’exécution pas à pas du code si vous utilisez le compilateur le plus récent (voir C++ Juste mon code).

  • Pour spécifier du code non utilisateur pour tous les utilisateurs de l’ordinateur Visual Studio, ajoutez le fichier .natjmc au dossier %VsInstallDirectory%\Common7\Packages\Debugger\Visualiseurs.
  • Pour spécifier du code non-utilisateur pour un utilisateur individuel, ajoutez le fichier .natjmc au dossier %USERPROFILE%\Mes documents\<Visual Studio version>\Visualiseurs dossier.

Un fichier .natjmc est un fichier XML avec cette syntaxe :

<?xml version="1.0" encoding="utf-8"?>
<NonUserCode xmlns="http://schemas.microsoft.com/vstudio/debugger/jmc/2015">

  <!-- Modules -->
  <Module Name="ModuleSpec" />
  <Module Name="ModuleSpec" Company="CompanyName" />

  <!-- Files -->
  <File Name="FileSpec"/>

  <!-- Functions -->
  <Function Name="FunctionSpec" />
  <Function Name="FunctionSpec" Module ="ModuleSpec" />
  <Function Name="FunctionSpec" Module ="ModuleSpec" ExceptionImplementation="true" />

</NonUserCode>

attributs d’élément module

Attribut Description
Name Obligatoire. Chemin d’accès complet du ou des modules. Vous pouvez utiliser les caractères génériques Windows ? (zéro ou un caractère) et * (zéro ou plusieurs caractères). Par exemple

<Module Name="?:\3rdParty\UtilLibs\*" />

indique au débogueur de traiter tous les modules dans \3rdParty\UtilLibs sur n’importe quel lecteur comme code externe.
Company Optionnel. Nom de la société qui publie le module incorporé dans le fichier exécutable. Vous pouvez utiliser cet attribut pour lever l’ambiguïté des modules.

Attributs des éléments File

Attribut Description
Name Obligatoire. Chemin d’accès complet du fichier source ou des fichiers à traiter comme du code externe. Vous pouvez utiliser les caractères génériques Windows ? et * lors de la spécification du chemin d’accès.

Attributs des éléments Function

Attribut Description
Name Obligatoire. Nom complet de la fonction à traiter en tant que code externe. Vous pouvez utiliser les caractères génériques Windows ? et * lors de la spécification du chemin d’accès.
Module Optionnel. Nom ou chemin d’accès complet au module qui contient la fonction. Vous pouvez utiliser cet attribut pour lever l’ambiguïté des fonctions portant le même nom.
ExceptionImplementation Lorsqu’elle est définie sur true, la pile des appels affiche la fonction qui a levé l’exception plutôt que cette fonction.

Personnaliser le comportement pas à pas C++ indépendamment des paramètres Just My Code

Dans les projets C++, vous pouvez spécifier des fonctions à exécuter pas à pas en les listant comme des fonctions NoStepInto dans les fichiers *.natstepfilter. Les fichiers *.natstepfilter contiennent des fonctions qui ne dépendent pas des paramètres Just My Code. Une fonction NoStepInto indique au débogueur d’effectuer un pas à pas sur la fonction, même si elle appelle des fonctions « StepInto» ou d’autres codes utilisateur. Contrairement aux fonctions répertoriées dans .natjmc, le débogueur passe à la première ligne de code utilisateur à l’intérieur de la fonction NoStepInto.

  • Pour spécifier du code non utilisateur pour tous les utilisateurs de Visual Studio locaux, ajoutez le fichier .natstepfilter au dossier %VsInstallDirectory%\Common7\Packages\Debugger\Visualiseurs.
  • Pour spécifier du code non-utilisateur pour un utilisateur individuel, ajoutez le fichier .natstepfilter au dossier %USERPROFILE%\Mes documents\<Visual Studio version>\Visualiseurs.

Remarque

Certaines extensions tierces peuvent désactiver la fonctionnalité .natstepfilter .

Un fichier .natstepfilter est un fichier XML avec cette syntaxe :

<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010">
    <Function>
        <Name>FunctionSpec</Name>
        <Action>StepAction</Action>
    </Function>
    <Function>
        <Name>FunctionSpec</Name>
        <Module>ModuleSpec</Module>
        <Action>StepAction</Action>
    </Function>
</StepFilter>

Élément Description
Function Obligatoire. Spécifie une ou plusieurs fonctions en tant que fonctions non-utilisateur.
Name Obligatoire. Une expression régulière mise en forme selon ECMA-262 spécifiant le nom complet de la fonction concernée. Par exemple:

<Name>MyNS::MyClass::.*</Name>

indique au débogueur que toutes les méthodes de MyNS::MyClass doivent être considérées comme du code non utilisateur. La recherche de correspondance respecte la casse.
Module Optionnel. Expression régulière mise en forme ECMA-262 spécifiant le chemin complet du module contenant la fonction. La recherche de correspondance ne respecte pas la casse.
Action Obligatoire. Une des valeurs suivantes (respectant la casse) :

NoStepInto : indique au débogueur d’exécuter pas à pas la fonction concernée.
StepInto : indique au débogueur d'entrer dans la fonction, en annulant n'importe quel autre NoStepInto pour la fonction correspondante.

Informations supplémentaires sur les fichiers .natstepfilter et .natjmc

  • À compter de Visual Studio 2022 version 17.6, vous pouvez ajouter .natjmc et fichiers .natstepfilter directement à la solution ou au projet.

  • Les erreurs de syntaxe dans les fichiers .natstepfilter et .natjmc ne sont pas signalées dans la fenêtre de sortie du débogueur.

  • Contrairement aux fichiers .natvis, les fichiers .natstepfilter et .natjmc ne sont pas rechargés à chaud. Au lieu de cela, ces fichiers sont rechargés près du début de la session de débogage.

  • Pour les fonctions de modèle, l’utilisation de &lt;.*&gt; ou de &lt;.* dans le nom peut être utile.

Uniquement mon code JavaScript

Pour projets .esproj dans Visual Studio 2022, Visual Studio Code utilise un fichier launch.json pour configurer et personnaliser le débogueur. launch.json est un fichier de configuration du débogueur.

Visual Studio attache le débogueur uniquement au code utilisateur. Pour les projets .esproj, vous pouvez configurer le code utilisateur (c’est-à-dire les paramètres Just My Code ) à l’aide du paramètre skipFiles dans Visual Studio, dans launch.json. Ce paramètre fonctionne de la même façon que les paramètres de launch.json dans VS Code. Pour plus d’informations sur skipFiles, consultez Ignorer le code non pertinent.