Introduzione
Come molti di voi sapranno, ASP.NET MVC 4 è
open source e il suo codice sorgente è liberamente disponibile su
CodePlex.
Scaricarlo e analizzarlo e può risultare indubbiamente utile per guardare come sono state implementate alcune delle classi che ci interessano o anche solo per capire qualcosa di più sulla struttura del framework.
Nel mio caso, ad esempio, è risultato molto utile osservare direttamente il codice per vedere come l’attributo
HandleError restituisse automaticamente la view
Error in caso di errore.
Alle volte però potrebbe risultare ancora più utile entrare direttamente nel sorgente a
runtime per vedere quali operazioni vengono eseguite, guardare o modificare i valori delle variabili e saltare da una parte all’altra del codice.
Oggi vi mostrerò quindi come effettuare il debug di un’applicazione web all’interno del codice sorgente di ASP.NET MVC 4
senza bisogno di scaricare e compilare tutto il progetto da CodePlex.
Per fare questo utilizzeremo i server di
SymbolSource che mette a disposizione pubblicamente i
simboli PDB per effettuare il
debug remoto con Visual Studio.
I file PDB vengono creati automaticamente quando il codice viene compilato in modalità
debug e contengono proprio le informazioni necessarie per effettuare il debug del codice a runtime. Solitamente questi file non vengono inclusi quando scarichiamo le DLL di una libreria esterna; quindi per avere i file PDB di una libreria esterna (in questo caso ASP.NET MVC 4) esistono due modi:
- Scaricare e compilare il codice sorgente della libreria (se disponibile)
- Utilizzare SymbolSource
Se volete saperne di più sui file PDB potete leggere
questo post.
Configurazione di Visual Studio
Per cominciare è necessario configurare Visual Studio affinchè possa collegarsi al server da cui scaricare i file PDB.
Per farlo bisogna seguire i seguenti passi:
- Andare in Tools -> Options -> Debugger -> General
- Togliere la spunta da Enable Just My Code (Managed Only)
- Togliere la spunta (se presente) da Enable .NET Framework source stepping
- Mettere la spunta a Enable source server support
- Togliere la spunta da Require source files to exactly match the original version
La schermata delle opzioni dovrebbe apparire così:
Adesso è necessario
impostare i server da cui scaricare i file PDB:
- Andare in Tools -> Options -> Debugger -> Symbols
- Al momento dovrebbe essere presente solo la voce Microsoft Symbol Servers
- Fare clic sull’icona con a destra del punto esclamativo per aggiungere i seguenti indirizzi:
- http://referencesource.microsoft.com/symbols
- http://srv.symbolsource.org/pdb/Public
- http://srv.symbolsource.org/pdb/MyGet
- http://msdl.microsoft.com/download/symbols
- Se non presente, selezionare una cartella per la cache: nel mio caso è impostata su C:\Users\Luca\AppData\Local\Temp\SymbolCache
La schermata dovrebbe apparire più o meno così:
Per ultima cosa è necessario
specificare le DLL che si vogliono caricare, altrimenti verranno caricati tutti i moduli e il debug diventerà lentissimo.
In questo caso siamo interessati soltanto al debug di ASP.NET MVC, perciò spuntiamo l’opzione
Only specified modules, facciamo clic su
Specify modules e inseriamo
System.Web.Mvc.dll:
Premiamo OK e usciamo dalle opzioni.
A questo punto abbiamo quasi finito e non ci resta che aprire o creare un’applicazione ASP.NET MVC 4, posizionare un breakpoint e avviare il debug con
Debug -> Start Debugging.
Se tutto quanto è andato per il meglio, nella finestra
Call Stack dovreste vedere i moduli di ASP.NET MVC caricati (
in nero e non in grigio chiaro):
Adesso andando in
Debug -> Step Into su un’istruzione di ASP.NET MVC
entreremo direttamente nel codice sorgente del framework, con tanto di commenti al codice!
Aiuto, non funziona!
Se per caso durante il debug i moduli appaiono ancora in grigio chiaro e non riuscite a entrare nel sorgente del framework, potete provare diverse soluzioni:
Controllate di aver eseguito tutti i passaggi e di aver spuntato tutte le suddette opzioni. In particolare controllate di aver tolto la spunta a
Require source files to exactly match the original version e di aver inserito gli indirizzi di SymbolSource nell’ordine giusto.
Provate a disinstallare e reinstallare
con NuGet il package di ASP.NET MVC 4 (mi raccomando, non dovete disinstallare il programma!).
Se ancora non riuscite a far funzionare il debugger, c’è un ultima soluzione che ha funzionato egregiamente su uno dei miei computer.
Sembra infatti che in alcuni casi le DLL presenti nella
GAC (Global Assembly Cache) impediscano a Visual Studio di caricare i PDB dal server remoto di SymbolSource.
Reinstallare completamente ASP.NET MVC purtroppo
non è servito nel mio caso (ho solo perso molto tempo) ma ho risolto nel seguente modo:
- Andare in C:\Windows\Microsoft.NET\assembly\GAC_MSIL
- Trovare la cartella System.Web.Mvc
- Rinominarla con un altro nome, ad esempio _System.Web.Mvc
In questo modo la DLL non verrà cercata nella GAC permettendovi di collegarvi al server di SymbolSource per scaricare i file PDB.