13 Aralık 2010 Pazartesi

Uygulamamızdaki beklenmedik anlarda hata durumu ve çözümü DEBUGGING (Hata Ayıklama)

Merhaba arkadaşlar, bu yazım biraz uzun olacağı için parçalar halinde anlatacağım. Günümüzde hemen hemen herkes bilgisayar kullanıyor ve bazen kullandığımız uygulamalar beklenmedik anlık davranışlar gösterebiliyorlar. Peki, nedir bu beklenmedik durumlar, isterseniz konumuza buradan başlayarak devam edelim. Kullanıcılar genelde iki tür durumla karşılaşabilir,


1) Uygulama bir hata ile karşılaşır, sonrasında ya kapanır ya da uyarı verir ve çalışmaya devam eder
2) Uygulama cevap veremez hale gelir ki bu ekrana (NOT RESPONDING) şeklinde yansır.
      
Uygulamadan kastım tüm komut satırı uygulamaları, servisler ve GUI uygulamalarıdır. En basit örnek ile herhangi bir internet kullanıcısının açmaya çalıştığı dosyada ya da internette dolaşırken bilgisayarın donması veya NOT RESPONDING (cevap vermiyor) hatası da olabilir. Kullandığımız uygulamanın .NET tabanlı veya herhangi bir programlama dilinde geliştirilmiş olmasının bir önemi yoktur. Peki, bu tür hataların sebebini nasıl bulabiliriz. Bunun için kullanabileceğimiz güçlü bir araç mevcuttur. DEBUGGER, Hata Ayıklayıcı.

Debugger'ın yaptığı iş çalışan yada çalıştığı anda beklenmedik hata veren uygulamalarımızın içine bakmaktır. Debugger sorunlu uygulamaya bağlanır ve uygulamanın içini inceleme fırsatı verir. Peki, bu işi kim yapar? İşte bu noktada debugger’ın en çok kullandığımız özelliği devreye giriyor. DUMP ALMA

Bunu şöyle de anlatabilirim. Örneğin araba kullandığınızı varsayalım. Ansızın arabanız stop ediyor ve bunu gün içinde tekrarlıyor. Dump işlemi araba stop etmeden bir önceki çalışma durumundan sonra hangi nedenden stop ettiğini bize bildirir.

Debugger şu durumlarda dump dosyası üretebilir.
1)       1) Eğer debugger, exception (kuraldışı) durumlarında dump dosyası üretmeye ayarlandıysa, debugger uygulamaya bağlandığı andan itibaren çalışma alanlarını takip eder ve bir exception durumunda dump dosyası üretir. Bu durumda debugger uygulama kapanana kadar çalışır. Buna “crash mode” dump alma denir. Her exception durumunda dump dosyası alınır.
2)       2) Bu durumda ise debugger uygulamaya bağlanır ve “o an” ki bilgileri dump dosyasına kaydeder, sonrasında bağlantıyı keser ve kapanır. Uygulamamız çalışmaya devam eder. Kısacası, debugger dump dosyasını üretir sonrasında uygulama ile bağlantısını keser. Bu tip debugger çalışmasına ise “hang mode” dump alma denir. Bu durumda debugger, uygulamanın ne zaman hang mode (cevap vermediği durum) olduğunu takip etmez, fark etmez. Sadece uygulamanın çalıştırıldığı “o andaki” durumunu kaydeder.

Bu bilgiler ışığında genelde karşılaşılan hata durumlarını ve hangi debugger işlemini uygulayacağımızı kısaca gözden geçirelim.

***Uygulamamız düzgün şekilde çalışıyor ancak bir anda “Beklenmeyen hata oluştu” gibi bir mesaj çıkıyor ve “tamam”a bastığınızda uygulama kapanıyor. Ya da bu uyarı dahi çıkmıyor ve uygulama kapanıyor.  Hangi dump dosyası alınır?
·         Yapılması gereken uygulama çalışmaya başladıktan sonra debugger’ı “crash” modda çalıştırmak ve uygulama beklenmedik şekilde kapanana kadar beklemek. Amacımız hangi exception’ dan ötürü uygulamanın kapandığını anlamak.
22 ***Uygulama bir süre düzgün çalışıyor. Belli bir işlemi çalıştırmak istediğinizde size hata mesajı döndürüyor, mesajı kapattığınızda uygulama kapanmıyor diğer işlemler beklendiği gibi normal şekilde çalışmaya devam ediyor. Hangi dump dosyası alınır?
·         Hata mesajının gösterildiği an da debugger’ı “hang” modda çalıştırmak. Amacımız mesajbox’ı gösteren callstack’i bulmak olacaktır. Buradaki durumda mesaja yol açan fonsiyonların callstack’te halen mevcut olmalarıdır.
3)     ***Uygulama çalıştıktan bir süre sonra yetersiz kaynaklarla ilgili mesajlar verir veya sistem/uygulama günlüklerine kayıt atmaya başlar. Kim zaman uygulama kapanmaz ama kesinlikle beklenildiği gibi davranış sergilemez. Hangi dump dosyası alınır?
·         Bu defa yapmamız gereken ilk şey dump almak değildir, hangi kaynağın kullanılıp işleme cevap vermediğini anlamaktır. Mesela, artan, uygulamanın sanal bellek alanımıdır, yoksa işletim sistemi nesneleri midir? Bunların yanıtını task manager’dan bu tip değerleri kontrol ederek bulmaktır. Bunu yapmaya fırsatımız ya da zamanımız olmadıysa o zaman “hang dump” alma işe yarayabilir.

Uygulamanın yanıt veremez hale gelmesi durumunda yanıtlanması gereken iki soru vardır

1)      1)Uygulamanın işlemci kullanım düzeyi ne durumda?
2)      2)Yanıt vermeme durumu ne kadar sürüyor?

·         Eğer işlemci kullanımı yüksek ise (uygulama>%90) ve durum uygulama kapanıncaya kadar devam ediyorsa, o zaman 1’er dakika arayla 3 defa “hang mode” dump almak gerekir. Böyle durumlar, genellikle uygulamanın sonsuz bir döngüye girmesinden kaynaklanır.
·         Eğer uygulamanın işlemci kullanımı yüksek ve durum belli bir süre devam ediyor daha sonra işlemci kullanımı normal seviyelere düşüyorsa mümkün olduğunca çok dump dosyası almak daha iyi olacaktır. Bu durum genellikle birim zaman içinde istek sayısının artmasından kaynaklanır.
·         Eğer uygulamanın işlemci kullanımı düşük (neredeyse 0) ve durum uygulama kapanana kadar devam ediyorsa ve uygulama hiçbir işleme cevap vermiyorsa bir defa “hang mode” dump almak yeterlidir. Bu tip durumlar genellikle sonsuz bir bekleyişten kaynaklanır.
·         Eğer uygulamanın işlemci kullanımı düşük ve bu durum bir süre devam edip sonra düzeliyorsa, durağan süre boyunca 3-4 defa “hang mode” dump almak uygun olacaktır. Böyle bir durum ise genellikle uygulamanın başka bir uygulamadan yanıt beklemesinden kaynaklanır.

Bu yazımda sizlere DEBUGGER hakkında ve DUMP ALMA işleminden bahsettim. Bir sonraki yazımda DEBUGGER'ı kurma ve DUMP ALMA konularına değineceğim, görüşmek üzere...