Condividi tramite


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

File di database del programma (.pdb), detti anche file dei simboli, collegano gli identificatori e le dichiarazioni 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 di debug e sullo stato 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 interrompere l'app per un punto di arresto.

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 .pdb che corrispondono esattamente ai file .pdb creati durante la compilazione di un'app, ovvero i file .pdb originali o le loro copie. Questa duplicazione esatta è necessaria perché il layout delle app può cambiare anche se il codice stesso non è stato modificato. Per altre informazioni, vedere Perché Visual Studio richiede che i file di simboli del debugger corrispondano esattamente ai file binari con cui sono stati compilati?

Suggerimento (assuming the context is advice or a hint)

Per eseguire il debug di codice all'esterno del codice sorgente del progetto, ad esempio codice windows o codice di terze parti, è necessario specificare il percorso del codice esterno file con estensione pdb (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. La posizione specificata all'interno della DLL o del file eseguibile (.exe).

    Per impostazione predefinita, se è stata compilata una DLL o un file .exe nel computer, il linker inserisce il percorso completo e il nome file del file con estensione pdb a ssociato file nella DLL o .exe file. Il debugger verifica se il file di simboli esiste in quel 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 dei simboli locale.

    • Se selezionati, i server di simboli di rete, Internet o locali, come ad esempio i server di simboli Microsoft. Visual Studio può scaricare i file di simboli di debug dai server di simboli che implementano il protocollo symsrv. Visual Studio Team Foundation Server e gli strumenti di debug per Windows sono due strumenti che possono usare 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 necessario file .pdb. I file di con estensione pdb di sistema contengono simboli per DLL di Windows, file di .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 simbolo in una rete interna o nel computer locale: il team o l'azienda può creare server di simboli per i propri prodotti e come cache per i simboli provenienti da origini esterne. Potrebbe essere disponibile un server di simboli nel proprio computer.

      Server di simboli di terze parti: I provider di terze parti di applicazioni e librerie Windows possono fornire accesso ai server dei simboli su Internet.

Avvertimento

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

Il debugger, per impostazione predefinita, controlla varie posizioni per i simboli. Vedere Dove il debugger cerca i simboli.

Nella pagina Tools>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 di.

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

Nota

Queste opzioni sono state aggiornate in Visual Studio 2022 versione 17.12 Preview 1.

  1. In Visual Studio, aprire Strumenti>Opzioni>Debug>Simboli (o Debug>Opzioni>Simboli).

  2. In percorsi dei file di simboli (con estensione .pdb),

    • Per utilizzare il server di simboli Microsoft o il server simboli di NuGet.org , selezionare la casella di selezione.

    • 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. Il completamento della frase aiuta a trovare il formato corretto.

    strumenti - Opzioni - Debug - Pagina Simboli

    strumenti - Opzioni - Debug - Pagina Simboli

    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 Strumenti/Opzioni/Debugging/Simboli - nuova icona del server icona nella barra degli strumenti.

      2. Nella finestra di dialogo Connetti al server di simboli di Azure DevOps, scegliere uno dei server di simboli disponibili e selezionare Connettersi.

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

    • Per modificare l'ordine di caricamento per le posizioni dei simboli, usare Control+Su e Control+Giùoppure le icone a forma di freccia Su e in Giù.

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

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

  3. (Facoltativo) Per migliorare le prestazioni di caricamento dei simboli, sotto cache dei simboli in questa directory, inserire il percorso di una 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/scrittura.

Nota

Se è impostata la variabile di ambiente _NT_SYMBOL_PATH, esegue l'override del valore impostato in simboli cache in questa directory.

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

    • Selezionare Scegliere automaticamente i simboli del modulo da cercare (scelta consigliata) per consentire a Visual Studio di decidere quali simboli cercare e caricare. Per impostazione predefinita, Visual Studio carica automaticamente i simboli compilati dalla soluzione aperta e carica eventuali simboli aggiuntivi necessari per eseguire operazioni di debug comuni. In questo modo si riduce il numero di file che devono essere cercati e caricati da Visual Studio, migliorando così le prestazioni del debugger. È possibile forzare il caricamento di simboli aggiuntivi facendo clic sul collegamento Specifica filtri modulo.

    • Selezionare Cerca tutti i simboli del modulo, a meno che non siano esclusi per forzare Visual Studio a caricare tutti i simboli nel processo di debug. Questa operazione non è consigliata perché potrebbe rallentare l'esperienza di debug. Quando si seleziona questa opzione, è possibile forzare Visual Studio a ignorare determinati simboli facendo clic sul collegamento Specifica i filtri modulo.

    • Selezionare Carica tutti i moduli, a meno che non siano esclusi (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 Caricare solo i moduli specificati. Selezionare Specificare i 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.

  2. Selezionare OK.

Specificare i filtri dei moduli

Entrambe le opzioni Scegliere automaticamente i simboli del modulo da cercare e Cercare tutti i simboli di modulo, a meno che esclusi consentono di avere un maggiore controllo sui simboli cercati durante il debug. Scegliere Specificare i filtri del modulo per ottimizzare l'esperienza.

Per impostazione predefinita, viene visualizzata la finestra di dialogo seguente quando Scegliere automaticamente i simboli del modulo da cercare è selezionato:

Screenshot della specifica dei filtri dei moduli.

È possibile aggiungere un modulo al filtro usando l'icona '+'. I filtri dei moduli supportano semplici corrispondenze con i caratteri jolly. Un '*' corrisponde a qualsiasi gruppo di caratteri. Ad esempio, '*myproduct*' corrisponderà a file come 'myproduct.utilities.dll' e 'entrypoint.myproduct.exe', tra gli altri.

Sono disponibili diverse opzioni aggiuntive per personalizzare ulteriormente l'esperienza:

  • i simboli di caricamento sempre presenti accanto ai moduli indica a Visual Studio di caricare file pdb archiviati nel file system accanto ai file .dll o .exe corrispondenti. Può essere utile, ad esempio, quando si tenta di eseguire il debug di un'app Web distribuita.

  • Caricare automaticamente simboli aggiuntivi quando necessario istruisce Visual Studio a cercare simboli per eseguire azioni di debug comuni, come passare attraverso il codice, anche se il modulo a cui si passerà non è incluso nel progetto o nel filtro dei moduli. Il modo in cui la ricerca è determinata potrebbe essere influenzata dalle impostazioni Just My Code.

Se è stata selezionata Cerca tutti i simboli del modulo, a meno che non siano esclusi, la finestra di dialogo del filtro del modulo sarà simile alla seguente:

Screenshot della selezione dei moduli esclusi.

In questa finestra di dialogo è possibile scegliere i moduli per cui si non si vuole che Visual Studio carichi i simboli. In questo scenario Visual Studio tenta di caricare i simboli per ogni modulo nelle procedure di debug (inclusi i moduli di terze parti), a meno che non si aggiunga un filtro corrispondente per escluderli. L'unico modo in cui questo comportamento verrà modificato è dalle impostazioni Just My Code.

Altre opzioni di simboli per il debug

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

  • Caricare le esportazioni DLL (solo sistema 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 il disassemblaggio se l'origine non è disponibile

    Mostra sempre il codice assembly quando non vengono trovati i file di origine o i simboli.

    opzioni di /Debug/Opzioni di disassembly generali

  • Abilitare 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 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 .pdb dell'app. Il file .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 .pdb dell'app elencando i comandi consentiti in un file denominato srcsrv.ini. Posizionare il file di srcsrv.ini nella stessa cartella di srcsrv.dll e devenv.exe.

    Importante

    I comandi arbitrari possono essere incorporati nel file .pdb di un'app, quindi assicurarsi di inserire solo i comandi da eseguire in un file srcsrv.ini. Qualsiasi tentativo di eseguire un comando non presente nel file srcsvr.ini causerà la visualizzazione di una finestra di dialogo di conferma. Per altre informazioni, vedere Avviso di sicurezza: Il debugger deve eseguire un comando non attendibile.

    Non viene eseguita alcuna convalida sui parametri di comando, quindi prestare attenzione ai comandi attendibili. Ad esempio, se sono elencati cmd.exe nel srcsrv.ini, un utente malintenzionato potrebbe specificare parametri in cmd.exe che lo renderebbero pericoloso.

    Selezionare questo elemento e gli elementi figlio desiderati. Consenti server di origine per assembly di attendibilità parziale (solo gestiti) e eseguire sempre comandi server di origine non attendibili senza richiedere possono aumentare i rischi per la sicurezza.

    Abilita le opzioni del server di origine

Opzioni dei simboli del compilatore

Quando si compila un progetto dall'IDE di Visual Studio con la configurazione di compilazione standard Debug, i compilatori C++ e quelli gestiti (managed) creano i file di simboli appropriati per il tuo 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. La compilazione con /debug:full genera codice di debug. La compilazione con /debug:pdbonly genera file con estensione pdb, ma non genera la DebuggableAttribute che indica al compilatore JIT che le informazioni di debug sono disponibili. Usare /debug:pdbonly se si desidera generare file con estensione pdb per una build di rilascio che non deve essere sottoposta a debug. Per altre informazioni, vedere /debug (opzioni del compilatore C#) o /debug (Visual Basic).

Opzioni C/C++

  • VC<x>.pdb e <file di progetto>.pdb

    Quando si compila con /ZI o /Zi, viene creato un file di .pdb per C/C++ . In Visual C++, l'opzione /Fd denomina il file 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 <progetto>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 .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. Le informazioni inserite includono informazioni sul tipo, ma non includono informazioni sui simboli, ad esempio definizioni di funzione.

    • <progetto>.pdb

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

    Sia i file VC<x>.pdb che i file del progetto <>.pdb consentono aggiornamenti incrementali. Il linker incorpora anche il percorso ai file .pdb nel file .exe o .dll che crea.

  • 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 qualsiasi DLL di sistema a 32 bit. Le chiamate sono elencate nell'ordine di chiamata, con la funzione corrente (quella più annidata) in cima.

    Leggendo l'output dumpbin /exports, è possibile visualizzare i nomi di funzione esatti, 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. La modalità di debug fa sì che ASP.NET generi simboli per i file generati dinamicamente e consenta al debugger di collegarsi 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 i Moduli , Stack di chiamate, Locali, Autos, o qualsiasi finestra Watch 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, la finestra Moduli mostra i moduli di codice che il debugger considera come codice utente o Codice personale 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 i percorsi o le opzioni dei simboli durante il debug:

  1. Per aprire la finestra Moduli di, durante il debug selezionare Debug>Moduli di Windows> oppure premere CTRL + ALT + U).
  2. Nella finestra Moduli, fare clic con il pulsante destro del mouse sull'intestazione Stato del Simbolo o sull'intestazione File di Simboli o su qualsiasi modulo.
  3. Nel menu di scelta rapida selezionare una delle opzioni seguenti:
Opzione Descrizione
caricare 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>Debug>Simboli. Se il file di simboli non viene trovato o non caricato, avvia esplora file in modo da poter specificare un nuovo percorso di ricerca.
Informazioni sul Caricamento dei Simboli Mostra il percorso di un file di simboli caricato o i percorsi cercati se il debugger non riesce a trovare il file.
impostazioni dei simboli Apre la pagina Opzioni di debug >simboli>, in cui è possibile modificare e aggiungere posizioni dei simboli.
Sempre caricare automaticamente Aggiunge il file di simboli selezionato all'elenco di file caricati automaticamente dal debugger.

Usare le pagine Nessun Simbolo Caricato/Nessuna Fonte Caricata

Esistono diversi modi per il debugger di intervenire nel codice che non dispone di file di simboli o di origine.

  • Entra nel codice.
  • Entrare nel codice da un punto di interruzione o un'eccezione.
  • Passare a un thread diverso.
  • Modificare il frame dello stack 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 aiutarti a trovare e caricare i simboli o le origini necessari.

pagina Nessun simbolo caricato

Per utilizzare la pagina del documento 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 <nome eseguibile>. Il file di simboli viene caricato se viene trovato, o Esplora File viene aperto in modo da poter selezionare manualmente il file di simboli.
  • Per aprire la pagina delle impostazioni dei simboli per configurare il comportamento, selezionare Modifica impostazioni simbolo oppure scegliere Opzioni>Debugging>Simboli.
  • (Avanzate) Per visualizzare il disassembly in una nuova finestra una volta, selezionare visualizzazione disassemblyoppure selezionare 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 mostrare le posizioni ricercate e il risultato, espandere Informazioni di caricamento simbolo.
  • Per il codice C#, è anche possibile scegliere di decompilare il codice di origine dalle pagine Nessun simbolo caricato o Nessun codice caricato.

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

Per aggiungere percorsi di ricerca di 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 soluzionie quindi selezionare l'icona Proprietà, premere Alt+Inviooppure fare clic con il pulsante destro del mouse e selezionare Proprietà.

  2. Selezionare Eseguire il debug dei file di origine.

    pagina dei file sorgente per il debug

  3. In Directory contenenti il codice sorgente, digitare o selezionare le posizioni del codice sorgente da ricercare. Utilizzare l'icona Nuova Linea 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 tutte le sottodirectory che si desidera cercare.

  4. In Non cercare questi file sorgente, inserire i nomi dei file sorgente da escludere dalla ricerca.

  5. Selezionare OK o Applica.