Visual Studio 2008 RTM sürümü çıktığı zaman, .NET Framework Library kaynak kodlarının yakın zamanda açılacağını ve Visual Studio 2008 ile debug edilebileceğini daha önceki blog'umda sizlerle paylaşmıştım. Geçtiğimiz haftalarda bu kaynak kodları yazılım geliştiricilere açıldı. 26 Ocak'ta Microsoft'ta yaptığımız Yeni Microsoft Teknolojileri etkinliğinde bu konu ile ilgili bir demo çalışması yapmak istiyordum fakat internet olmadığı için yapamamıştık. Bu yazıda konu ile ilgili bilgileri sizlerle paylaşacağım ve step step Visual Studio 2008'de .NET Framework kaynak kodlarını nasıl debug edebileceğinizi anlatıyor olacağım.

Öncelikle Microsoft'u böyle bir atılımda bulunduğu için tebrik etmek gerekiyor. Profesyonelce yazılmış ve programlama dilinin özelliklerini doğru bir şekilde kullanılmış olan bu kütüphanelerin açılması, yazılım geliştiriciler için çok büyük bir deneyim olacaktır. Lutz Roeder'in yazmış olduğu Reflector ya da sevgili Özcan Değirmenci'nin yazmış olduğu Fox Decompiler ile bu kaynak kodları görmemiz zaten mümkündü. Ancak, yazdığımız kodda atılan herhangi bir istisnanın(exception) ya da hatanın kaynağına giderek debug yapma imkanını yakalamış olduk. Yani kodu görmekten çok debug etmek kendi kodumuzla entegreli bir şekilde bu kodları görmek bu işi daha güzel kılıyor. Daha iyi ve kaliteli kod yazmak için bu kodlar yazılım geliştiricilere iyi bir referans olacaktır diye düşünüyorum.

Şuan itibariyle .NET Framework'de bulunan kütüphanelerin hepsi malesef açılmadı. Debug edebileceğimiz kütüphaneler;

  • NET Base Class Libraries (System, System.CodeDom, System.Collections, System.ComponentModel, System.Diagnostics, System.Drawing, System.Globalization, System.IO, System.Net, System.Reflection, System.Runtime, System.Security, System.Text, System.Threading...)
  • ASP.NET (System.Web, System.Web.Extensions)
  • Windows Forms (System.Windows.Forms)
  • Windows Presentation Foundation (System.Windows)
  • ADO.NET and XML (System.Data and System.Xml)

Not: WCF, Workflow ve LINQ gibi yeni teknolojilerin kütüphaneleri de zaman içinde paylaşıma açılacak.

Not: Kaynak kodları Microsoft Reference lisansı altında dağıtılıyor.

Çalışma Mekanizması

Sistemin çalışma mekanizması aslında çok basit. Gerekli ayarlar yapıldıktan sonra ki bunlar; Remote debugging desteğinin aktif edilmesi ve yüklenecek olan sembollerin local'de tutulacağı yerin belirlenmesi ile .NET Framework kodlarının debug edilebilmesi mümkün oluyor.

Debugging işlemi başladıktan sonra, debug edilmek istenen dll dosyası debug modundayken seçiliyor ve Visual Studio localde tuttuğu dosyada bu dll'lerin sembollerine bakıyor. Eğer cachde varsa, sembollerin Microsoft'un sunucusundan indirmeden kullanıcının kullanımına açıyor. Eğer cache dosyada semboller yoksa, sunucudan dosya indiriliyor. Daha sonra debug işlemi F11 ile sanki kendi kodunuzu debug edermiş gibi devam ediyor.

 netlibrarydebug11

Ayarlar ve Kurulum

Not: Yapılacak olan ayarlar ve kurulumlar malesef Visual Studio Express sürümlerinde desteklenmiyor.

Step 1 - Patch Dosyasının Yüklenmesi (Remote Debugger)

İlk olarak açılan .NET Framework kütüphanelerini debug edebilmemiz için Remote Debugger için dosya yuklememiz gerekiyor. Bu dosyayı bu adresten indirebilirsiniz. Dosya 32-bit ve 64-bit sistemleri destekliyor.

Not: Eğer 64-bit Vista kullanıyorsanız kurulumla ilgili manual bir ayarlama yapmanız gerekiyor. Bu ayarlara dosyanın bulunduğu adresten bakabilirsiniz.

netlibrarydebug1

Step 2 - VS2008 Ayarları

Yukarıdaki kurulumu başarıyla tamamladıktan sonra Visual Studio 2008'i açarak açılan bu kütüphanelerin yüklenmesi ve debug edilmesi için gerekli ayarları yapıyoruz.

 Tools->Options-Debugging->General sekmesinden "Enable Just My Code (Managed Only)" seçeneğinin tik işaretini kaldırıyoruz. "Enable source server support" seçeneğini işaretliyoruz.

netlibrarydebug2

Bu ayarları yaptıktan sonra Visual Studio 2008 ile remote debugging özelliğini aktif hale getirmiş bulunuyoruz. Ama önemli taraf ise yapacağımız debug işleminde kullanılacak sembollerin yüklenmesi ve referans gösterilmesi. Yani bir debug işlemi yapacaksak, o debug işleminde kullanılacak olan kodların (.NET Framework kütüphanesi kaynak kodları) local olarak bilgisayarda indirileceği yeri göstermemiz gerekiyor.

Tools->Options-Debugging->Symbols sekmesinden sembolleri download edeceğimiz adresi ekliyoruz. Bu adres içinde http://referencesource.microsoft.com/symbols adresini giriyoruz. Daha sonra sembollerin localde tutulacağı yeri belirtiyoruz. (C:\Users\useradi\Symbols klasörünü girebilirsiniz.) Burda dikkat edilecek nokta, girdiğiniz klasorun write hakkının olmasıdır. Çünkü referanstan alınan dosyalar buraya indirilecek, eğer write hakkı olmazsa sorun çıkıcaktır. Buna dikkat edin. Son olarak "Search the above locations only when symbols are loaded manually" kutucuğunu işaretleyerek ayarlarımızı tamamlamış oluyoruz.

netlibrarydebug3

Debugging

Yaptığımız kurulum ve ayarlardan sonra artık sıra geldi debug işlemine :) Aşağıdaki gibi bir kod parçasını debug edelim. Breakpoint'i koyduktan sonra uygulamayı çalıştıralım.

netlibrarydebug4

Uygulamamız çalıştığında, breakpoint'i koyduğumuz ilgili yere gelince "Call Stack" penceresinde bu uygulama için yüklenen dll'ler görünecektir. Dikkat ederseniz gri renktedirler. Sadece kendi uygulamamız siyah renkte gozukuyor. Debug etmek istediğimiz dll dosyasına sağ tıklayıp "Load Symbols" diyoruz. Bu noktadan sonra belirli bir zaman bekleyeceğiz. Kaynak dosya daha önce belirttiğimiz serverdan indirilecektir.

Not: Bu dosyalar cache olarak sizin lokalde verdiğiniz klasorde tutulacağı için her seferinde sunucudan indirilmezler.

netlibrarydebug5

Dll boyutları 1mb,10mb gibi büyük dosyalar olduğundan beklemeniz uzun surebilir. Yüklendikten sonra gri renkteki dll, artık siyah olacaktır.

netlibrarydebug6

Yükleme işlemi bittikten sonra istenen dll'e çift tıkladığınızda artık debug işlemine başlayabiliriz. Aslında çift tıklama ile(F11) 'e basıp .NET Framework kütüphanesinin kodlarına erişmiş oluyoruz.

Örneğimize bakarsak, System.Windows.Forms.dll'deki Form sınıfının içindeki Text özelliğine girerek set işlemini yaptığını anlayabiliriz.

netlibrarydebug7 

Önemli Notlar

Otomatik Sembol Yükleme

Bazen sembolleri çalışma zamanında tek tek yuklemek yerine, dll'in tamamını yüklemek isteyebilir ve hatta daha uygulamayı çalıştırmadan, .NET Framework'de bulunan bir sınıfın kaynak dosyasında breakpoint koymak isteyebilirsiniz. Bunun için Modules penceresine giderek (CTRL+ALT+U) istediğiniz dll'e sağ tıklayıp "Load Symbols" yapabilirsiniz.(Debug modundayken) Böylelikle debug işlemi başladığı zaman bu dll yüklü olarak kullanıma hazır hale gelir. Semboller otomatik olarak local'de belirttiğiniz klasore indirilecektir.

netlibrarydebug8

Tüm bu kütüphanelerin otomatik olarak yüklenmesini isteyebilirsiniz. Çünkü debug işleminde her seferinde sembol yuklemektense bir kerede yükleyip debug zamanını düşürebilirsiniz. 50mb civarındaki kütüphane localde belirttiğiniz klasore indirilir ve debug işleminizi bekleme yapmadan yapabilirsiniz.

Eğer tüm dll'leri otomatik olarak yüklenmesini istiyorsanız, Debugger'ı çalıştırıp, Tools->Options->Debugging->Symbols sekmesinden "Search from the above locations only when symbols are loaded manually" seçeneğini kaldırın.

netlibrarydebug9

Son olarak debug modundan çıkıp, Symbol File Location kısmındaki kutucuğun check'ini kaldırırsanız işlem tamamlanmış olacaktır.

netlibrarydebug10

Artık Modules kısmına baktığınız zaman diğer bazı dll'lerinde yuklenmiş olduğunu göreceksiniz.

EULA

Eğer ilk defa bir dll'i yüklüyorsanız karşınıza EULA sözleşmesi çıkacaktır,"Accept" dedikten sonra yükleme başlayacaktır. Diğer yüklediğiniz assembly dosyaları için EULA karşınıza sürekli çıkmaz.

Şuan debug edilebilir DLL dosyaları;

  • Mscorlib.DLL
  • System.DLL
  • System.Data.DLL
  • System.Drawing.DLL
  • System.Web.DLL
  • System.Web.Extensions.DLL
  • System.Windows.Forms.DLL
  • System.XML.DLL
  • WPF (UIAutomation*.dll, System.Windows.DLL, System.Printing.DLL, System.Speech.DLL, WindowsBase.DLL, WindowsFormsIntegration.DLL, Presentation*.dll)
  • Microsoft.VisualBasic.DLL

İlgili Kaynaklar

Scott Hanselman's Blog

.NET Framework Library Code Available for Viewing

Hanselminutes Podcast 83 - Microsoft to release .NET Framework Libraries Source

Scott Guthrie's Blog

Releasing the Source Code for the .NET Framework Libraries

.NET Framework Library Source Code now available

Shawn Burke's Blog

Configuring Visual Studio to Debug .NET Framework Source Code

John Robbins' Blog

Additional .NET Framework Source Code Debugging Tricks

Channel 9