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.

Abilitare Just My Code nella finestra di dialogo Opzioni

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.

  1. Se da un progetto aperto di Visual Studio viene compilato un binario, esso viene sempre considerato codice utente.

  2. 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:

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):

  • NoStepInto - indica al debugger di ignorare la funzione corrispondente.

  • StepInto - indica al debugger di eseguire le funzioni corrispondenti, eseguendo l'override di qualsiasi altro NoStepInto per le funzioni corrispondenti.

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:

  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 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 .*.