Hata ayıklama ile ilgili olarak aldığım geri bildirimler sonrasında bu konuda önemli bilgi eksikliği olduğunu gördüm. Bu yüzden son kullanıcıda oluşan hataların ayıklanması konusuna biraz daha değinmek sanırım sizler açısından faydalı olacaktır. Tüm süreci tek bir kalemde sizlerle paylaşmanın çok verimli olmadığını düşünerek konuyu adım adım ele almaya karar verdim.
Son kullanıcıda alınan hataların ilk adımı tatbikî hata hakkında bilgi toplamak olmalıdır. Sorunu çözmeye yönelik olarak alınan her bir bilgi sizi sorunun temeline (dolayısıyla da çözüme) bir adım daha yaklaştıracaktır. Bu konuda alacağınız ilk geri bildirim kullanıcıdan gelecek olan hatanın hikayesi, hatanın nasıl gerçekleştiğine dair girdilerdir; fakat bu girdiler her zaman için tam ve yeterli olmayabilir. Bu sebeple iyi bir yazılım geliştirici, mümkünse, hata dökümüne ulaşarak daha detaylı veri toplamayı seçecektir. Bu makalemde bir yazılım geliştirici olarak bizlerin Debugging Tools for Windows içerisinde gelen ADPlus aracı ile hata dökümlerini ne şekilde alabileceğimizden bahsediyor olacağım.
Makalemin devamında hata ayıklama işlemini yapacağınız bilgisayar üzerinde Debugging Tools for Windows’un kurulu olduğunu varsayıyorum. Bu adresten indirebileceğiniz ve Windows SDK’nın bir parçası olarak gelen bu araçlar bizlere iki şekilde sunulmakta. İlk yöntemde küçük bir uygulama indirilerek bizlere kurulum seçenekleri sunulmakta ve seçimlerimiz doğrultusunda Microsoft sitesi üzerinden ilgili araçlar indirilerek kurulmakta. İkinci seçecekte ise tüm Windows SDK bizlere bir iso dosyası içerisinde sunulmakta. Makalemde sadece hata ayıklama araçlarına ihtiyacımız olacağından ilk yöntemi kullanarak Windows SDK’nın tamamını indirmek yerine sadece ihtiyacımız olan araçları indirmek daha mantıklı olacaktır. Bunun için Windows SDK sitesi üzerinden indireceğiniz winsdk_web.exe uygulamasını çalıştırarak gelen seçenekler arasından Common Utilities -> Debugging Tools for Windows ve Redistributable Packages -> Debugging Tools seçilmelidir. Bu kurulumlar ardından ihtiyacınız olan araçları C:\Program Files\Debugging Tools for Windows (x86) ya da 64bitlik sistemlerde C:\Program Files\Debugging Tools for Windows (x64) klasörü altında bulabilirsiniz.
ADPlus, Debugging Tools for Windows’un 188.8.131.523 sürümüne kadar bir vbscript betiği iken, bu sürümle birlikte yerini .net 2.0 ile yazılmış olan ADPlus.exe uygulamasına bırakmıştır; fakat .Net Framework’ün kurulu olmadığı sistemler de düşünülerek eski script dosyası adplus_old.vbs adıyla yine de dağıtım içerisinde varlığını sürdürmektedir. Bizim senaryomuzda sistemde .Net Framework’ün kurulu olduğunu kabul ederek güncel uygulama üzerinden makaleme devam ediyor olacağım.
ADPlus uygulamasını kullanarak farklı iki duruma göre bir işlemin dökümünü alırken iki yöntem kullanmaktadır;
Askı (Hang) modu : İşlemin/uygulamanın tam olarak çökmemiş, henüz tam anlamıyla bir hata oluşmamış olmasına karşın aşırı işlemci kullanımı, aşırı hafıza kullanımı, ekranda donma/kilitlenme yaşanması v.b. sendromların görülmesi durumunda tercih edilen bir moddur. ADPlus’ın hang moduyla başlatılması durumunda doğrudan tam hafıza dökümü yapılarak işlemin o andaki görüntüsü bir dosyaya kaydedilecek, alınan hizmet dökümleri ADPlus başlatılırken verilen çıktı klasörüne işlem adı, işlem id’si ve tarih damgasından oluşan bir dosya adıyla saklanacaktır. Doğru bir döküm alınabilmesi adına, bu döküm alınırken ilgili işlem/uygulama yanıt vermeyi keserek donacaktır. Döküm alındıktan sonra ise işlem/uygulama kaldığı yerden çalışmaya devam edecektir.
Hata/Çakılma (Crash) modu : İşlemin/uygulamanın beklenmeyen bir şekilde hata vererek çalışmasını durdurması, kendisini kapatması durumunda tercih edilen bir moddur. Crash moduyla başlatılan ADPlus uygulaması, işleminde hata oluşmasını bekleyerek hata olduğunda döküm alacaktır. Hang modundayken hatanın olduğu anın yakalanmasının ne kadar zor olduğunu düşünecek olursak tekrarlanabilen bir hata için Crash moduyla işlem dinlenirken hatayı yeniden oluşturmanın ne kadar işe yaracağını anlayabiliriz. Hang modundan farklı olarak ADPlus crash moduyla başlatıldığı gibi bir döküm almayarak uygulamanın aşağıda sıralanan hata türlerinden birisini fırlatmasını beklemekte, ardından uygulamanın işleyişini durdurarak döküm almaktadır.
Önemli bir not; ADPlus Crash moduyla bir işlemi izlemeye başladıktan sonra izleme kesildiğinde hang modundan farklı olarak işlemde durdurulacaktır.
ADPlus uygulamasının çalışmasını daha rahat görebilmek adına, bir önceki makalemde sizlerle paylaşmış olduğum solution içerisinde yer alan CRM uygulaması projesini kullanacağım.
Oldukça basit bir uygulama olan CRM uygulamamızda kullanıcıdan kaydı yapılacak olan müşteriye ait ad, soyad, yaş ve tc kimlik bilgileri alınarak bu bilgiler bir veritabanında kaydedilmekte. Örnek kodumuzu basit tutmak adına gerçek bir kayıt işlemi yapılmamakta.
CRM uygulaması koduna baktığınızda, gözle görülen bir hata bulunmamasına karşın yazılımcının öngörmediği değerler girilmesi durumunda uygulamada çalışma zamanı bir hata oluşması olasıdır. Uygulamada müşteri kaydının gerçekleştirildiği AnaEkran.cs dosyası içerisinde yer alan kaydet_Click fonksiyonu dikkat edilecek olursa hataya açık bir koddur. Dosya içerisindeki 29. ve 30. satırlarda kullanıcının müşterinin yaşını ve tc kimlik numarasını her zaman için integer türünden girileceği varsayımı yapılmış; fakat aksi bir veri girişini engelleyici bir önlem alınmamıştır. Böylesi bir durumda bu alanlara girilecek olan integer dışındaki girişlerde uygulama bu satırlarda hatalı duruma düşecektir.
Böylesi bir hata alınması durumunda yapılması gereken uygulamayı yeniden başlatarak hata alınmadan hemen önceki durumuna getirmek, ardından da ADPlus uygulamasını crash modunda başlatarak uygulamamızı izlemesini sağlamak olmalı. Sonrasında kullanıcıdan hatalı durumu yeniden oluşturmasını talep ederek ADPlus’un hata sırasında bir hata dökümü almasını sağlamalıyız. Aşağıda örnek uygulamamız için ADPlus’ı komut satırından nasıl crash modunda başlatabileceğimizi bulabilirsiniz;
adplus –crash –p 7060 –o c:\tmp
Komut satırından geçtiğimiz –crash parametresi ile adplus uygulamamızı crash modunda başlatıyoruz. Hemen ardından gelen –p 7060 ise adplus’a 7060 PID’li işlemi dinleyeceğini belirtmektedir. Sonda gördüğümüz –o c:\tmp parametresi asdlus uygulamasının log, dump gibi çıktılarının c:\tmp klasörü altına toplaması gerektiğini belirtmektedir.
Ekran görüntüsünde de gördüğünüz gibi crash modunda çalışan ADPlus uygulaması hatalar için CRMUygulamasi’nı dinlemeye başladığını belirterek, oluşan hata logları ve dökümlerini C:\tmp\20110108_162513_Crash_Mode klasörüne saklayacağını bildiriyor. Bu sırada açılan ikinci bir pencere dikkatinizi çekecektir. Bu ikinci pencerede yer alan cdb.exe uygulaması asıl hataları dinleyen ve ADPlus tarafından tetiklenmiş olan uygulamadır.
Yukarıdaki ayarlar sonrasında hataların dinlenmesini sağladıktan sonra uygulamamıza geri dönerek kullanıcının hatalı durumu yeniden oluşturmasını bekleyebiliriz. Uygulamamızda hata oluştuğunda cdb.exe bu durumu fark edecek, işleyişini durduracak ve hata dökümlerini yukarıda belirttiğim klasöre alacaktır.
Dikkat edecek olursanız tek hata oluşmuş olmasına karşın klasörde iki tane hata dökümü yer almakta. Bunlar uygulamamızda oluşan hataya ait birinci ve ikinci şans (first chance, second chance) dökümleridir. Birinci ve ikinci şans dökümü konusunda detaylı bilgiyi önceki makalemde bulabilirsiniz. Bu iki hata dökümünden genellikle ikinci şans hata dökümü bizleri hatanın kaynağına götürüyor olsa da bazı durumlarda birinci şans hata dökümü de oldukça işimize yarayacaktır.