Uniquement mon code
Les développeurs qui utilisent des langages .NET Framework sont familiarisés avec la fonctionnalité du débogueur Uniquement mon code qui passe au-dessus du système, de l'infrastructure, et des autres appels non-utilisateurs et réduit ces appels dans les fenêtres de pile des appels. Dans Visual Studio 2013, Uniquement mon code a été étendu aux langages C++ et JavaScript. Cette rubrique décrit en détail l'utilisation Uniquement mon code dans le .NET Framework, C++ natif, et les projets de JavaScript.
Sommaire
Pour activer ou désactiver Uniquement mon code
.NET Framework Uniquement mon code
C++ uniquement mon code
JavaScript Uniquement mon code
Activer ou désactiver Uniquement mon code
Pour activer ou désactiver Uniquement mon code, choisissez Options et paramètres dans le menu Déboguer. Dans le Débogage /nœud Général, sélectionnez ou désactivez Activer Uniquement mon code.
Notes
Le paramètre Activer Uniquement mon code est un paramètre global qui est appliqué à tous les projets Visual Studio dans toutes les langues.
Filtrage de la pile des appels de priorité
Dans l'affichage de la pile des appels, tels que les fenêtres Pile des appels et Tâches, Uniquement mon code réduit le code non-utilisateur dans un cadre annoté intitulé [External Code]. Pour afficher les frames réduites, choisissez Afficher le code externe dans le menu contextuel de l'affichage de la pile des appels.
Notes
Le paramètre Afficher le code externe est enregistré au profileur de l'utilisateur actuel.Il est appliqué à tous les projets dans tous les langages qui sont ouverts par l'utilisateur.
.NET Framework Uniquement mon code
Code Utilisateur et non-utilisateur**|Comportement de progression|Comportement de point d'arrêt|**Comportement d'exception
Code utilisateur et non-utilisateur
Pour distinguer le code utilisateur du code non-utilisateur, Uniquement mon code examine les projets ouverts, les fichiers de symboles (.pdb), et les optimisations de programme.
Si un fichier binaire est généré à partir d'un projet Visual Studio ouvert, il est toujours considéré comme du code utilisateur.
Le débogueur considère le code comme non-utilisateur lorsque le binaire est optimisé ou lorsque le fichier .pdb n'est pas disponible.
Trois attributs affectent également ce que le débogueur considère comme Mon code :
DebuggerNonUserCodeAttribute indique au débogueur que le code auquel il s'applique n'est pas Mon code.
DebuggerHiddenAttribute masque le code au débogueur, même si l'option Uniquement mon code est désactivée.
DebuggerStepThroughAttribute indique au débogueur de passer pas à pas dans le code auquel il s'applique, plutôt que d'effectuer un pas à pas détaillé du code.
Tout autre code est considéré comme utilisateur.
Comportement de progression
Lorsque vous utilisez Pas à pas détaillé (raccourci clavier : F11 ) dans le code non-utilisateur, le débogueur effectue un pas dans le code jusqu'à l'instruction suivante de l'utilisateur. Lorsque vous utilisez Pas à pas sortant (raccourci clavier : Maj + F11), le débogueur saute à la ligne suivante de code utilisateur. Si aucun code utilisateur n'est rencontré alors l'exécution se poursuit jusqu'à ce que l'application s'arrête, qu'un point d'arrêt soit atteint, ou qu'une exception se produise.
Comportement de point d'arrêt
Lorsque l'option Uniquement mon code est activée, choisissez Interrompre tout (raccourci clavier : Ctrl + ALT + Pause) pour arrêter l'exécution à un emplacement où il n'y a aucun code utilisateur à afficher. Lorsque cela se produit, la fenêtre Pas de source est affichée. Si vous choisissez une commande d'étape, le débogueur vous amène à la ligne suivante de code utilisateur.
Comportement d'exception
Si une exception non gérée se produit dans le code non-utilisateur, le débogueur s'arrête à la ligne du code utilisateur où l'exception a été générée.
Si les premières exceptions d'exécution sont activées pour l'exception, la ligne du code utilisateur est surlignée en vert. La pile des appels affiche un cadre annoté intitulé [Code externe].
C++ uniquement mon code
Code utilisateur et non-utilisateur**|Comportement de progression|Comportement d'exception|Personnaliser le comportement de progression|**Personnaliser le comportement de pile des appels
Code utilisateur et non-utilisateur
La version C++ de Uniquement mon code est différente des versions .NET Framework et JavaScript de celui-ci, car le comportement de progression est indépendant du comportement de la pile des appels.
Piles d'appels
Par défaut, le débogueur considère ces fonctions en tant que code non-utilisateur dans les fenêtres de pile d'appels :
Fonctions avec information source supprimée dans leur fichier de symboles.
Fonctions où les fichiers de symboles indiquent qu'il n'existe aucun fichier source correspondant au frame de pile.
Fonctions spécifiées dans les fichiers *.natjmc dans le dossier %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
Pas à pas
Par défaut, seuls les fonctions spécifiées dans les fichiers *.natstepfilter dans le dossier %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers sont considérées comme du code non-utilisateur.
Créez votre propre .natstepfilter et .natjmc pour personnaliser la progression et le comportement de la fenêtre Pile des appels dans %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers.
Comportement de progression
Lorsque vous utilisez Pas à pas détaillé (raccourci clavier : F11) de code non-utilisateur depuis du code utilisateur, le débogueur effectue un pas dans le code jusqu'à la ligne suivante du code utilisateur. Lorsque vous utilisez Pas à pas sortant (raccourci clavier : Maj + F11), le débogueur saute à la ligne suivante de code utilisateur. Si aucun code utilisateur n'est rencontré alors l'exécution se poursuit jusqu'à ce que l'application s'arrête, qu'un point d'arrêt soit atteint, ou qu'une exception se produise.
Si le débogueur s'introduit dans du code non-utilisateur (par exemple, si une commande Arrêter tout s'arrête dans du code non-utilisateur), la progression continue dans celui-ci.
Comportement d'exception
Lorsque le débogueur atteint une exception, il s'arrête sur celle-ci indépendamment de si elle est située dans du code utilisateur ou non-utilisateur. Les options Non géré par l'utilisateur dans la boîte de dialogue Exceptions sont ignorées.
Personnaliser le comportement de progression
Spécifiez à des fonctions d'y accéder en les répertoriant en tant que code non-utilisateur dans des fichiers *.natstepfilter.
Pour spécifier le code non-utilisateur pour tous les utilisateurs de l'ordinateur Visual Studio, ajoutez le fichier .natstepfilter au dossier %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
Pour spécifier le code non-utilisateur pour un utilisateur individuel, ajoutez le fichier .natstepfilter au dossier %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers.
Les fichiers .natstepfilter sont des fichiers xml avec cette syntaxe :
<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="https://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 |
---|---|
Fonction |
Requis. Spécifie une ou plusieurs fonctions en tant que fonctions non-utilisateur. |
Name |
Requis. Une expression régulière ECMA-262 standardisée précisant le nom de fonction complet à faire correspondre. 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. Cette correspondance respecte la casse. |
Module |
Optionnel. Une expression régulière ECMA-262 standardisée précisant le chemin d'accès complet au module qui contient la fonction. Cette correspondance respecte la casse. |
Action |
Requis. Une de ces valeurs sensibles à la casse :
|
Personnaliser le comportement de pile des appels
Spécifiez des modules, des fichiers sources, et des fonctions pour être traités comme du code non-utilisateur dans les piles d'appels en les spécifiant dans les fichiers *.natjmc.
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\Visualizers.
Pour spécifier du code non-utilisateur pour un utilisateur individuel, ajoutez le fichier .natjmc au dossier %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers.
Les fichiers .natjmc sont des fichiers xml avec cette syntaxe :
<?xml version="1.0" encoding="utf-8"?>
<NonUserCode xmlns="https://schemas.microsoft.com/vstudio/debugger/jmc/2013">
<!-- 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 |
Requis. Le chemin complet du module ou des modules. Utilisez les caractères Windows génériques ? (zéro ou un caractère) et * (zéro caractères ou plus). Par exemple : <Module Name=”?:\3rdParty\UtilLibs\*” /> indique au débogueur de traiter tous les modules dans \3rdParty\UtilLibs sur tout lecteur en tant que code externe. |
Company |
Optionnel. Nom de la société qui publie le module incorporé dans le fichier exécutable. Utilisez cet attribut pour distinguer les modules. |
Attributs d'éléments de fichier
Attribut |
Description |
---|---|
Name |
Requis. Chemin d'accès complet du fichier source ou des fichiers à traiter comme du code externe. Utilisez les caractères Windows génériques ? et * lorsque vous précisez le chemin d'accès. |
Attributs d'éléments de fonction
Attribut |
Description |
---|---|
Name |
Requis. Nom qualifié complet de la fonction à traiter comme du code externe. |
Module |
Optionnel. Le nom ou le chemin d'accès complet au module qui contient la fonction. Utilisez cet attribut pour distinguer les fonctions ayant le même nom. |
ExceptionImplementation |
Lorsqu'elle a la valeur true, la pile des appels affiche la fonction fonction qui a levé l'exception plutôt que cette fonction. |
Version JavaScript de Uniquement mon code
Utilisateur et code non-utilisateur**|Comportement de progression|Comportement de point d'arrêt|Comportement d'exception|**Personnaliser Uniquement mon code
Code utilisateur et non-utilisateur
Classifications du code
Contrôle pas à pas et affichage de la pile des appels dans la version JavaScript de Uniquement mon code en classant le code dans l'une de ces catégories :
MyCode |
Le code utilisateur que vous possédez et contrôlez. |
LibraryCode |
Le code non-utilisateur des bibliothèques que vous utilisez régulièrement et sur lesquelles votre application s'appuie pour fonctionner correctement (par exemple WinJS ou jQuery). |
UnrelatedCode |
Le code non-utilisateur qui pourrait être exécuté dans votre application, mais que vous ne possédez pas et sur lequel votre application ne s'appuie pas directement pour fonctionner correctement (par exemple, un Kit de développement logiciel de publication qui affiche des publicités). Dans les projets Windows Store, tout code chargé dans votre application depuis un HTTP ou un URI HTTPS est également considérée comme du UnrelatedCode. |
Le débogueur JavaScript classe automatiquement ces types de code :
Le script exécuté en passant une chaîne de caractère à la fonction hôte fournie eval est classé comme MyCode.
Le script exécuté en passant une chaîne de caractères au constructeur Function est classé comme LibraryCode.
Le script contenu dans une référence d'infrastructure, telle que WinJS ou Azure SDK, est classé comme LibraryCode.
Le script exécuté en passant une chaîne de caractères aux fonctions setTimeout, setImmediate, ou setInterval est classé comme UnrelatedCode.
Le %VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json précise d'autres codes utilisateur et non-utilisateur pour tous les projets Visual Studio JavaScript.
Modifiez les classifications par défaut et classer des fichiers spécifiques et les URL en ajoutant un fichier .json nommé mycode.json au dossier racine d'un projet.
Tout autre code est classé comme MyCode.
Comportement de progression
Si une fonction n'est pas du code utilisateur (MyCode), Pas à pas détaillé (raccourci clavier : F11) se comporte comme Pas à pas principal (raccourci clavier : F10).
Si une étape démarre dans du code non-utilisateur (LibraryCode ou UnrelatedCode), alors l'exécution pas à pas se comporte temporairement comme si Uniquement mon code n'était pas activé. Dès que vous retournez dans le code utilisateur, Uniquement mon code est réactivé.
Lorsqu'une étape dans le code utilisateur a pour effet de quitter le contexte d'exécution actuel (par exemple en faisant une étape dans la dernière ligne d'un gestionnaire d'événements), le débogueur s'arrête à la ligne exécutée suivante du code utilisateur. Par exemple, si un rappel s'exécute dans le code LibraryCode le débogueur continue jusqu'à ce que la prochaine ligne de code utilisateur s'exécute.
Pas à pas sortant (Clavier : Maj + le F11) s'arrête sur la prochaine ligne de code utilisateur. Si aucun code utilisateur n'est rencontré alors l'exécution se poursuit jusqu'à ce que l'application s'arrête, qu'un point d'arrêt soit atteint, ou qu'une exception se produise.
Comportement de point d'arrêt
Les points d'arrêt définis dans tout code seront toujours atteints indépendamment de la classification de ce code
Si le mot clé debugger est rencontré dans :
le code LibraryCode, le débogueur s'arrête toujours.
le code UnrelatedCode, le débogueur ne s'arrête pas.
Comportement d'exception
Si une exception non gérée se produit dans :
MyCode ou le LibraryCode, le débogueur s'arrête toujours.
le code UnrelatedCode, et le code MyCode ou LibraryCode se trouve sur la pile des appels, le débogueur s'arrête.
Si les premières exceptions sont activées pour l'exception dans la boîte de dialogue Exceptions, et que celle-ci est renvoyée dans du code LibraryCode ou UnrelatedCode :
Si l'exception est gérée, le débogueur ne s'arrête pas.
Si l'exception n'est pas gérée, le débogueur arrête.
Personnaliser Uniquement mon code
Pour classer le code utilisateur et non-utilisateur pour un projet Visual Studio unique, ajoutez un fichier .json nommé mycode.json au dossier racine du projet.
Les classifications sont réalisées dans l'ordre suivant :
Classifications par défaut
Classifications dans le fichier %VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json
Classifications dans le fichier mycode. json du projet actuel.
Chaque étape de classification écrase les étapes précédentes. Un fichier .json n'a pas besoin de répertorier toutes les paires de valeur clé, MyCode, Bibliothèques, et les valeurs Non lié peuvent être des tableaux vides.
Mes fichiers de code .json utilisent cette syntaxe :
{
"Eval" : "Classification",
"Function" : "Classification",
"ScriptBlock" : "Classification",
"MyCode" : [
"UrlOrFileSpec”,
. . .
"UrlOrFileSpec”
],
"Libraries" : [
"UrlOrFileSpec”,
. .
"UrlOrFileSpec”
],
"Unrelated" : [
"UrlOrFileSpec”,
. . .
"UrlOrFileSpec”
]
}
Éval, fonction, et ScriptBlock
Éval, Fonction, et les paires de valeur clé ScriptBlock déterminent comment le code généré dynamiquement est classifié.
Éval |
Le script exécuté en passant une chaîne de caractère à la fonction hôte fournie eval. Par défaut, le script Eval est classée en tant que MyCode. |
Fonction |
Script exécuté en passant une chaîne de caractères au constructeur Function. Par défaut, le script de fonction est classé comme LibraryCode. |
ScriptBlock |
Script exécuté en passant une chaîne de caractères à setTimeout, setImmediate, ou des fonctions setInterval. Par défaut, le script de ScriptBlock est classé comme UnrelatedCode. |
Vous pouvez changez la valeur de l'un de ces mots clés :
MyCode classe le script en tant que MyCode.
Library classe le script en tant que LibraryCode.
Unrelated classe le script en tant que UnrelatedCode.
MyCode, bibliothèques, et non lié
MyCode, Bibliothèques, et les paires de valeur de clé Non lié spécifient les URL ou les fichiers à inclure dans une classification :
Mon code |
Tableau d'URL ou fichiers qui sont classés comme MyCode. |
Bibliothèques |
Tableau d'URL ou de fichiers qui sont classés comme LibraryCode. |
Non lié |
Tableau d'URL ou de fichiers qui sont classés comme Code non lié. |
La chaîne de caractères de l'url ou du fichier peut contenir un ou plusieurs caractères *, qui correspondent à zéro ou plusieurs caractères. * est l'équivalent de l'expression régulière .*.