Just My Code
Gli sviluppatori che utilizzano i linguaggi di .NET Framework hanno familiarità con la funzionalità di debug Just My Code che ignora chiamate di sistema, chiamate del framework e altre chiamate non utente, e comprime le chiamate nelle finestre dello stack di chiamate. In Visual Studio 2013, Just My Code è stato esteso ai linguaggi C++ e JavaScript. In questo argomento vengono descritte le specifiche di utilizzo di Just My Code in .NET Framework, in C++ nativo e in progetti JavaScript.
Contenuto
Abilitare o disabilitare Just My Code
Just My Code in .NET Framework
Just My Code in C++
Just My Code in JavaScript
Abilitare o disabilitare Just My Code
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.
Nota
L'impostazione 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 nella finestra dello stack di chiamate e in quella delle attività, Just My Code comprime il codice non utente in un frame annotato con etichetta [External Code]. Per visualizzare i frame compressi, scegliere Mostra codice esterno dal menu contestuale della visualizzazione dello stack di chiamate.
Nota
L'impostazione Mostra codice esterno viene salvato nel profiler dell'utente corrente.Si applica a tutti i progetti in tutti i linguaggi aperti dall'utente.
Just My Code in .NET Framework
Codice utente e non utente**|Comportamento dell'esecuzione|Comportamento del punto di interruzione|**Comportamento delle eccezioni
Codice utente e non utente
Per distinguere il codice utente dal codice non utente, Just My Code guarda a progetti aperti, a file di simboli (.pdb) e alle ottimizzazioni del programma.
Se da un progetto aperto di Visual Studio viene compilato un binario, esso viene sempre considerato codice utente.
Il debugger considera del codice come codice non utente quando il binario è ottimizzato o quando il file .pdb non è disponibile.
Tre ulteriori attributi influiscono sul codice che viene considerato My Code dal debugger:
DebuggerNonUserCodeAttribute indica al debugger che il codice a cui è applicato non è My Code.
DebuggerHiddenAttribute nasconde il codice al debugger, anche se Just My Code è disattivato.
DebuggerStepThroughAttribute indica al debugger di eseguire un'istruzione alla volta il codice a cui viene applicato, anziché eseguire tutto il codice.
Tutto il resto del codice viene considerato codice utente.
Comportamento dell'esecuzione
Quando si utilizza Esegui istruzione (tasto di scelta rapida: F11) per del codice non utente, il debugger ignora il codice fino alla prossima istruzione utente. Quando si utilizza Esci da istruzione/routine (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, viene trovato un punto di interruzione o si verifica un'eccezione.
Comportamento del punto di interruzione
Quando Just My Code è attivato, è possibile scegliere Interrompi tutto (tastiera: CTRL + ALT + Break) e arrestare l'esecuzione in una posizione in cui non è presente codice utente da visualizzare. In questo caso viene visualizzata la finestra Nessun sorgente. Se a questo punto si sceglie un comando di esecuzione, il debugger passerà alla successiva riga di codice utente.
Comportamento delle eccezioni
Se si verifica un'eccezione non gestita nel codice non utente, il debugger si arresta alla riga del codice utente in cui l'eccezione è stata generata.
Se le eccezioni first chance sono abilitate per l'eccezione, la riga di codice utente viene evidenziata in verde. Lo stack di chiamate mostra un frame annotato con etichetta [Codice esterno].
Just My Code in C++
Codice utente e non utente**|Comportamento dell'esecuzione|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 è indipendente dal comportamento dello stack di chiamate.
Stack di chiamate
Per impostazione predefinita, il debugger, nelle finestre dello stack di chiamate, considera queste funzioni 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 nessun file di origine che corrisponde allo stack frame.
Funzioni specificate nei file *.natjmc 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 sono considerate codice non utente.
È possibile creare il proprio .natstepfilter e il proprio .natjmc per personalizzare il comportamento dell'esecuzione e della finestra dello stack di chiamate in %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers.
Comportamento dell'esecuzione
Quando si utilizza Esegui istruzione (tasto di scelta rapida: F11) per del codice non utente, il debugger ignora il codice fino alla prossima istruzione utente. Quando si utilizza Esci da istruzione/routine (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, viene trovato un punto di interruzione o si verifica un'eccezione.
Se il debugger si arresta nel codice non utente, ad esempio se un comando Interrompi tutto viene eseguito nel codice non utente, l'esecuzione continua nel codice non utente.
Comportamento delle eccezioni
Quando il debugger raggiunge un'eccezione, viene bloccato sull'eccezione indipendentemente che sia nel codice utente o non utente. Le opzioni Non gestito dall'utente nella finestra di dialogo Eccezioni vengono ignorate.
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 che esegue Visual Studio, aggiungere il file di .natstepfilter alla cartella %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
Per specificare il codice non utente per un singolo utente, aggiungere il file di .natstepfilter alla cartella %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers.
I file di .natstepfilter sono file XML con la seguente sintassi:
<?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>
Elemento |
Descrizione |
---|---|
Funzione |
Obbligatorio. Specifica una o più funzioni come funzioni non utente. |
Name |
Obbligatorio. Un'espressione regolare formattata secondo ECMA-262 che specifica il nome completo della funzione da far combaciare. 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 |
Parametro facoltativo. Un'espressione regolare formattata secondo ECMA-262 che specifica il percorso completo del modulo che contiene la funzione. La corrispondenza prevede la distinzione tra maiuscole e minuscole. |
Action |
Obbligatorio. Uno di questi valori (viene effettuata la distinzione tra maiuscole e minuscole):
|
Personalizzare il comportamento dello stack di chiamate
È possibile specificare i moduli, i file di origine e le funzioni da trattare come codice non utente nello stack di chiamate specificandoli nei file *.natjmc.
Per specificare il codice non utente per tutti gli utenti del computer che esegue Visual Studio, aggiungere il file di .natjmc alla cartella %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
Per specificare il codice non utente per un singolo utente, aggiungere il file di .natjmc alla cartella %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers.
I file di .natjmc sono file XML con la seguente sintassi:
<?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>
Attributi dell'elemento modulo
Attributo |
Descrizione |
---|---|
Name |
Obbligatorio. Il percorso completo del modulo o dei moduli. È possibile utilizzare i caratteri jolly di Windows ? (nessun 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 \3rdParty\UtilLibs di qualsiasi unità come codice esterno. |
Company |
Parametro facoltativo. Il 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. Il percorso completo del file o dei file di codice sorgente da considerare come il codice esterno. È possibile utilizzare i caratteri jolly di Windows ? e * quando si specifica il percorso. |
Attributi dell'elemento funzione
Attributo |
Descrizione |
---|---|
Name |
Obbligatorio. Il nome completo della funzione da considerare come il codice esterno. |
Module |
Parametro facoltativo. Il nome o il 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. |
Just My Code in JavaScript
Codice utente e non utente**|Comportamento dell'esecuzione|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 seguenti classificazioni:
MyCode |
Codice utente che si possiede e si controlla. |
LibraryCode |
Codice non utente da librerie che vengono utilizzate regolarmente e su cui l'applicazione si basa per essere eseguita correttamente (ad esempio WinJS o jQuery). |
UnrelatedCode |
Codice non utente che può essere eseguito nell'applicazione, ma non si possiede e su cui l'applicazione non si basa direttamente per funzionare correttamente, ad esempio un SDK pubblicitario che mostra annunci). Nei progetti di Windows Store, anche tutto il codice caricato nell'applicazione da un URI HTTP o HTTPS viene 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 alle funzioni setTimeout, setImmediate, o setInterval viene classificato come UnrelatedCode.
%VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json specifica altro codice utente e non utente per tutti i progetti JavaScript di Visual Studio.
È possibile modificare le classificazioni predefinite e classificare file e URL specifici aggiungendo un file di .json denominato mycode.json nella cartella radice di un progetto.
Tutto il resto del codice viene classificato come MyCode.
Comportamento dell'esecuzione
Se una funzione non fa parte del codice utente (MyCode), Esegui istruzione (tasto di scelta rapida: F11) si comporta come Esegui istruzione/routine (scelta rapida: F10).
Se un esecuzione inizia nel codice non utente (LibraryCode o UnrelatedCode), allora l'esecuzione temporanea si comporta come se Just My Code non sia attivato. Non appena si esegue nuovamente del codice utente, l'esecuzione di Just My Code è nuovamente abilitata.
Quando un esecuzione nel codice utente comporta l'uscita dal contesto di esecuzione corrente (come eseguire l'ultima riga di un gestore eventi), il debugger si arresta alla successiva riga di codice utente eseguita. Ad esempio, se un callback viene eseguito nel codice LibraryCode il debugger continua finché la riga di codice utente successiva non viene eseguita.
Esci da istruzione/routine (scelta rapida: MAIUSC + F11) si arresta nella riga di codice utente successiva. Se non viene rilevato nessun codice utente l'esecuzione continua finché non viene chiusa l'applicazione, viene trovato un punto di interruzione o si verifica un'eccezione.
Comportamento del punto di interruzione
I punti di interruzione che sono stati impostati nel codice verranno raggiunti sempre indipendentemente dalla classificazione del codice
Se la parola chiave debugger viene rilevata in:
codice LibraryCode, il debugger si arresta sempre.
codiceUnrelatedCode, il debugger non si arresta.
Comportamento delle eccezioni
Se un'eccezione non gestita viene generata in:
codice MyCode o LibraryCode, il debugger si arresta sempre.
codice UnrelatedCode, e del codice MyCode o LibraryCode è nello stack di chiamate, il debugger si arresta.
Se le eccezioni first chance sono abilitate per l'eccezione nella finestra di dialogo delle eccezioni e l'eccezione viene generata nel codice LibraryCode o UnrelatedCode :
Se l'eccezione è gestita, il debugger non si arresta.
Se l'eccezione non è gestita, il debugger si arresta.
Personalizzare Just My Code
Per classificare il codice utente e non utente per un singolo progetto di Visual Studio, aggiungere un file .json denominato mycode.json nella cartella radice del progetto.
Le classificazioni vengono eseguite nel seguente ordine:
Classificazioni predefinite
Classificazioni nel file %VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json
Classificazioni nel file mycode. json del progetto corrente.
Ogni passaggio di classificazione esegue l'override dei passaggi precedenti. Non è necessario che un file .json elenchi tutte le coppie chiave-valore e i valori MyCode, Libraries e Unrelated possono essere array vuoti.
I file di codice utente .json utilizzano questa sintassi:
{
"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 consentono di determinare come viene classificato il codice generato dinamicamente.
Eval |
Script eseguito passando una stringa alla funzione eval fornita dall'host. Per impostazione predefinita, lo script di Eval viene classificato come MyCode. |
Funzione |
Script eseguito passando una stringa al costruttore Function. Per impostazione predefinita, lo script di Function viene classificato come LibraryCode. |
ScriptBlock |
Script eseguito passando una stringa alle funzioni setTimeout, setImmediateo setInterval. Per impostazione predefinita, lo script di ScriptBlock viene classificato come UnrelatedCode. |
È possibile modificare il valore a una delle seguenti parole chiave:
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:
MyCode |
Un array di URL o di file che sono classificati come MyCode. |
Librerie |
Un array di URL o di file che sono classificati come LibraryCode. |
Unrelated |
Un array di URL o di file che sono classificati come UnrelatedCode. |
La stringa dell'url del file può contenere uno o più caratteri *, che corrispondono a zero o più caratteri * è l'equivalente dell'espressione regolare .*.