Specificare i file di simboli (con estensione pdb) e di origine nel debugger di Visual Studio (C#, C++, Visual Basic, F#)

File di database di programma (con estensione pdb), detti anche file di simboli, identificatori e istruzioni del mapping nel codice sorgente del progetto agli identificatori e alle istruzioni corrispondenti nelle app compilate. Questi file di mapping collegano il debugger al codice sorgente, che consente il debug.

Quando si compila un progetto dall'IDE di Visual Studio con la configurazione di compilazione debug standard, il compilatore crea i file di simboli appropriati. Questo articolo descrive come gestire i file di simboli nell'IDE, ad esempio:

Per una spiegazione dettagliata dei file di simboli, vedere quanto segue:

Funzionamento dei file di simboli

Il file con estensione pdb contiene informazioni sullo stato del debug e del progetto che consentono il collegamento incrementale di una configurazione di debug dell'app. Il debugger di Visual Studio usa file con estensione pdb per determinare due informazioni chiave durante il debug:

  • Nome del file di origine e numero di riga da visualizzare nell'IDE di Visual Studio.
  • Posizione in cui arrestare l'app per un punto di interruzione.

I file di simboli mostrano anche il percorso dei file di origine e, facoltativamente, il server da cui recuperarli.

Il debugger carica solo i file con estensione pdb che corrispondono esattamente ai file con estensione pdb creati durante la compilazione di un'app, ovvero i file pdb o le copie originali. Questa duplicazione esatta è necessaria perché il layout delle app può cambiare anche se il codice stesso non è stato modificato. Per altre informazioni, vedere il post del blog sulla necessità di creare una corrispondenza esatta tra i file di simboli del debugger e i file binari con cui sono stati creati.

Suggerimento

Per eseguire il debug di codice all'esterno del codice sorgente del progetto, ad esempio codice di Windows o codice di terze parti, è necessario specificare il percorso dei file con estensione pdb del codice esterno (e, facoltativamente, i file di origine), che devono corrispondere esattamente alle compilazioni nell'app.

Dove il debugger cerca i simboli

Quando si esegue il debug di un progetto nell'IDE di Visual Studio, il debugger carica automaticamente i file di simboli che è possibile trovare per impostazione predefinita.

Nota

Quando si esegue il debug di codice gestito in un dispositivo remoto, tutti i file di simboli devono trovarsi nel computer locale o in un percorso specificato nelle opzioni del debugger.

Il debugger cerca i file di simboli nei percorsi seguenti:

  1. Cartella del progetto.

  2. Percorso specificato all'interno della DLL o del file eseguibile (con estensione exe).

    Per impostazione predefinita, se è stata compilata una DLL o un file con estensione exe nel computer, il linker inserisce il percorso completo e il nome file del file con estensione pdb associato nel file DLL o exe. Il debugger verifica se il file di simboli esiste in tale percorso.

  3. La stessa cartella del file DLL o exe .

  4. Tutti i percorsi specificati nelle opzioni del debugger per i file di simboli. Per aggiungere e abilitare le posizioni dei simboli, vedere Configurare le posizioni dei simboli e le opzioni di caricamento.

    • Qualsiasi cartella della cache di simboli locale.

    • Se selezionato, i server di simboli e i percorsi di rete, Internet o locali, ad esempio i server di simboli Microsoft. Visual Studio può scaricare i file di simboli di debug dai server di simboli che implementano il symsrv protocollo. Visual Studio Team Foundation Server e gli strumenti di debug per Windows sono due strumenti che possono usare i server di simboli.

      I server di simboli che è possibile usare includono:

      Server di simboli Microsoft pubblici: per eseguire il debug di un arresto anomalo che si verifica durante una chiamata a una DLL di sistema o a una libreria di terze parti, spesso sono necessari file pdb di sistema. I file con estensione pdb di sistema contengono simboli per DLL di Windows, file con estensione exe e driver di dispositivo. È possibile ottenere simboli per i sistemi operativi Windows, MDAC, IIS, ISA e .NET dai server di simboli Microsoft pubblici.

      Server di simboli in una rete interna o nel computer locale: il team o la società può creare server di simboli per i propri prodotti e come cache per i simboli provenienti da origini esterne. Nel computer potrebbe essere presente un server di simboli.

      Server di simboli di terze parti: provider di terze parti di applicazioni e librerie Windows possono fornire l'accesso al server dei simboli su Internet.

      Avviso

      Se si usa un server di simboli diverso dai server di simboli Microsoft pubblici, assicurarsi che il server dei simboli e il relativo percorso siano attendibili. Poiché i file di simboli possono contenere codice eseguibile arbitrario, è possibile essere esposti alle minacce alla sicurezza.

Configurare il percorso dei file di simboli e le opzioni di caricamento

Per impostazione predefinita, il debugger controlla vari percorsi per i simboli. Vedere Dove il debugger cerca i simboli.

Nella pagina Strumenti>Opzioni>debug>simboli è possibile:

  • Specificare e selezionare i percorsi di ricerca per i file di simboli.
  • Specificare i server di simboli per i componenti microsoft, Windows o di terze parti.
  • Specificare i moduli per cui si esegue o non si vuole che il debugger carichi automaticamente i simboli.
  • Modificare queste impostazioni durante il debug attivo. Vedere Caricare i simboli durante il debug.

Per specificare le posizioni dei simboli e le opzioni di caricamento:

  1. In Visual Studio aprire Strumenti>Opzioni>debug>simboli (o Simboli opzioni> di debug).>

  2. In Percorsi del file di simboli (con estensione pdb),

    • Per usare i server di simboli Microsoft o NuGet.org Server simboli, selezionare la casella di controllo.

    • Per aggiungere un nuovo percorso del server dei simboli,

      1. Selezionare il + simbolo nella barra degli strumenti.
      2. Digitare l'URL (http), la condivisione di rete o il percorso locale del server dei simboli o il percorso del simbolo nel campo di testo. La funzione di completamento delle istruzioni facilita l'individuazione del formato corretto.

      Tools - Options - Debugging - Symbols page

      Tools - Options - Debugging - Symbols page

      Nota

      Viene eseguita la ricerca solo della cartella specificata. È necessario aggiungere voci per tutte le sottocartelle da cercare.

    • Per aggiungere un nuovo percorso del server dei simboli di Azure DevOps:

      1. Selezionare l'icona Tools/ Options/ Debugging/Symbols new server icon sulla barra degli strumenti.

      2. Nella finestra di dialogo Connessione server dei simboli di Azure DevOps scegliere uno dei server di simboli disponibili e selezionare Connessione.

        Per altre informazioni, vedere Aggiungere un server di simboli di Azure Artifacts.

    • Per modificare l'ordine di caricamento per le posizioni dei simboli, usare CTRL SU e CTRL++GIÙ oppure le icone freccia SU e GIÙ.

    • Per modificare un URL o un percorso, fare doppio clic sulla voce oppure selezionarla e premere F2.

    • Per rimuovere una voce, selezionarla e quindi selezionare l'icona - .

  3. (Facoltativo) Per migliorare le prestazioni di caricamento dei simboli, in Cache symbols in questa directory digitare un percorso di cartella locale in cui i server di simboli possono copiare i simboli.

    Nota

    Non posizionare la cache dei simboli locali in una cartella protetta, ad esempio C:\Windows o una sottocartella. Usare invece una cartella di lettura e scrittura.

    Nota

    Per i progetti C++, se è impostata la _NT_SYMBOL_PATH variabile di ambiente, eseguirà l'override del valore impostato in Simboli di cache in questa directory.

  4. Specificare i moduli che si desidera che il debugger carichi dai percorsi del file symbol (con estensione pdb) all'avvio.

    • Selezionare Carica tutti i moduli, a meno che non sia escluso (impostazione predefinita) per caricare tutti i simboli per tutti i moduli nel percorso del file di simboli, ad eccezione dei moduli esclusi in modo specifico. Per escludere determinati moduli, selezionare Specifica moduli esclusi, selezionare l'icona + , digitare i nomi dei moduli da escludere e selezionare OK.

    • Per caricare solo i moduli specificati dai percorsi dei file di simboli, selezionare Carica solo i moduli specificati. Selezionare Specifica moduli inclusi, selezionare l'icona + , digitare i nomi dei moduli da includere e quindi selezionare OK. I file di simboli per altri moduli non vengono caricati.

  5. Seleziona OK.

Altre opzioni di simboli per il debug

È possibile selezionare opzioni di simboli aggiuntive in >Strumenti Opzioni>Debug>generale (o Opzioni>di debug>generale):

  • Carica esportazioni DLL (solo Nativo)

    Carica le tabelle di esportazione DLL per C/C++. Per informazioni dettagliate, vedere Tabelle di esportazione DLL. La lettura delle informazioni sull'esportazione delle DLL comporta un sovraccarico, quindi il caricamento delle tabelle di esportazione è disattivato per impostazione predefinita. È anche possibile usare dumpbin /exports in una riga di comando di compilazione C/C++.

  • Abilitare il debug a livello di indirizzo e Mostra disassembly se l'origine non è disponibile

    Mostra sempre il disassembly quando non vengono trovati file di origine o simboli.

    Options / Debugging / General disassembly options

  • Abilita il supporto del server di origine

    Usa il server di origine per eseguire il debug di un'app quando non è presente codice sorgente nel computer locale o il file con estensione pdb non corrisponde al codice sorgente. Il server di origine accetta richieste di file e restituisce i file effettivi dal controllo del codice sorgente. Il server di origine viene eseguito usando una DLL denominata srcsrv.dll per leggere il file con estensione pdb dell'app. Il file con estensione pdb contiene puntatori al repository del codice sorgente, nonché comandi usati per recuperare il codice sorgente dal repository.

    È possibile limitare i comandi che srcsrv.dll possono essere eseguiti dal file con estensione pdb dell'app elencando i comandi consentiti in un file denominato srcsrv.ini. Inserire il file srcsrv.ini nella stessa cartella di srcsrv.dll e devenv.exe.

    Importante

    I comandi arbitrari possono essere incorporati nel file con estensione pdb di un'app, quindi assicurarsi di inserire solo i comandi da eseguire in un file srcsrv.ini. Eventuali tentativi di eseguire un comando non presente nel file srcsvr.ini causerà la visualizzazione di una finestra di dialogo di conferma. Per altre informazioni, vedere Security Warning: Debugger Must Execute Untrusted Command.

    Poiché non viene eseguita alcuna convalida sui parametri dei comandi, prestare attenzione nell'utilizzare i comandi attendibili. Ad esempio, se è stato elencato cmd.exe in srcsrv.ini, un utente malintenzionato potrebbe specificare parametri in cmd.exe che lo renderebbero pericoloso.

    Selezionare questo elemento e gli elementi figlio desiderati. Consentire il server di origine per assembly di attendibilità parziale (solo gestito) ed eseguire sempre comandi server di origine non attendibili senza chiedere conferma può aumentare i rischi per la sicurezza.

    Enable source server options

Opzioni dei simboli del compilatore

Quando si compila un progetto dall'IDE di Visual Studio con la configurazione di compilazione di debug standard, i compilatori C++ e gestiti creano i file di simboli appropriati per il codice. È anche possibile impostare le opzioni del compilatore nel codice.

Per impostare le opzioni del compilatore per le configurazioni di compilazione in Visual Studio, vedere Impostare configurazioni di debug e versione.

Opzioni .NET

Compilare con /debug per creare un file con estensione pdb . È possibile compilare applicazioni con /debug:full o /debug:pdbonly. Se si usa l'opzione di compilazione /debug:full , verrà generato codice di cui è possibile effettuare il debug. Se si usa l'opzione di compilazione /debug:pdbonly, vengono generati file con estensione pdb ma non l'attributo DebuggableAttribute che indica al compilatore JIT che sono disponibili informazioni di debug. Usare /debug:pdbonly per generare file con estensione pdb per una build di rilascio che non si vuole sottoporre a debug. Per altre informazioni, vedere /debug (Opzioni del compilatore C#) o /debug (Visual Basic).

Opzioni C/C++

  • File VC<x.pdb> e <project.pdb>

    Quando si compila con /ZI o /Zi, viene creato un file con estensione pdb per C/C++. In Visual C++, l'opzione /Fd denomina il file con estensione pdb creato dal compilatore. Quando si crea un progetto in Visual Studio usando l'IDE, l'opzione /Fd viene impostata per creare un file con estensione pdb denominato< project.pdb>.

    Se si compila l'applicazione C/C++ usando un makefile e si specifica /ZI o /Zi senza usare /Fd per specificare un nome file, il compilatore crea due file con estensione pdb :

    • VC<x.pdb>, dove <x> rappresenta la versione del compilatore Microsoft C++, ad esempio VC11.pdb

      Il file VC<x.pdb> archivia tutte le informazioni di debug per i singoli file oggetto e si trova nella stessa directory del makefile del progetto. Ogni volta che crea un file oggetto, il compilatore C/C++ unisce le informazioni di debug in VC x.pdb>.< Pertanto, anche se ogni file di origine include file di intestazione comuni, ad <esempio windows.h>, i typedef di tali intestazioni vengono archiviati una sola volta, anziché in ogni file oggetto. Queste includono informazioni sui tipi ma non sui simboli, ad esempio sulle definizioni delle funzioni.

    • <project.pdb>

      Il <file project.pdb> archivia tutte le informazioni di debug per il file exe del progetto e risiede nella sottodirectory \debug. Il file project.pdb> contiene informazioni di debug complete, inclusi i prototipi di funzione, non solo le informazioni sul tipo trovate in VC<x.pdb>.<

    Entrambi i file VC<x.pdb> e <project.pdb> consentono aggiornamenti incrementali. Il linker incorpora anche il percorso dei file con estensione pdb nel file con estensione exe o DLL creato.

  • Tabelle di esportazione DLL

    Usare dumpbin /exports per visualizzare i simboli disponibili nella tabella di esportazione di una DLL. Le informazioni simboliche dalle tabelle di esportazione DLL possono essere utili per l'uso di messaggi di Windows, procedure Windows (WindowProcs), oggetti COM, marshalling o qualsiasi DLL per cui non si dispone di simboli. I simboli sono disponibili per tutte le DLL di sistema a 32 bit. Le chiamate sono elencate nell'ordine di chiamata, con la funzione corrente (al più alto livello di annidamento) all'inizio dell'elenco.

    Leggendo l'output dumpbin /exports , è possibile visualizzare i nomi esatti delle funzioni, inclusi i caratteri non alfanumerici. La visualizzazione dei nomi di funzione esatti è utile per impostare un punto di interruzione su una funzione, perché i nomi delle funzioni possono essere troncati altrove nel debugger. Per altre informazioni, vedere dumpbin /exports.

Applicazioni Web

Impostare il file web.config dell'applicazione ASP.NET sulla modalità di debug. Tramite la modalità di debug, ASP.NET genera simboli per i file generati dinamicamente e il debugger si collega all'applicazione ASP.NET. Visual Studio imposta automaticamente questa impostazione all'avvio del debug, se il progetto è stato creato dal modello di progetti Web.

Caricare i simboli durante il debug

È possibile usare moduli, stack di chiamate, variabili locali, auto o qualsiasi finestra Espressioni di controllo per caricare simboli o modificare le opzioni dei simboli durante il debug. Per altre informazioni, vedere Acquisire familiarità con il modo in cui il debugger si collega all'app.

Usare i simboli nella finestra Moduli

Durante il debug, nella finestra Moduli vengono visualizzati i moduli di codice che il debugger considera come codice utente o My Code e il relativo stato di caricamento dei simboli. È anche possibile monitorare lo stato di caricamento dei simboli, caricare i simboli e modificare le opzioni dei simboli nella finestra Moduli .

Per monitorare o modificare le posizioni o le opzioni dei simboli durante il debug:

  1. Per aprire la finestra Moduli, durante il debug, selezionare Debug>moduli Windows>(o premere CTRL + ALT + U).
  2. Nella finestra Moduli fare clic con il pulsante destro del mouse sulle intestazioni Stato simbolo o File di simboli o su qualsiasi modulo.
  3. Dal menu di scelta rapida scegliere una delle opzioni seguenti:
Opzione Descrizione
Carica simboli Viene visualizzato per i moduli con simboli ignorati, non trovati o non caricati. Tenta di caricare i simboli dalle posizioni specificate nella pagina Opzioni>simboli di debug.> Se il file di simboli non viene trovato o non caricato, avvia Esplora file in modo da poter specificare un nuovo percorso da cercare.
Informazioni sul caricamento simboli Mostra il percorso di un file di simboli caricato o i percorsi cercati se il debugger non riesce a trovare il file.
Impostazioni simboli Apre la pagina Opzioni>Debug>simboli, in cui è possibile modificare e aggiungere posizioni dei simboli.
Caricare sempre automaticamente Aggiunge il file di simboli selezionato all'elenco di file caricati automaticamente dal debugger.

Usare le pagine No Symbols Loaded/No Source Loaded

Esistono diversi modi per suddividere il debugger nel codice che non dispone di file di simboli o di origine disponibili:

  • Eseguire l'istruzione nel codice.
  • Suddividere il codice da un punto di interruzione o un'eccezione.
  • Passare a un thread diverso.
  • Modificare lo stack frame facendo doppio clic su un frame nella finestra Stack di chiamate.

In questo caso, il debugger visualizza le pagine Nessun simbolo caricato o Nessuna origine caricata per trovare e caricare i simboli o l'origine necessari.

No Symbols Loaded page

Per usare la pagina del documento No Symbols Loaded (Nessun simbolo caricato) per trovare e caricare simboli mancanti:

  • Per modificare il percorso di ricerca, selezionare un percorso non selezionato oppure selezionare Nuovo percorso o Nuovo percorso VSTS e immettere o selezionare un nuovo percorso. Selezionare Carica per cercare di nuovo i percorsi e caricare il file di simboli se viene trovato.
  • Per eseguire l'override di tutte le opzioni dei simboli e ripetere i percorsi di ricerca, selezionare Sfoglia e trovare <il nome> eseguibile. Il file di simboli viene caricato se viene trovato o Esplora file si apre in modo da poter selezionare manualmente il file di simboli.
  • Per aprire la pagina delle impostazioni dei simboli per configurare il comportamento, selezionare Cambia simbolo Impostazioni (o scegliere Opzioni>Debug>simboli).
  • (Avanzate) Per visualizzare il disassembly in una nuova finestra una volta, selezionare visualizza disassembly oppure selezionare La finestra di dialogo Opzioni per impostare l'opzione per visualizzare sempre il disassembly quando non vengono trovati file di origine o simboli. Per altre informazioni, vedere Visualizzare il codice disassembly.
  • Per visualizzare i percorsi ricercati e il risultato, espandere Informazioni sul caricamento dei simboli.
  • Per il codice C#, è anche possibile scegliere di decompilare il codice sorgente dalle pagine Nessun simbolo caricato o Nessuna origine caricata.

Se il debugger trova il file con estensione pdb dopo l'esecuzione di una delle opzioni e può recuperare il file di origine usando le informazioni nel file con estensione pdb , viene visualizzata l'origine. In caso contrario, viene visualizzata una pagina Nessuna origine caricata che descrive il problema, con collegamenti ad azioni che potrebbero risolvere il problema.

Per aggiungere percorsi di ricerca file di origine a una soluzione:

È possibile specificare i percorsi cercati dal debugger i file di origine ed escludere file specifici dalla ricerca.

  1. Selezionare la soluzione in Esplora soluzioni, quindi selezionare l'icona Proprietà, premere ALT+INVIO oppure fare clic con il pulsante destro del mouse e scegliere Proprietà.

  2. Selezionare Debug file di origine.

    Debug source files page

  3. In Directory contenenti il codice sorgente digitare o selezionare i percorsi del codice sorgente da cercare. Usare l'icona Nuova riga per aggiungere altre posizioni, le icone freccia su e giù per riordinarle o l'icona X per eliminarle.

    Nota

    Il debugger cerca solo la directory specificata. È necessario aggiungere voci per qualsiasi sottodirectory da cercare.

  4. In Non cercare questi file di origine digitare i nomi dei file di origine da escludere dalla ricerca.

  5. Selezionare OK o Applica.