Condividi tramite


Eseguire il debug solo del codice utente con Just My Code

Just My Code è una funzionalità di debug di Visual Studio che esegue automaticamente passaggi sulle chiamate a sistema, framework e altro codice non utente. Nella finestra Stack di chiamate Just My Code comprime queste chiamate in frame [Codice esterno].

Just My Code funziona in modo diverso nei progetti .NET e C++.

Abilitare o disabilitare Just My Code

Per la maggior parte dei linguaggi di programmazione, Just My Code è abilitato per impostazione predefinita.

  • Per abilitare o disabilitare Just My Code in Visual Studio, in Strumenti>Opzioni (o Opzioni di debug>)> Debug>generale selezionare o deselezionare Abilita Just My Code.

Screenshot di Enable Just My Code nella finestra di dialogo Opzioni.

Screenshot di Enable Just My Code nella finestra di dialogo Opzioni.

Nota

Abilita Just My Code è un'impostazione globale che si applica a tutti i progetti di Visual Studio in tutti i linguaggi.

debug Just My Code

Durante una sessione di debug, nella finestra Moduli vengono visualizzati i moduli di codice che il debugger considera come Codice personale (codice utente), insieme al relativo stato di caricamento dei simboli. Per altre informazioni, vedere Acquisire familiarità con il modo in cui il debugger si collega all'app.

Screenshot del codice utente nella finestra Moduli.

Screenshot del codice utente nella finestra Moduli.

Nella finestra Stack di chiamate o attività Just My Code comprime il codice non utente in una cornice di codice con annotazioni disattivate con [External Code]etichetta .

Screenshot del codice esterno nella finestra Stack di chiamate.

Screenshot del codice esterno nella finestra Stack di chiamate.

Suggerimento

Per aprire moduli, stack di chiamate, attività o la maggior parte delle altre finestre di debug, è necessario trovarsi in una sessione di debug. Durante il debug, in Debug>Windows selezionare le finestre da aprire.

Per visualizzare il codice in un frame [Codice esterno] compresso, fare clic con il pulsante destro del mouse nella finestra Stack di chiamate o attività e scegliere Mostra codice esterno dal menu di scelta rapida. Le righe di codice esterne espanse sostituiscono il frame [Codice esterno].

Screenshot di Mostra codice esterno nella finestra Stack di chiamate.

Screenshot di Mostra codice esterno nella finestra Stack di chiamate.

Nota

Mostra codice esterno è un'impostazione del profiler utente corrente che si applica a tutti i progetti in tutte le lingue aperte dall'utente.

Facendo doppio clic su una riga di codice esterno espansa nella finestra Stack di chiamate, la riga del codice chiamante viene evidenziata in verde nel codice sorgente. Per le DLL o altri moduli non trovati o caricati, è possibile aprire un simbolo o una pagina di origine non trovata.

A partire da Visual Studio 2022 versione 17.7, è possibile modificare automaticamente il codice .NET facendo doppio clic su codice esterno nella finestra Stack di chiamate. Per altre informazioni, vedere Generare codice sorgente da assembly .NET durante il debug.

.NET Just My Code

Nei progetti .NET Just My Code usa file di simboli (con estensione pdb) e ottimizzazioni del programma per classificare il codice utente e non utente. Il debugger .NET considera file binari ottimizzati e file con estensione pdb non caricati come codice non utente.

Tre attributi del compilatore influiscono anche su ciò che il debugger .NET considera come codice utente:

Il debugger .NET considera che tutto l'altro codice sia codice utente.

Durante il debug di .NET:

  • Eseguire il debug>dell'istruzione istruzione (o F11) nei passaggi del codice non utente sul codice alla riga successiva del codice utente.
  • Debug>Istruzione/uscita (o MAIUSC+F11) nel codice non utente viene eseguito alla riga successiva del codice utente.

Se non è presente altro codice utente, il debug continua fino al termine, raggiunge un altro punto di interruzione o genera un errore.

Se il debugger si interrompe nel codice non utente, ad esempio si usa Debug>Interrompi tutto e si sospende nel codice non utente, viene visualizzata la finestra Nessuna origine. È quindi possibile usare un comando Debug>Step per passare alla riga successiva del codice utente.

Se si verifica un'eccezione non gestita nel codice non utente, il debugger si interrompe nella riga di codice utente in cui è stata generata l'eccezione.

Se per l'eccezione vengono abilitate le eccezioni per la prima probabilità, la riga di codice utente chiamante viene evidenziata in verde nel codice sorgente. Nella finestra Stack di chiamate viene visualizzata la cornice con annotazioni con etichetta [Codice esterno].

C++ Just My Code

A partire da Visual Studio 2017 versione 15.8, è supportato anche Just My Code per l'istruzione di codice. Questa funzionalità richiede anche l'uso dell'opzione del compilatore /JMC (Just my code debugging). L'opzione è abilitata per impostazione predefinita nei progetti C++. Per la finestra Stack di chiamate e il supporto dello stack di chiamate in Just My Code, l'opzione /JMC non è necessaria.

Per essere classificato come codice utente, il PDB per il file binario contenente il codice utente deve essere caricato dal debugger (usare la finestra Moduli per controllare lo stato di caricamento).

Per il comportamento dello stack di chiamate, ad esempio nella finestra Stack di chiamate, Just My Code in C++ considera solo queste funzioni come codice non utente:

  • Funzioni con informazioni di origine rimosse nei propri file di simboli.
  • Funzioni in cui i file di simboli indicano che non esiste alcun file di origine corrispondente allo stack frame.
  • Funzioni specificate nei file *.natjmc nella cartella %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .

Per il comportamento di esecuzione delle istruzioni del codice, Just My Code in C++ considera solo queste funzioni come codice non utente:

  • Funzioni per le quali il file PDB corrispondente non è stato caricato nel debugger.
  • Funzioni specificate nei file *.natjmc nella cartella %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .

Nota

Per il supporto delle istruzioni del codice in Just My Code, il codice C++ deve essere compilato usando i compilatori MSVC in Visual Studio 15.8 Preview 3 o versione successiva e l'opzione del compilatore /JMC deve essere abilitata (è abilitata per impostazione predefinita). Per altri dettagli, vedere Personalizzare lo stack di chiamate C++ e il comportamento di esecuzione delle istruzioni del codice e questo post di blog. Per il codice compilato con un compilatore precedente, i file natstepfilter sono l'unico modo per personalizzare l'istruzione di codice, indipendentemente da Just My Code. Vedere Personalizzare il comportamento delle istruzioni C++.

Durante il debug C++, il codice non utente viene ignorato per impostazione predefinita. Durante il debug di C++:

  • Eseguire il debug>dell'istruzione Esegui istruzione (o F11) nei passaggi del codice non utente sul codice o viene eseguito alla riga successiva del codice utente, se viene chiamato Esegui istruzione da codice non utente.
  • Esegui debug>istruzione/uscita (o MAIUSC+F11) nel codice non utente viene eseguito alla riga successiva del codice utente (all'esterno del frame dello stack corrente).

Se non è presente altro codice utente, il debug continua fino al termine, raggiunge un altro punto di interruzione o genera un errore.

Se il debugger interrompe il codice non utente( ad esempio, si usa Debug>Interrompi tutto e si sospende nel codice non utente), l'istruzione continua nel codice non utente.

Se il debugger raggiunge un'eccezione, si arresta sull'eccezione, indipendentemente dal fatto che si tratti di codice utente o non utente. Le opzioni non gestite dall'utente nella finestra di dialogo Impostazioni eccezioni vengono ignorate.

Personalizzare lo stack di chiamate C++ e il comportamento di esecuzione delle istruzioni del codice

Per i progetti C++, è possibile specificare i moduli, i file di origine e le funzioni della finestra Stack di chiamate considera come codice non utente specificandoli nei file *.natjmc . Questa personalizzazione si applica anche alle istruzioni del codice se si usa il compilatore più recente (vedere C++ Just My Code).

  • Per specificare il codice non utente per tutti gli utenti del computer che esegue Visual Studio, aggiungere il file con estensione natjmc alla cartella %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
  • Per specificare il codice non utente per un singolo utente, aggiungere il file natjmc alla cartella %USERPROFILE%\My Documents\<Visual Studio version>\Visualizers .

Un file natjmc è un file XML con questa sintassi:

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

Attributi dell'elemento modulo

Attributo Descrizione
Name Obbligatorio. Percorso completo del modulo o dei moduli. È possibile usare i caratteri ? jolly di Windows (zero o un carattere) e * (zero o più caratteri). ad esempio:

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

indica al debugger di considerare tutti i moduli nella cartella \3rdParty\UtilLibs di qualsiasi unità come codice esterno.
Company Facoltativo. Nome della società che pubblica il modulo che viene incorporato nel file eseguibile. È possibile utilizzare questo attributo per evitare ambiguità tra i moduli.

Attributi dell'elemento file

Attributo Descrizione
Name Obbligatorio. Percorso completo del file o dei file di codice sorgente da considerare come codice esterno. È possibile usare i caratteri jolly di Windows ? e * quando si specifica il percorso.

Attributi dell'elemento funzione

Attributo Descrizione
Name Obbligatorio. Nome completo della funzione da considerare come codice esterno. ou può usare i caratteri ? jolly di Windows e * quando si specifica il percorso.
Module Facoltativo. Nome o percorso completo del modulo che contiene la funzione. È possibile utilizzare questo attributo per evitare ambiguità tra funzioni con lo stesso nome.
ExceptionImplementation Se impostato su true, lo stack di chiamate mostra la funzione che ha generato l'eccezione anziché questa funzione.

Personalizzare il comportamento di esecuzione delle istruzioni C++ indipendentemente dall'impostazione Just My Code

Nei progetti C++ è possibile specificare funzioni da eseguire elencando come funzioni NoStepInto nei file *.natstepfilter . Le funzioni elencate nei file *.natstepfilter non dipendono dalle impostazioni Just My Code. Una funzione NoStepInto indica al debugger di eseguire il passaggio della funzione, anche se chiama alcune funzioni StepInto o altro codice utente. A differenza delle funzioni elencate in .natjmc, il debugger eseguirà l'istruzione nella prima riga di codice utente all'interno della funzione NoStepInto.

  • Per specificare il codice non utente per tutti gli utenti di Visual Studio locali, aggiungere il file natstepfilter alla cartella %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .
  • Per specificare il codice non utente per un singolo utente, aggiungere il file natstepfilter alla cartella %USERPROFILE%\My Documents\<Visual Studio version>\Visualizers .

Nota

Alcune estensioni di terze parti possono disabilitare la funzionalità natstepfilter .

Un file natstepfilter è un file XML con questa sintassi:

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

Elemento Descrizione
Function Obbligatorio. Specifica una o più funzioni come funzioni non utente.
Name Obbligatorio. Espressione regolare formattata in base a ECMA-262 che specifica il nome completo della funzione da mettere in corrispondenza. Ad esempio:

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

indica al debugger che tutti i metodi in MyNS::MyClass devono essere considerati codice non utente. La corrispondenza prevede la distinzione tra maiuscole e minuscole.
Module Facoltativo. Espressione regolare formattata in base a ECMA-262 che specifica il percorso completo del modulo che contiene la funzione. La corrispondenza non fa distinzione tra maiuscole e minuscole.
Action Obbligatorio. Uno dei valori seguenti (viene effettuata la distinzione tra maiuscole e minuscole):

NoStepInto : indica al debugger di eseguire il passaggio della funzione.
StepInto : indica al debugger di eseguire l'istruzione nella funzione, sovrascrivendo qualsiasi altro NoStepInto elemento per la funzione corrispondente.

Altre informazioni sui file natstepfilter e natjmc

  • A partire da Visual Studio 2022 versione 17.6, è possibile aggiungere file natjmc e natstepfilter direttamente alla soluzione o al progetto.

  • Gli errori di sintassi nei file natstepfilter e natjmc non vengono segnalati nella finestra Output del debugger.

  • A differenza dei file natvis , i file natstepfilter e natjmc non vengono ricaricati a caldo. Questi file vengono invece ricaricati all'inizio della sessione di debug.

  • Per le funzioni modello, l'uso di &lt;.*&gt; o &lt;.* nel nome può essere utile.

JavaScript Just My Code

Per i progetti con estensione esproj in Visual Studio 2022, Visual Studio Code usa un file launch.json per configurare e personalizzare il debugger. launch.json è un file di configurazione del debugger.

Visual Studio collega il debugger solo al codice utente. Per i progetti con estensione esproj , è possibile configurare il codice utente (ovvero le impostazioni Just My Code ) in Visual Studio usando l'impostazione skipFiles in launch.json. Questa impostazione funziona come le impostazioni di launch.json in VS Code. Per altre informazioni su skipFiles, vedere Ignora codice non interessante.