Nur mein Code

Entwickler, die .NET Framework-Sprachen verwenden, sind mit der Debuggerfunktion "Nur eigenen Code" vertraut, die System-, Framework- und andere Nichtbenutzeraufrufe überspringt und diese Aufrufe in den Aufruflistenfenstern reduziert. In Visual Studio 2013 wurde "Nur eigenen Code" auf die C++- und JavaScript-Sprachen erweitert. In diesem Thema werden die Einzelheiten der Verwendung von "Nur eigenen Code" in .NET Framework-, in systemeigenen C++- und in JavaScript-Projekten beschrieben.

Inhalt

Aktivieren oder Deaktivieren von "Nur eigenen Code"

"Nur eigenen Code" in .NET Framework

"Nur eigenen Code" in C++

"Nur eigenen Code" in JavaScript

Aktivieren oder Deaktivieren von "Nur eigenen Code"

Zum Aktivieren oder Deaktivieren von "Nur eigenen Code" wählen Sie im Menü Optionen und Einstellungen die Option Debuggen aus. Aktivieren oder deaktivieren Sie im Knoten Debugging/Allgemein das Kontrollkästchen Nur meinen Code aktivieren.

Option zum Aktivieren nur des eigenen Codes im Dialogfeld "Optionen"

Hinweis

Die Einstellung Nur meinen Code aktivieren ist eine globale Einstellung, die auf alle Visual Studio-Projekte in allen Sprachen angewendet wird.

Überschreiben der Aufruflistenfilterung

In den Aufruflistenanzeigen wie den Fenstern "Aufrufliste" und "Aufgaben" reduziert "Nur eigenen Code" den Nichtbenutzercode in einen mit Anmerkungen versehenen Frame mit der Bezeichnung [External Code]. Um die reduzierten Frames anzuzeigen, wählen Sie im Kontextmenü der Aufruflistenanzeige Externen Code anzeigen aus.

Hinweis

Die Einstellung Externen Code anzeigen wird im Profiler des aktuellen Benutzers gespeichert.Sie wird auf alle Projekte in allen Sprachen angewendet, die von dem Benutzer geöffnet werden.

"Nur eigenen Code" in .NET Framework

Benutzer- und Nichtbenutzercode**|Schrittverhalten|Haltepunktverhalten|**Ausnahmeverhalten

Benutzer- und Nichtbenutzercode

Die Option "Nur eigenen Code" untersucht offene Projekte, Symboldateien (PDB-Dateien) und Programmoptimierungen, um Benutzercode von Nichtbenutzercode zu unterscheiden.

  1. Wenn eine Binärdatei aus einem geöffneten Visual Studio-Projekt erstellt wurde, wird sie immer als Benutzercode angesehen.

  2. Der Debugger behandelt Code als Nichtbenutzercode, wenn die Binärdatei optimiert oder die PDB-Datei nicht verfügbar ist.

Drei Attribute beeinflussen außerdem, was der Debugger als eigenen Code ansieht:

Der übrige Code wird als Benutzercode angesehen.

Schrittverhalten

Wenn Sie Einzelschritt (Tastenkombination: F11) auf Nichtbenutzercode anwenden, überspringt der Debugger den Code bis zur nächsten Benutzeranweisung. Wenn Sie Ausführen bis Rücksprung (Tastenkombination: UMSCHALT+F11) verwenden, wird der Debugger bis zur nächsten Zeile des Benutzercodes ausgeführt. Wenn kein Benutzercode gefunden wird, läuft die Ausführung weiter, bis die App beendet wird, ein Haltepunkt erreicht wird oder eine Ausnahme auftritt.

Haltepunktverhalten

Wenn "Nur eigenen Code" aktiviert ist, können Sie Alle unterbrechen (Tastenkombination: STRG+Alt+UNTBR) auswählen und die Ausführung an einer Stelle anhalten, an der kein Benutzercode vorhanden ist. Wenn dies geschieht, wird das Fenster "Kein Quellcode" angezeigt. Wenn Sie anschließend einen Schrittbefehl auswählen, wechselt der Debugger zur nächsten Zeile von Benutzercode.

Ausnahmeverhalten

Wenn ein Ausnahmefehler im Nichtbenutzercode auftritt, unterbricht der Debugger an der Zeile im Benutzercode, in der die Ausnahme generiert wurde.

Wenn Ausnahmen (erste Chance) für die Ausnahme aktiviert sind, wird die Benutzercodezeile grün hervorgehoben. Die Aufrufliste zeigt einen mit Anmerkungen versehenen Frame mit der Bezeichnung [Externer Code] an.

"Nur eigenen Code" in C++

Benutzer- und Nichtbenutzercode**|Schrittverhalten|Ausnahmeverhalten|Anpassen des Einzelschrittverhaltens|**Anpassen des Aufruflistenverhaltens

Benutzer- und Nichtbenutzercode

"Nur eigenen Code" in C++ ist anders als "Nur eigenen Code" in .NET Framework und JavaScript, da das Schrittverhalten vom Aufruflistenverhalten unabhängig ist.

Aufruflisten

Standardmäßig behandelt der Debugger diese Funktionen als Nichtbenutzercode in Aufruflistenfenstern:

  • Funktionen mit entfernten Quellinformationen in ihrer Symboldatei.

  • Funktionen, bei denen die Symboldateien angeben, dass keine Quelldatei vorhanden ist, die dem Stapelrahmen entspricht.

  • Funktionen, die in *.natjmc-Dateien im Ordner %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers angegeben werden.

Schrittweises Ausführen

Standardmäßig gelten nur Funktionen, die in *.natstepfilter-Dateien im Ordner %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers angegeben werden, als Nichtbenutzercode.

Sie können Ihre eigenen .natstepfilter und .natjmc erstellen, um das Schrittverhalten und das Verhalten der Aufruflistenfenster in %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers anzupassen.

Schrittverhalten

Wenn Sie Einzelschritt (Tastenkombination: F11-) für Nichtbenutzercode aus Benutzercode verwenden, überspringt der Debugger den Code bis zur nächsten Benutzercodezeile. Wenn Sie Ausführen bis Rücksprung (Tastenkombination: UMSCHALT+F11) verwenden, wird der Debugger bis zur nächsten Zeile des Benutzercodes ausgeführt. Wenn kein Benutzercode gefunden wird, läuft die Ausführung weiter, bis die App beendet wird, ein Haltepunkt erreicht wird oder eine Ausnahme auftritt.

Wenn der Debugger beim Nichtbenutzercode unterbricht (zum Beispiel, wenn ein Befehl "Alle unterbrechen" in Nichtbenutzercode anhält), wird die schrittweise Ausführung im Nichtbenutzercode weitergeführt.

Ausnahmeverhalten

Wenn der Debugger auf eine Ausnahme trifft, hält er bei der Ausnahme an, unabhängig davon, ob sie im Benutzer- oder Nichtbenutzercode auftritt. Die Optionen Vom Benutzercode unbehandelt im Dialogfeld Ausnahmen werden ignoriert.

Anpassen des Schrittverhaltens

Sie können Funktionen angeben, die zu überspringen sind, indem Sie sie als Nichtbenutzercode in *.natstepfilter-Dateien auflisten.

  • Um Nichtbenutzercode für alle Benutzer des Visual Studio-Computers anzugeben, fügen Sie dem Ordner %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers die NATSTEPFILTER-Datei hinzu.

  • Um Nichtbenutzercode für einen einzelnen Benutzer anzugeben, fügen Sie dem Ordner %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers die NATSTEPFILTER-Datei hinzu.

NATSTEPFILTER-Dateien sind XML-Dateien mit folgender Syntax:

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

Element

Beschreibung

Funktion

Erforderlich. Gibt eine oder mehreren Funktionen als Nichtbenutzerfunktionen an.

Name

Erforderlich. Ein ECMA-262-formatierter regulärer Ausdruck, der den vollständigen Funktionsnamen angibt, der übereinstimmen muss. Beispiel:

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

teilt dem Debugger mit, dass alle Methoden in MyNS::MyClass als Nichtbenutzercode behandelt werden sollen. Bei der Übereinstimmung muss die Groß-/Kleinschreibung beachtet werden.

Module

Optional. 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 dieser Werte, bei denen die Groß-/Kleinschreibung beachtet werden muss.

  • NoStepInto – weist den Debugger an, die übereinstimmende Funktion zu überspringen.

  • StepInto – weist den Debugger an, die übereinstimmenden Funktionen schrittweise auszuführen, wobei alle anderen NoStepInto für die übereinstimmenden Funktionen überschrieben werden.

Anpassen des Aufruflistenverhaltens

Sie können Module, Quelldateien und Funktionen angeben, die als Nichtbenutzercode in Aufruflisten behandelt werden, indem sie in *.natjmc-Dateien angegeben werden.

  • Um Nichtbenutzercode für alle Benutzer des Visual Studio-Computers anzugeben, fügen Sie dem Ordner %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers die NATJMC-Datei hinzu.

  • Um Nichtbenutzercode für einen einzelnen Benutzer anzugeben, fügen Sie dem Ordner %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers die NATJMC-Datei hinzu.

NATJMC-Dateien sind XML-Dateien mit folgender Syntax:

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

Modulelementattribute

Attribut

Beschreibung

Name

Erforderlich. Der vollständige Pfad des Moduls oder der Module. Sie können die Windows-Platzhalterzeichen ? (null oder ein Zeichen) und * (null oder mehr Zeichen) verwenden. Beispiel:

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

weist den Debugger an, alle Module in \3rdParty\UtilLibs auf einem Laufwerk als externen Code zu behandeln.

Company

Optional. 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 unterscheiden.

Dateielementattribute

Attribut

Beschreibung

Name

Erforderlich. Der vollständige Pfad der Quelldatei oder -dateien, die als externer Code behandelt werden sollen. Sie können die Windows-Platzhalterzeichen ? und * verwenden, wenn Sie den Pfad angeben.

Funktionselementattribute

Attribut

Beschreibung

Name

Erforderlich. Der vollqualifizierte Name der Funktion, die als externer Code behandelt werden soll.

Module

Optional. 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 zu unterscheiden.

ExceptionImplementation

Wenn sie auf true festgelegt ist, zeigt die Aufrufliste die Funktion an, die die Ausnahme ausgelöst hat, und nicht diese Funktion.

"Nur eigenen Code" in JavaScript

Benutzer- und Nichtbenutzecode**|Schrittverhalten|Haltepunktverhalten|Ausnahmeverhalten|**Anpassen von "Nur eigenen Code"

Benutzer- und Nichtbenutzercode

Codeklassifizierungen

"Nur eigenen Code" in JavaScript steuert die schrittweise Ausführung und die Aufruflistenanzeige durch Kategorisieren von Code in einer dieser Klassifizierungen:

MyCode

Benutzercode, den Sie besitzen und steuern.

LibraryCode

Nichtbenutzercode aus Bibliotheken, den Sie regelmäßig verwenden und die für das ordnungsgemäße Funktionieren Ihrer Anwendung erforderlich sind (z. B. WinJS oder jQuery).

UnrelatedCode

Nichtbenutzercode, der in Ihrer Anwendung ausgeführt werden könnte, den Sie jedoch nicht besitzen und der für das ordnungsgemäße Funktionieren Ihrer Anwendung nicht direkt erforderlich ist (z. B. ein Werbungs-SDK, das Anzeigen anzeigt). In Windows Store-Projekten gilt jeder Code, der von einem HTTP- oder HTTPS-URI in Ihre App geladen wird, als UnrelatedCode.

Der JavaScript-Debugger klassifiziert automatisch diese Codetypen:

  • Skript, das ausgeführt wird, indem eine Zeichenfolge an die vom Host bereitgestellte eval-Funktion übergeben wird, wird als MyCode klassifiziert.

  • Skript, das ausgeführt wird, indem eine Zeichenfolge an den Function-Konstruktor übergeben wird, wird als LibraryCode klassifiziert.

  • Skript, das in einem Frameworkverweis, wie etwa WinJS oder dem Azure-SDK, enthalten ist, wird als LibraryCode klassifiziert.

  • Skript, das ausgeführt wird, indem eine Zeichenfolge an die Funktionen setTimeout, setImmediate oder setInterval übergeben wird, wird als UnrelatedCode klassifiziert.

  • %VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json gibt anderen Benutzer- und Nichtbenutzercode für alle Visual Studio JavaScript-Projekte an.

Sie können die Standardklassifizierungen ändern und bestimmte Dateien und URLs klassifizieren, indem Sie dem Stammordner eines Projekts eine JSON-Datei mit dem Namen mycode.json hinzufügen.

Der restliche Code wird als MyCode klassifiziert.

Schrittverhalten

  • Wenn eine Funktion nicht Benutzercode (MyCode) ist, verhält sich Einzelschritt (Tastenkombination: F11) wie Prozedurschritt (Tastenkombination: F10).

  • Wenn ein Schritt im Nichtbenutzercode (LibraryCode oder UnrelatedCode) beginnt, dann verhält sich die schrittweise Ausführung kurzfristig so, als wäre "Nur eigenen Code" nicht aktiviert. Sobald Sie zurück zum Benutzercode wechseln, wird die schrittweise Ausführung für "Nur eigenen Code" erneut aktiviert.

  • Wenn ein Schritt im Benutzercode dazu führt, dass der aktuelle Ausführungskontext (wie etwa das Durchführen eines Schritts in der letzten Zeile eines Ereignishandlers) verlassen wird, hält der Debugger bei der nächsten ausgeführten Benutzercodezeile an. Wenn beispielsweise ein Rückruf in LibraryCode-Code ausgeführt wird, fährt der Debugger fort, bis die nächste Zeile des Benutzercodes ausgeführt wird.

  • Ausführen bis Rücksprung (Tastenkombination: UMSCHALT+F11) hält in der nächsten Zeile des Benutzercodes an. Wenn kein Benutzercode gefunden wird, läuft die Ausführung weiter, bis die App beendet wird, ein Haltepunkt erreicht wird oder eine Ausnahme auftritt.

Haltepunktverhalten

  • Haltepunkte, die im Code festgelegt wurden, werden immer erreicht, unabhängig von der Klassifizierung dieses Codes.

  • Wenn das debugger-Schlüsselwort gefunden wird in:

    • LibraryCode-Code, unterbricht der Debugger immer.

    • UnrelatedCode-Code, beendet der Debugger die Aktion nicht.

Ausnahmeverhalten

Wenn ein Ausnahmefehler auftritt in:

  • MyCode- oder LibraryCode-Code, unterbricht der Debugger immer.

  • UnrelatedCode-Code, und MyCode- oder LibraryCode-Code sich in der Aufrufliste befindet, unterbricht der Debugger.

Wenn Ausnahmen (erste Chance) für die Ausnahme im Dialogfeld "Ausnahmen" aktiviert sind und die Ausnahme in LibraryCode- oder UnrelatedCode-Code ausgelöst wird:

  • Wenn die Ausnahme behandelt wird, unterbricht der Debugger nicht.

  • Wenn die Ausnahme nicht behandelt wird, unterbricht der Debugger.

Anpassen von "Nur eigenen Code"

Um Benutzer- und Nichtbenutzercode für ein einzelnes Visual Studio-Projekt zu kategorisieren, fügen Sie dem Stammordner des Projekts eine JSON-Datei mit dem Namen mycode.json hinzu.

Klassifizierungen werden in dieser Reihenfolge ausgeführt:

  1. Standardklassifizierungen

  2. Klassifizierungen in der Datei %VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json

  3. Klassifizierungen in der Datei mycode. json des aktuellen Projekts

Jeder Klassifizierungsschritt überschreibt die vorherigen Schritte. Eine JSON-Datei muss nicht alle Schlüsselwertpaare auflisten, und die Werte MyCode, Libraries und Unrelated können leere Arrays sein.

JSON-Dateien für eigenen Code verwenden folgende Syntax:

{
    "Eval" : "Classification",
    "Function" : "Classification",
    "ScriptBlock" : "Classification",
    "MyCode" : [
        "UrlOrFileSpec”,
        . . .
        "UrlOrFileSpec”
    ],
    "Libraries" : [
        "UrlOrFileSpec”,
        . .
        "UrlOrFileSpec”
    ],
    "Unrelated" : [
        "UrlOrFileSpec”,
        . . .
        "UrlOrFileSpec”
    ]
}

Eval, Function und ScriptBlock

Die Schlüsselwertpaare Eval, Function und ScriptBlock bestimmen, wie dynamisch erzeugter Code klassifiziert wird.

Eval

Skript, das ausgeführt wird, indem eine Zeichenfolge an die vom Host bereitgestellte eval-Funktion übergeben wird. Standardmäßig wird ein Eval-Skript als MyCode klassifiziert.

Funktion

Skript, das ausgeführt wird, indem eine Zeichenfolge an den Function-Konstruktor übergeben wird. Standardmäßig wird ein Function-Skript als LibraryCode klassifiziert.

ScriptBlock

Skript, das ausgeführt wird, indem eine Zeichenfolge an die Funktionen setTimeout, setImmediate oder setInterval übergeben wird. Standardmäßig wird ein ScriptBlock-Skript als UnrelatedCode klassifiziert.

Sie können den Wert auf eines dieser Schlüsselwörter ändern:

  • MyCode klassifiziert das Skript als MyCode.

  • Library klassifiziert das Skript als LibraryCode.

  • Unrelated klassifiziert das Skript als UnrelatedCode.

MyCode, Libraries und Unrelated

Die Schlüsselwertpaare MyCode, Libraries und Unrelated geben die URLs oder Dateien an, die Sie in eine Klassifikation einschließen möchten:

MyCode

Ein Array von URLs oder Dateien, die als MyCode klassifiziert werden.

Bibliotheken

Ein Array von URLs oder Dateien, die als LibraryCode klassifiziert werden.

Unrelated

Ein Array von URLs oder Dateien, die als UnrelatedCode klassifiziert werden.

Die URL-Zeichenfolge oder Dateizeichenfolge kann eine oder mehrere *-Zeichen enthalten, die mit null oder mehr Zeichen übereinstimmen. * entspricht dem regulären Ausdruck .*.