Just My Code

 

Data di pubblicazione: aprile 2016

Per la documentazione più recente di Visual Studio 2017 RC, vedere Documentazione di Visual Studio 2017 RC.

Gli sviluppatori che utilizzano i linguaggi .NET Framework hanno familiarità con la funzionalità di debug Just My Code che ignora chiamate di sistema e del framework e altre chiamate non di utenti e le comprime nelle finestre dello stack di chiamate. La funzionalità Just My Code è stata estesa ai linguaggi C++ e JavaScript. In questo argomento vengono descritte le specifiche di utilizzo di Just My Code in progetti .NET Framework, C++ nativo e JavaScript.

Abilitare o disabilitare Just My Code

Just My Code in .NET Framework

Just My Code in C++

Just My Code in JavaScript

Per abilitare o disabilitare Just My Code, scegliere Opzioni e impostazioni dal menu Debug. Nel nodo Debug/Generale selezionare o deselezionare Abilita Just My Code.

Abilitare Just My Code nella finestra di dialogo Opzioni

System_CAPS_ICON_note.jpg Nota

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

Eseguire l'override dell'applicazione di filtri dello stack di chiamate

Nelle visualizzazioni dello stack di chiamate, ad esempio nelle finestre dello stack di chiamate e delle attività, la funzionalità Just My Code consente di comprimere il codice non utente in un frame annotato con etichetta [External Code]. Per visualizzare i frame compressi, scegliere Mostra codice esterno nel menu di scelta rapida della visualizzazione dello stack di chiamate.

System_CAPS_ICON_note.jpg Nota

L'impostazione Mostra codice esterno viene salvata nel profiler dell'utente corrente e si applica a tutti i progetti in tutti i linguaggi aperti dall'utente.

Torna all'inizio Sommario

Codice utente e non utente | Comportamento dell'esecuzione di istruzioni | Comportamento del punto di interruzione | Comportamento delle eccezioni

Codice utente e non utente

Per distinguere il codice utente dal codice non utente, tramite Just My Code vengono esaminati progetti aperti, file di simboli (con estensione pdb) e ottimizzazioni del programma.

  1. Se da un progetto aperto di Visual Studio viene compilato un file binario, quest'ultimo viene sempre considerato codice utente.

  2. Il debugger considera il codice come codice non utente quando il file binario è ottimizzato o quando il file con estensione pdb non è disponibile.

Tre ulteriori attributi influiscono sul codice che viene considerato My Code dal debugger:

Tutto il codice rimanente viene considerato codice utente.

Torna all'inizio Sommario | Just My Code in .NET Framework

Comportamento dell'esecuzione di istruzioni

Quando si utilizza Esegui istruzione (tasto di scelta rapida: F11) per codice non utente, il debugger passa alla successiva istruzione utente nel codice. Quando si utilizza Esci da istruzione/routine (tasto di scelta rapida: MAIUSC+F11), il debugger viene eseguito dalla riga successiva del codice utente. Se non viene rilevato nessun codice utente l'esecuzione continua finché non viene chiusa l'applicazione, non viene trovato un punto di interruzione o non si verifica un'eccezione.

Torna all'inizio Sommario | Just My Code in .NET Framework

Comportamento del punto di interruzione

Quando la funzionalità Just My Code è attivata, è possibile scegliere Interrompi tutto (tasto di scelta rapida: CTRL+ALT+INTERR) e arrestare l'esecuzione in una posizione in cui non è presente codice utente da visualizzare. In questo caso viene visualizzata la finestra Nessuna origine. Se a questo punto si sceglie un comando di esecuzione, il debugger passerà alla successiva riga del codice utente.

Torna all'inizio Sommario | Just My Code in .NET Framework

Comportamento delle eccezioni

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

Se per l'eccezione sono abilitate le eccezioni first-chance, la riga di codice utente viene evidenziata in verde. Nello stack di chiamate viene mostrato un frame annotato con etichetta [Codice esterno].

Torna all'inizio Sommario | Just My Code in .NET Framework

Codice utente e non utente | Comportamento dell'esecuzione di istruzioni | Comportamento delle eccezioni | Personalizzare il comportamento dell'esecuzione | Personalizzare il comportamento dello stack di chiamate

Codice utente e non utente

Just My Code in C++ è diverso da Just My Code in .NET Framework e in JavaScript perché il comportamento dell'esecuzione di istruzioni è indipendente da quello dello stack di chiamate.

Stack di chiamate

Per impostazione predefinita, nelle finestre dello stack di chiamate il debugger considera le funzioni seguenti come codice non utente:

  • Funzioni con informazioni di origine rimosse nei propri file di simboli.

  • Funzioni i cui file di simboli indicano che non esiste alcun file di origine corrispondente allo stack frame.

  • Funzioni specificate nei file *.natjmc e nella cartella %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.

Esecuzione di istruzioni

Per impostazione predefinita solo le funzioni specificate nei file *.natstepfilter nella cartella %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers vengono considerate codice non utente.

È possibile creare i propri file .natstepfilter e .natjmc per personalizzare il comportamento dell'esecuzione di istruzioni e della finestra dello stack di chiamate in %USERPROFILE%\My Documents\Visual Studio 2015\Visualizers.

Torna all'inizio Sommario | Just My Code in C++

Comportamento dell'esecuzione di istruzioni

Quando si utilizza Esegui istruzione (tasto di scelta rapida: F11) per codice non utente da codice utente, il debugger passa alla successiva istruzione utente nel codice. Quando si utilizza Esci da istruzione/routine (tasto di scelta rapida: MAIUSC+F11), il debugger viene eseguito dalla riga successiva del codice utente. Se non viene rilevato nessun codice utente l'esecuzione continua finché non viene chiusa l'applicazione, non viene trovato un punto di interruzione o non si verifica un'eccezione.

Se il debugger si interrompe nel codice non utente, ad esempio se un comando Interrompi tutto si arresta nel codice non utente, l'esecuzione continua nel codice non utente.

Torna all'inizio Sommario | Just My Code in C++

Comportamento delle eccezioni

Quando il debugger raggiunge un'eccezione, verrà arrestato sull'eccezione indipendentemente che il codice sia utente o non utente. Le opzioni Non gestita dall'utente nella finestra di dialogo Eccezioni vengono ignorate.

Torna all'inizio Sommario | Just My Code in C++

Personalizzare il comportamento dell'esecuzione

È possibile specificare le funzioni da ignorare elencandole come codice non utente nei file *.natstepfilter.

  • Per specificare il codice non utente per tutti gli utenti del computer di Visual Studio, aggiungere il file con estensione natstepfilter alla cartella %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.

  • Per specificare il codice non utente per un singolo utente, aggiungere il file con estensione natstepfilter alla cartella %USERPROFILE%\My Documents\Visual Studio 2015\Visualizers.

. I file con estensione natstepfilter sono file XML con la sintassi seguente:

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

ElementoDescrizione
FunzioneObbligatorio. Specifica una o più funzioni come funzioni non utente.
NameNecessario. 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.
ModuleParametro 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.
ActionNecessario. Uno dei valori seguenti (viene effettuata la distinzione tra maiuscole e minuscole):

- NoStepInto : indica al debugger di ignorare la funzione corrispondente.
- StepInto : indica al debugger di eseguire le funzioni corrispondenti, eseguendo l'override di qualsiasi altro elemento NoStepInto per le funzioni corrispondenti.

Torna all'inizio Sommario | Just My Code in C++

Personalizzare il comportamento dello stack di chiamate

È possibile specificare i moduli, i file di origine e le funzioni da trattare come codice non utente negli stack di chiamate specificandoli nei file *.natjmc.

  • Per specificare il codice non utente per tutti gli utenti del computer di 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 con estensione natjmc alla cartella %USERPROFILE%\My Documents\Visual Studio 2015\Visualizers.

. I file con estensione natjmc sono file XML con la sintassi seguente:

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

AttributoDescrizione
NameNecessario. Percorso completo del modulo o dei moduli. È possibile usare i caratteri jolly di Windows ? (zero o un carattere) e * (zero o più caratteri). Di seguito è riportato un esempio:

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

indica al debugger di considerare tutti i moduli nella cartella in \3rdParty\UtilLibs di qualsiasi unità come codice esterno.
CompanyParametro 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

AttributoDescrizione
NameNecessario. 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

AttributoDescrizione
NameNecessario. Nome completo della funzione da considerare come codice esterno.
ModuleParametro facoltativo. Nome o percorso completo del modulo che contiene la funzione. È possibile utilizzare questo attributo per evitare ambiguità tra funzioni con lo stesso nome.
ExceptionImplementationSe impostato su true, lo stack di chiamate mostra la funzione che ha generato l'eccezione anziché questa funzione.

Torna all'inizio Sommario | Just My Code in C++

Codice utente e non utente | Comportamento dell'esecuzione di istruzioni | Comportamento del punto di interruzione | Comportamento delle eccezioni | Personalizzare Just My Code

Codice utente e non utente

Classificazioni del codice

Just My Code in JavaScript controlla l'esecuzione e la visualizzazione dello stack di chiamate suddividendo il codice in una delle classificazioni seguenti:

MyCodeCodice utente che si possiede e si controlla.
LibraryCodeCodice non utente da librerie utilizzate regolarmente e su cui si basa l'applicazione per essere eseguita correttamente (ad esempio WinJS o jQuery).
UnrelatedCodeCodice non utente che può essere eseguito nell'applicazione, ma che non è di proprietà dell'utente e su cui l'applicazione non si basa direttamente per il corretto funzionamento, ad esempio un SDK pubblicitario che mostra annunci. Nei progetti Windows Store tutto il codice caricato nell'applicazione da un URI HTTP o HTTPS viene anche considerato UnrelatedCode.

Il debugger JavaScript classifica automaticamente questi tipi di codice:

  • Lo script che viene eseguito passando una stringa alla funzione eval fornita dall'host viene classificato come MyCode.

  • Lo script che viene eseguito passando una stringa al costruttore Function viene classificato come LibraryCode.

  • Lo script contenuto in un riferimento del framework, ad esempio WinJS o Azure SDK, viene classificato come LibraryCode.

  • Lo script che viene eseguito passando una stringa alla funzione setTimeout, setImmediate o setInterval viene classificato come UnrelatedCode.

  • %VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json specifica altro codice non utente e utente per tutti i progetti di Visual Studio JavaScript.

È possibile modificare le classificazioni predefinite e classificare file e URL specifici aggiungendo un file con estensione json denominato mycode.json nella cartella radice di un progetto.

Tutto il resto del codice viene classificato come MyCode.

Torna all'inizio Sommario | Just My Code in JavaScript

Comportamento dell'esecuzione di istruzioni

  • Se una funzione non fa parte del codice utente (MyCode), l'opzione Esegui istruzione (tasto di scelta rapida: F11) si comporta come Esegui istruzione/routine (tasto di scelta rapida: F10).

  • Se un'esecuzione inizia nel codice non utente (LibraryCode o UnrelatedCode), l'esecuzione temporanea si comporta come se la funzionalità Just My Code non sia attivata. Non appena si esegue nuovamente codice utente, l'esecuzione di Just My Code è nuovamente abilitata.

  • Quando un'esecuzione nel codice utente comporta l'uscita dal contesto di esecuzione corrente (ad esempio eseguire l'ultima riga di un gestore eventi), il debugger si arresta alla successiva riga di codice utente eseguita. Se ad esempio un callback viene eseguito nel codice LibraryCode, il debugger continua finché la riga di codice utente successiva non viene eseguita.

  • Esci da istruzione/routine (tasto di scelta rapida: MAIUSC+F11) si arresta alla riga di codice utente successiva. Se non viene rilevato nessun codice utente l'esecuzione continua finché non viene chiusa l'applicazione, non viene trovato un punto di interruzione o non si verifica un'eccezione.

Torna all'inizio Sommario | Just My Code in JavaScript

Comportamento del punto di interruzione

  • I punti di interruzione impostati nel codice verranno raggiunti sempre indipendentemente dalla classificazione del codice.

  • Se la parola chiave debugger viene rilevata in:

    • codice LibraryCode, il debugger si interrompe sempre.

    • codiceUnrelatedCode, il debugger non si arresta.

Torna all'inizio Sommario | Just My Code in JavaScript

Comportamento delle eccezioni

Se un'eccezione non gestita viene generata in:

  • codice MyCode o LibraryCode, il debugger si interrompe.

  • codice UnrelatedCode e codice MyCode o LibraryCode è nello stack di chiamate, il debugger si interrompe.

Se le eccezioni first-chance sono abilitate nella finestra di dialogo delle eccezioni e l'eccezione viene generata nel codice LibraryCode o UnrelatedCode:

  • Se l'eccezione è gestita, il debugger non si interrompe.

  • Se l'eccezione non è gestita, il debugger si interrompe.

Torna all'inizio Sommario | Just My Code in JavaScript

Personalizzare Just My Code

Per classificare il codice utente e non utente per un singolo progetto di Visual Studio, aggiungere un file con estensione json denominato mycode.json nella cartella radice del progetto.

Le classificazioni vengono eseguite nell'ordine seguente:

  1. Classificazioni predefinite

  2. Classificazioni nel file %VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json

  3. Classificazioni nel file mycode. json del progetto corrente.

Ogni passaggio di classificazione esegue l'override dei passaggi precedenti. Non è necessario che in un file con estensione json vengano elencate tutte le coppie chiave-valore e i valori MyCode, Libraries e Unrelated possono essere matrici vuote.

I file My Code con estensione json utilizzano la sintassi seguente:

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

Eval, Function e ScriptBlock

Le coppie chiave-valore Eval, Function e ScriptBlock determinano come viene classificato il codice generato dinamicamente.

EvalScript eseguito passando una stringa alla funzione eval fornita dall'host. Per impostazione predefinita, lo script Eval viene classificato come MyCode.
FunzioneScript eseguito passando una stringa al costruttore Function. Per impostazione predefinita, lo script Function viene classificato come LibraryCode.
ScriptBlockScript eseguito passando una stringa alla funzione setTimeout, setImmediate o setInterval. Per impostazione predefinita, lo script ScriptBlock viene classificato come UnrelatedCode.

È possibile modificare il valore a una delle parole chiave seguenti:

  • MyCode classifica lo script come MyCode.

  • Library classifica lo script come LibraryCode.

  • Unrelated classifica lo script come UnrelatedCode.

MyCode, Libraries e Unrelated

Le coppie chiave-valore MyCode, Libraries e Unrelated specificano gli URL o i file da includere in una classificazione:

MyCodeMatrice di URL o di file classificati come MyCode.
LibrerieMatrice di URL o di file classificati come LibraryCode.
UnrelatedMatrice di URL o di file classificati come UnrelatedCode.

La stringa dell'URL o del file può contenere uno o più caratteri *, che corrispondono a zero o più caratteri. * è l'equivalente dell'espressione regolare .*.

Torna all'inizio Sommario | Just My Code in JavaScript

Mostra: