Formazione
Percorso di apprendimento
Eseguire il debug di applicazioni console C# (Introduzione a C#, Parte 6) - Training
Eseguire il debug di applicazioni console C# (Introduzione a C#, Parte 6)
Questo browser non è più supportato.
Esegui l'aggiornamento a Microsoft Edge per sfruttare i vantaggi di funzionalità più recenti, aggiornamenti della sicurezza e supporto tecnico.
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:
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:
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
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.
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:
Cartella del progetto.
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.
La stessa cartella del file DLL o .exe.
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.
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.
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:
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.
In Visual Studio, aprire Strumenti>Opzioni>Debug>Simboli (o Debug>Opzioni>Simboli).
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,
strumenti
strumenti
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:
Selezionare l'icona icona nella barra degli strumenti.
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 -.
(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.
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.
Selezionare OK.
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:
È 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:
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.
È 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
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.
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.
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).
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.
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.
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.
È 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.
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:
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. |
Esistono diversi modi per il debugger di intervenire nel codice che non dispone di file di simboli o di origine.
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.
Per utilizzare la pagina del documento Nessun simbolo caricato per trovare e caricare simboli mancanti:
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.
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à.
Selezionare Eseguire il debug dei file di origine.
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.
In Non cercare questi file sorgente, inserire i nomi dei file sorgente da escludere dalla ricerca.
Selezionare OK o Applica.
Formazione
Percorso di apprendimento
Eseguire il debug di applicazioni console C# (Introduzione a C#, Parte 6) - Training
Eseguire il debug di applicazioni console C# (Introduzione a C#, Parte 6)