Thursday, January 31, 2013

Debug nel codice sorgente di ASP.NET MVC 4

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.


Benvenuti nel mio blog

Benvenuti in questo blog dedicato a due delle mie passioni preferite: la programmazione e la cucina.

In effetti è un abbinamento alquanto strano e non sarà facile cercare di inserire contenuti di qualità per entrambi.

Diciamo che non pubblicherò ricette molto sofisticate ma saranno abbastanza facili e veloci da realizzare! I post di informatica invece spazieranno dalla programmazione .NET a Ruby on Rails, da Windows a Xubuntu.

Per quanto riguarda me, sono un programmatore web con una grande passione per l'informatica. Attualmente lavoro in un'azienda come sviluppatore .NET ma nel tempo libero mi piace esplorare sempre nuovi linguaggi e tecnologie.

Diamo inizio a questa piccola avventura!