Introduzione al debug

Il codice sorgente viene compilato ed eseguito nell'ambiente .NET Framework con un processo in due fasi. Il codice sorgente viene prima di tutto compilato in codice Microsoft Intermediate Language (MSIL) con un compilatore compatibile con .NET Framework, quale Visual Basic .NET o Visual C#. Il codice MSIL viene quindi compilato in codice nativo.

Il processo di debug viene eseguito, in sostanza, in senso inverso. Durante l'esecuzione del codice nel debugger viene innanzitutto eseguito il mapping del codice nativo al codice MSIL, quindi il codice MSIL viene ricollegato al codice sorgente utilizzando file database di programma (PDB). Per rendere possibile il debug, occorre pertanto generare le informazioni di mapping necessarie in ogni fase del processo di compilazione.

Ai fini del debug è necessario innanzitutto creare il file PDB tramite il quale viene eseguito il mapping del codice MSIL al codice sorgente. Durante lo sviluppo di componenti precompilati con Visual Basic .NET o Visual C# questa operazione viene specificata utilizzando l'opzione /debug. Quando invece si utilizzano pagine di codice sottostante in ASP.NET, questa operazione viene specificata con un'impostazione <compilation debug="true"/> nel file CONFIG dell'applicazione o del computer.

Il secondo passaggio necessario per il debug consiste nel richiedere al compilatore JIT da MSIL a codice nativo di creare informazioni relative al mapping tra il codice MSIL e il codice nativo. Per eseguire questa operazione, impostare l'attributo JITTracking nell'assembly. Questo attributo, che è essenzialmente un flag, viene impostato automaticamente quando si carica in un debugger un processo di cui occorre eseguire il debug. Se tuttavia il processo viene caricato e compilato con JIT al di fuori del debugger e il debugger viene connesso in seguito, sarà necessario impostare prima l'attributo utilizzando un'opzione del compilatore. In caso contrario non sarà possibile utilizzare il debugger connesso a un programma già in esecuzione per ricostruire il codice MSIL dal codice nativo, quindi proseguire con il mapping al codice sorgente nella sessione di debug corrente.

Anche se è possibile utilizzare Visual Studio .NET per le operazioni di compilazione e debug, è importante sapere che con un debugger, ad esempio CorDbg e DbgClr inclusi in .NET Framework SDK, non è possibile compilare codice MSIL. Se si utilizza un debugger autonomo, sarà necessario compilare il codice in MSIL utilizzando un compilatore distinto. È fondamentale tenere presente che se nel corso del processo di debug il codice sorgente viene modificato non sarà sufficiente ricaricare il file del codice sorgente, ma occorrerà ripetere la compilazione. ASP.NET rappresenta naturalmente un caso speciale: il codice sottostante delle pagine ASP.NET viene in effetti compilato in modo dinamico da ASP.NET utilizzando i compilatori da riga di comando presenti nella directory di runtime di .NET.

Opzioni del compilatore

In entrambi i compilatori per Visual C# e Visual Basic .NET è supportato lo stesso insieme di opzioni di debug. Anche se le combinazioni possibili sono apparentemente molte, in effetti sono supportate solo le tre configurazioni riportate di seguito.

  1. Non includere informazioni sul debug:
    • (nothing)
    • /debug-
  2. Creare un file database di programma (PDB):
    • /debug:pdbonly
  3. Creare un file PDB e impostare l'attributo JITTracking:
    • /debug
    • /debug+
    • /debug:full

Come già accennato in questa esercitazione, il processo di compilazione e debug avviene in due fasi. Se durante la fase di compilazione da codice sorgente a MSIL si utilizza un'opzione di debug qualsiasi, a eccezione di /debug-, verrà creato un file PDB. Con le altre opzioni, in particolare /debug, /debug+ e /debug:full, si otterrà lo stesso risultato: viene creato il file PDB e viene impostato l'attributo JITTracking per consentire il mapping dal codice nativo al codice sorgente quando si connette un debugger a un programma in esecuzione.

Vedere anche

Debug di applicazioni .NET Framework | Debug di applicazioni Web ASP.NET | Appendice A: ulteriori informazioni | Appendice B: debugger di runtime (CorDbg.exe)