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.
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.
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.
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.
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.
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.
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.
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.
Ö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.
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.
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.
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