22.07.2014

Windows Debugging with WinDbg

Windows'un mavi ekranını (Blue Screen of Death, BSOD) görmeyen yoktur herhalde. Her ne kadar sonuç olarak bizi bilgisayar başındaki işimizden alıkoyduğu için mavi ekranlardan nefret etsek de, çoğumuz belki de aslında bizim hayatımzı kurtardığının farkında değilizdir. "Birşey" (ne olduğu bu yazının konusu) arka tarafta Windows'un kurallarına uymadığı için, işletim sisteminin çalışmasına devam etmesi, belki de veri kaybına (ki bu zaten kaçınılması gereken yegane sondur) sebep olabileceğinden, işletim sistemi acil olarak çalışmasını durdurur, biz de tam bu anda mavi ekranı görürüz.

Elbetteki bu durumun tekrarlamamasını sağlamamız gerekir. Bu amaçla arka planda neyin olup bittiğini incelemek için kullanabileceğimiz bir araç var: WinDbg.

Öncelikle nasıl indirilebilir, onu yazalım. Microsoft, her Windows sürümü için bir SDK kiti yayınlıyor. Performans araçlarından hata bulmaya kadar birçok aracı içeren bu kit, Google'da "Windows SDK" aramasıyla bulunabilir. Ben Windows 8.1 için aradığım için "Windows SDK 8.1" araması yaparak şu sayfaya ulaştım.


Burada aşağıda görülen "Install and download" bağlantısını tıklayarak installer'ını indirebiliriz. Bu da aslında installer for installer. Yanı kurulumu yapacak dosyaları indirecek kurulum dosyası. Çalıştırdığımızda bir sürü seçenek arasından hangilerini istediğimiz sorulacak. Windbg için sadece Debugging tools for Windows'u seçmemiz yeterli. Bu aşamada internetten 600 MB'a kadar veri indirilebilir. Bundan sonra indirilen dosyaların arasından Debugging Tools'a ait olan kurulum dosyaları çift tıklanarak kurulmalı. Bu adımlar tamamlandığında Windbg kurulmuş ve başlat ekranında/menüsünde bir kısayol yaratılmış olur.

Andrew Richards'ın Channel9'daki sunumunda bazı özel ve güzel ayrıntılar verilmiş.  Örneğin dmp gibi dosyalarla WinDbg'yi ilişkilendirmek için

windbg -IA

kullanılabilir. Bunun sonucunda HKEY_CLASSES_ROOT altında WinDbg.DumpFile.1 adında yeni bir anahtar yaratılır. Bu anahtar, sunumda da belirtildiği şekilde aynı makinede hem x86 hem de x64 programların debug edilebilmesi için özelleştirilebilir.

Bir de post mortem debugger olarak ayarlama konusu var. Bunun için de

windbg -I

komutu hem x86 hem de x64 sürümler için kullanılmalı.

Mavi ekran oluştuğunda Windows, bir bellek dökümü oluşturur. Bu bellek dökümü %SystemRoot%\MEMORY.DMP dosyasında ya da %SystemRoot%\minidump klasöründe bulunur. İşte WinDbg, bu bellek dökümü dosyalarını açarak en son mavi ekran anında neler olduğunu incelememizi sağlayan bir araç. Windbg'ı kullanmanın en büyük zorluğu uygun komutu bularak bu bellek dökümü dosyasını açmak (Mark Russinovich'in sözü). Windbg'ı çalıştırıp File menüsünden Open Crash Dump... (Ctrl+D) ile bu bellek dökümünü açabiliriz. Aşağıda örnek olarak Windbg ile açılmış bir bellek dökümünün ekran görüntüsü var.


Alttan ikinci satırda hatanın muhtemel sebebi belirtilmiş:

Probably caused by : avgntflt.sys ( avgntflt+17623 )

Önerildiği gibi

!analyze -v

komutunu kullanarak Windbg'ın crash dump dosyasını analiz ederek bize en son şüpheliyi söylemesini de isteyebiliriz. Bu komuttan sonra ekranda şöyle bir görüntü olacak.


Şüpheli değişmedi. Eğer sadece yukarıda yazan bilgiye erişmek isteseydik Nirsoft'un BlueScreenView programını da kullanabilirdik.


Evet, burada da "The problem seems to be caused by the following file: avgntflt.sys" diyor. Burada karar verme süreci şöyle işliyor: Windbg hatanın olduğu anda en son hangi prosesin kodlarının işletildiğine bakıyor. En son Microsoft olmayan prosesi suçlu kabul ediyor (Russinovich'in sözü). Cümlelerin kuruluşundan da anlaşılabileceği gibi bu nihai karar değil. Daha ayrıntılı incelemek gerek. Ama daha ayrıntılı bir analiz yapmadan önce bu sonuçları bir değerlendirmek gerek. Öncelikle hataya sebep olan bileşenin yeni sürümü var mı, kontrol etmeli. Varsa yenisini yüklemeli. Bu mümkün değilse ve kullanılmıyorsa bu bileşenden kurtulmak denenmeli. Bunların hiçbirisi fayda etmiyorsa bu durumda bazı ileri teknikler kullanmak gerekir. Bunları da başka bir yazının konusu.

---

Microsoft dll ve exe dosyaları için sembollere ihtiyaç duyulması durumunda kullanılacak sembol dizesi:

srv*c:\symbols*http://msdl.microsoft.com/download/symbols

olabillir. Ya da ortam değişkeni olarak %_NT_SYMBOL_PATH% içeriğini yukarıdaki dizeye eşitleyebiliriz. İkisi de aynı etkiye sahip.