Freigeben über


Nur Benutzercode mit "Just My Code" debuggen

Just My Code ist ein Visual Studio-Debugfeature, das automatisch Aufrufe von System-, Framework- und anderen Nicht-Benutzercode überspringt. Im Fenster Aufrufliste werden diese Aufrufe mit „Nur eigenen Code“ in Frames vom Typ [Externer Code] reduziert.

Just My Code funktioniert in .NET- und C++-Projekten unterschiedlich.

Nur mein Code aktivieren oder deaktivieren

Für die meisten Programmiersprachen ist "Just My Code" standardmäßig aktiviert.

  • Um „Nur eigenen Code“ in Visual Studio zu aktivieren bzw. zu deaktivieren, aktivieren bzw. deaktivieren Sie unter Extras>Optionen (oder Debuggen>Optionen) > >Debugging>Allgemein die Option Nur meinen Code aktivieren.

Screenshot von

Screenshot von

Anmerkung

"Nur mein Code aktivieren" ist eine globale Einstellung, die für alle Visual Studio-Projekte in allen Sprachen gilt.

Nur eigenen Code (Debugging)

Während einer Debugsitzung zeigt das Module- Fenster an, welche Codemodule der Debugger als "Mein Code" (Benutzercode) und dessen Symbolladestatus behandelt. Weitere Informationen finden Sie unter Machen Sie sich damit vertraut, wie sich der Debugger an Ihre Appanfügt.

Screenshot des Benutzercodes im Modulfenster.

Screenshot des Benutzercodes im Modulfenster.

Im Fenster Aufrufliste oder Tasks wird IDE-generierter Code durch „Nur eigenen Code“ in einen grauen, kommentierten Codeframe mit der Bezeichnung [External Code] reduziert.

Screenshot: Externer Code im Fenster „Aufrufliste“.

Screenshot: Externer Code im Fenster „Aufrufliste“.

Tipp

Um die Module, Call Stack, Tasksoder die meisten anderen Debugfenster zu öffnen, müssen Sie sich in einer Debugsitzung befinden. Wählen Sie beim Debuggen unter Debuggen>Windowsdie Fenster aus, die Sie öffnen möchten.

Wenn Sie den Code in einem reduzierten [externen Code] Rahmen anzeigen möchten, klicken Sie mit der rechten Maustaste im Call Stack-Fenster oder im Aufgabenfenster, und wählen Sie im Kontextmenü Externen Code anzeigen aus. Die erweiterten externen Codezeilen ersetzen den [Externer Code] Frame.

Screenshot: „Externen Code anzeigen“ im Fenster „Aufrufliste“.

de-DE: Screenshot: „Externen Code anzeigen“ im Fenster „Aufrufliste“.

Anmerkung

Externer Code anzeigen ist eine aktuelle Benutzerprofilereinstellung, die für alle Projekte in allen Sprachen gilt, die vom Benutzer geöffnet werden.

Durch Doppelklicken auf eine erweiterte externe Codezeile im Fenster Aufrufliste wird die aufrufende Codezeile im Quellcode in Grün hervorgehoben. Bei DLLs oder anderen Modulen, die nicht gefunden oder geladen wurden, kann sich eine Seite namens „Symbol oder Quelle nicht gefunden“ öffnen.

Ab Visual Studio 2022, Version 17.7, können Sie .NET-Code automatisch dekompilieren, indem Sie im Aufrufstapelfenster auf externen Code doppelklicken. Weitere Informationen finden Sie unter Generieren von Quellcode aus .NET-Assemblys beim Debuggen.

.NET Just My Code

In .NET-Projekten verwendet Just My Code Symboldateien (.pdb) und Programmoptimierungen zum Klassifizieren von Benutzer- und Nicht-Benutzercode. Der .NET-Debugger berücksichtigt optimierte Binärdateien und nicht geladene .pdb- Dateien als Nichtbenutzercode.

Drei Compilerattribute wirken sich auch darauf aus, was der .NET-Debugger als Benutzercode betrachtet:

Der .NET-Debugger betrachtet den gesamten anderen Code als Benutzercode.

Während des .NET-Debuggings:

  • Debuggen>Einzelschritt (oder F11) in IDE-generierten Code überspringt den Code bis zur nächsten Zeile des Benutzercodes.
  • Debuggen>Rücksprung (oder UMSCHALT+F11) in IDE-generierten Code springt zurück zur nächsten Zeile des Benutzercodes.

Wenn kein Benutzercode mehr vorhanden ist, wird das Debuggen fortgesetzt, bis er endet, auf einen anderen Haltepunkt trifft oder einen Fehler auslöst.

Wenn der Debugger IDE-generierten Code unterbricht (z. B. wenn Sie Debuggen>Alle unterbrechen verwenden und IDE-generierten Code anhalten), wird das Fenster Keine Quelle angezeigt. Anschließend können Sie einen befehl Debuggen>Schritt verwenden, um zur nächsten Zeile des Benutzercodes zu wechseln.

Wenn eine unbehandelte Ausnahme im Nichtbenutzercode auftritt, wird der Debugger an der Codezeile des Benutzers unterbrochen, in der die Ausnahme generiert wurde.

Wenn Ausnahmen (erste Chance) für die Ausnahme aktiviert sind, wird die aufrufende Benutzercodezeile im Quellcode grün hervorgehoben. Im Fenster Aufrufliste wird ein mit Anmerkungen versehener Frame mit der Bezeichnung [Externer Code] angezeigt.

C++ nur mein Code

Ab Visual Studio 2017, Version 15.8, wird „Nur eigenen Code“ für die Codeausführung unterstützt. Dieses Feature erfordert auch die Verwendung des /JMC (Nur-mein-Code-Debugging) Compiler-Schalters. Der Schalter ist in C++-Projekten standardmäßig aktiviert. Für das Fenster Aufrufliste und die Aufruflistenunterstützung in „Nur eigenen Code“ ist der Parameter „/JMC“ nicht erforderlich.

Um als Benutzercode klassifiziert zu werden, muss der PDB für die Binärdatei, die den Benutzercode enthält, vom Debugger geladen werden (verwenden Sie das fenster Module, um den Ladestatus zu überprüfen).

Für das Verhalten von Aufruflisten, wie z. B. im Fenster Aufrufliste, betrachtet „Nur eigenen Code“ in C++ nur diese Funktionen als IDE-generierten Code:

  • Funktionen mit entfernten Quellinformationen in der Symboldatei.
  • Funktionen, bei denen die Symboldateien angeben, dass keine Quelldatei für den Stapelframe vorhanden ist.
  • Funktionen, die in NATJMC-Dateien im Ordner %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers angegeben werden.

Für das Verhalten bei der Codeausführung betrachtet „Nur eigenen Code“ in C++ nur diese Funktionen als IDE-generierten Code:

  • Funktionen, für die die entsprechende PDB-Datei nicht im Debugger geladen wurde.
  • Funktionen, die in NATJMC-Dateien im Ordner %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers angegeben werden.

Anmerkung

Für die Codeschrittunterstützung in Just My Code muss C++-Code mit den MSVC-Compilern in Visual Studio 15.8 Preview 3 oder höher kompiliert werden, und der /JMC-Compilerswitch muss aktiviert sein (standardmäßig aktiviert). Weitere Informationen finden Sie unter Anpassen des C++-Aufrufstapels und des Codeschrittverhaltens und diesem Blogbeitrag. Für Code, der mit einem älteren Compiler kompiliert wird, sind .natstepfilter- Dateien die einzige Möglichkeit zum Anpassen des Codeschritts, der unabhängig von Just My Code ist. Weitere Informationen finden Sie unter Anpassen des C++-Schrittverhaltens.

Während des C++-Debuggings wird Nichtbenutzercode standardmäßig übersprungen. Während des C++-Debuggings:

  • Bei Debuggen>Einzelschritt (oder F11) in IDE-generiertem Code wird der Code bis zur nächsten Zeile des Benutzercodes übersprungen, wenn Einzelschritt in IDE-generiertem Code aufgerufen wird.
  • Debuggen>Rücksprung (oder UMSCHALT+F11) in IDE-generiertem Code wird bis zur nächsten Zeile des Benutzercodes (außerhalb des aktuellen Stapelrahmens) ausgeführt.

Wenn kein Benutzercode mehr vorhanden ist, wird das Debuggen fortgesetzt, bis er endet, auf einen anderen Haltepunkt trifft oder einen Fehler auslöst.

Wenn der Debugger den IDE-generierten Code unterbricht (zum Beispiel, wenn Sie Debuggen>Alle unterbrechen verwenden und IDE-generierten Code anhalten), wird die Schritt-für-Schritt-Ausführung im IDE-generierten Code weitergeführt.

Wenn der Debugger auf eine Ausnahme trifft, hält er an der Ausnahme an, unabhängig davon, ob sich der Code im Benutzer- oder Nicht-Benutzercode befindet. Benutzerdefinierte, nicht behandelte Optionen im Dialogfeld Ausnahmeeinstellungen werden ignoriert.

Anpassen des C++-Aufrufstapels und des Codeschrittverhaltens

Für C++-Projekte können Sie die Module, Quelldateien und Funktionen des Aufrufstapel- Fensters als Nicht-Benutzercode behandeln, indem Sie sie in *.natjmc Dateien angeben. Diese Anpassung gilt auch für Codeschritte, wenn Sie den neuesten Compiler verwenden (siehe C++ Just My Code).

  • Um Nichtbenutzercode für alle Benutzer des Visual Studio-Computers anzugeben, fügen Sie die NATJMC- Datei zur %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers Ordner hinzu.
  • Um Nichtbenutzercode für einen einzelnen Benutzer anzugeben, fügen Sie die NATJMC- Datei zur %USERPROFILE%\My Documents\<Visual Studio-Version>\Visualizers Ordner hinzu.

Eine NATJMC--Datei ist eine XML-Datei mit dieser Syntax:

<?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>

Modulelementattribute

Attribut Beschreibung
Name Erforderlich. Der vollständige Pfad des Moduls oder der Module. Sie können die Windows-Wildcardzeichen ? (Null oder ein Zeichen) und * (null oder mehr Zeichen) verwenden. Zum Beispiel

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

weist den Debugger an, alle Module in \3rdParty\UtilLibs auf jedem Laufwerk als externer Code zu behandeln.
Company Wahlfrei. Der Name des Unternehmens, das das Modul veröffentlicht, das in die ausführbare Datei eingebettet ist. Sie können dieses Attribut verwenden, um die Module zu disambiguieren.

Dateielementattribute

Attribut Beschreibung
Name Erforderlich. Der vollständige Pfad der Quelldatei oder -dateien, die als externer Code behandelt werden sollen. Sie können beim Angeben des Pfads die Windows-Wildcardzeichen ? und * verwenden.

Funktionselementattribute

Attribut Beschreibung
Name Erforderlich. Der vollqualifizierte Name der Funktion, die als externer Code behandelt werden soll. ou kann beim Angeben des Pfads die Windows-Wildcardzeichen ? und * verwenden.
Module Wahlfrei. Der Name oder der vollständige Pfad zu dem Modul, das die Funktion enthält. Sie können dieses Attribut verwenden, um Funktionen mit demselben Namen eindeutig zu machen.
ExceptionImplementation Bei Festlegung auf truezeigt der Aufrufstapel die Funktion an, die die Ausnahme anstelle dieser Funktion ausgelöst hat.

Anpassen des C++-Schrittverhaltens unabhängig von den Just My Code-Einstellungen

In C++-Projekten können Sie Prozedurschrittfunktionen angeben, indem Sie sie als NoStepInto-Funktionen in NATSTEPFILTER-Dateien auflisten. Die in NATSTEPFILTER-Dateien aufgeführten Funktionen sind nicht von Einstellungen für „Nur eigenen Code“ abhängig. Eine NoStepInto-Funktion weist den Debugger an, die Funktion zu überspringen, selbst wenn er einige StepInto-Funktionen oder anderen Benutzercode aufruft. Im Gegensatz zu funktionen, die in .natjmcaufgeführt sind, tritt der Debugger in die erste Zeile des Benutzercodes innerhalb der NoStepInto-Funktion ein.

  • Um Nichtbenutzercode für alle lokalen Visual Studio-Benutzer anzugeben, fügen Sie den .natstepfilter Datei zur %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers Ordner hinzu.
  • Um Nichtbenutzercode für einen einzelnen Benutzer anzugeben, fügen Sie die .natstepfilter Datei zum %USERPROFILE%\My Documents\<Visual Studio-Version>\Visualizers Ordner hinzu.

Anmerkung

Einige Drittanbietererweiterungen können möglicherweise die .natstepfilter-Funktionalität deaktivieren.

Ein .natstepfilter Datei ist eine XML-Datei mit dieser Syntax:

<?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>

Element Beschreibung
Function Erforderlich. Gibt eine oder mehrere Funktionen als Nichtbenutzerfunktionen an.
Name Erforderlich. Ein ECMA-262-formatierter regulärer Ausdruck, der den vollständigen Funktionsnamen angibt, der übereinstimmen muss. Zum Beispiel:

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

weist den Debugger an, dass alle Methoden in MyNS::MyClass als Nichtbenutzercode betrachtet werden sollen. Bei der Übereinstimmung muss die Groß-/Kleinschreibung beachtet werden.
Module Wahlfrei. Ein ecMA-262 formatierter regulärer Ausdruck, der den vollständigen Pfad zu dem Modul angibt, das die Funktion enthält. Die Groß- und Kleinschreibung wird bei der Übereinstimmung nicht berücksichtigt.
Action Erforderlich. Einer der Werte, bei denen die Groß-/Kleinschreibung beachtet werden muss:

NoStepInto – weist den Debugger an, die Funktion zu überspringen.
StepInto – weist den Debugger an, die Funktion Schritt für Schritt auszuführen, wobei alle anderen NoStepInto für die übereinstimmende Funktion überschrieben werden.

Weitere Informationen zu .natstepfilter-- und NATJMC--Dateien

  • Ab Version Visual Studio 2022 17.6 können Sie .natjmc und .natstepfilter-Dateien direkt zur Lösung oder zum Projekt hinzufügen.

  • Syntaxfehler in .natstepfilter und .natjmc- Dateien werden nicht im Ausgabefenster des Debuggers gemeldet.

  • Im Gegensatz zu .natvis--Dateien werden .natstepfilter-- und .natjmc--Dateien nicht dynamisch neu geladen. Stattdessen werden diese Dateien am Anfang der Debugsitzung neu geladen.

  • Bei Vorlagenfunktionen kann die Verwendung von &lt;.*&gt; oder &lt;.* im Namen hilfreich sein.

JavaScript nur mein Code

Für .esproj--Projekte in Visual Studio 2022 verwendet Visual Studio Code eine launch.json Datei zum Konfigurieren und Anpassen des Debuggers. launch.json ist eine Debuggerkonfigurationsdatei.

Visual Studio fügt den Debugger nur an Benutzercode an. Für .esproj--Projekte können Sie Benutzercode konfigurieren (d. h. Einstellungen für Just My Code) in Visual Studio mithilfe der Einstellung skipFiles in launch.json. Diese Einstellung funktioniert genauso wie die launch.json Einstellungen in VS Code. Weitere Informationen zu skipFiles finden Sie unter Überspringen von uninteressantem Code.