Windows Bellek Dökümleri ile Dans

Dostlar selam, bugün farklı bir yazı ile birlikteyiz.

Windows işletim sistemi için (ve muhtemelen diğer işletim sistemleri) yazılım geliştiren bir çoğumuz, yazılımları konuşlandırdıktan sonra çıkan ve yazılımların göçmesi ile sonuçlanan hatalar ile karşılaşıyoruzdur. Genelde de bu yazılımların bir çoğu da kendi makinelerimizde çalışıyor oluyorlar 🙂 Bunları eğer tekrarlayabiliyorsanız ne ala. Ama eğer oluşturamıyorsanız büyük sıkıntı. Bir de tabi mavi ekranlar var aşağıdaki gibi 🙂 Peki bu durumda ne yapacağız? Elbette, çeşitli kayıt çıktıları veya uygulamanın davranışından bazı çıkarımlarda bulunabilirsiniz. Peki ya bulunamazsanız ne olacak?

İşte bu yazımızda, bu duruma düşdüğünüz durumda, izleyebileceğiniz yöntemlerden birine değineceğim (ki ben de bunu böyle bir durum düştükten sonra öğrenerek uyguladım ve problemin kaynağını çözmemde yardımcı oldu). Bu yöntem bellek dökümlerinin incelenmesine dayanıyor. Elbette, bunları belirli araçları kullanarak ve yaklaşımları izleyerek yapıyor olacağız.

Temelde, bellek döküm dosyaları, bellekte çalışan ve yüklü olan uygulamalara, kullanılan verilere ve diğer ilintili hususlara ilişkin verileri içeren dosyadır. Bir uygulama çöktüğü zaman, uygulama tamamen kapatılmadan önce, “registery” içerisinde döküm alınmasına ilişkin bir ayar var mı diye kontrol edilir ve eğer var ise ilgili döküm dosyası oluşturulur.

Öncelikle şunu ifade etmekte fayda var ki, bu yöntem windows üzerinde çalışacak olan uygulamalar için geçerli, açıkçası benzer araçlar diğer işletim sistemleri nasıl kullanılıyor bilmiyorum ama olduğuna eminim.

Şimdi gelelim bu yaklaşımı nasıl uygulayacağımıza. Burada, önce sizlere izlemeniz gereken adımları aktarmaya çalışacağım daha sonra bu adımlarda yaptığımız eylemlerin, alanların ne anlama geldiklerini aktarmaya çalışacağım. Son olarak da, elde ettiğimiz kayıtları nasıl anlamlandıracağımıza bakıyor olacağız.

Gerekli Ayarlar

Bu şekilde, hata kayıt dökümlerine almaya yönelik ayar ne yazık ki windows ile ayarlı gelmiyor ve bu kabiliyeti kullanabilmek için registery’de bir takım ayarlar yapmamız gerekiyor ki, bu sebeple bir yedek almanızda fayda var. Şimdi adım adım ne yapacağımıza bakalım:

  • “Registry Editor” ‘ nü açalım:
    • Win + R kısayolunu kullanarak Çalıştır kutucuğunu açalım
    • Buraya “regedit” yazarak ilgili editörü açalım
    • Bundan önce eğer bir Pop-Up penceresi görünür ise evet düğmesine basmanız gerekiyor.
  • Açılan editör içerisinde “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting” dizinine gidiyoruz
  • Bu kısmı değiştireceğimizden, yedek almak için aşağıdaki adımları izleyelim:
    • “Windows Error Reporting” ‘i seçip sağ tıklayalım,
    • Gelen menüden “Ver” komutunu seçerek ilgili alanları .reg uzantılı bir dosyaya kaydedelim,
  • Kuvvetle muhtemel, eğer daha önce bir uygulama veya sizin tarafınızdan oluşturulmadı ise “”Windows Error Reporting” altında “LocalDumps” anahtarı sizlerde bulunmuyor olabilir. Eğer bu anahtar yok ise bunu oluşturacağız:
    • “Windows Error Reporting” seçip sağ tıklıyoruz,
    • Gelen menüden “Yeni” ve sonrasında ise “Anahtar”‘ı seçiyoruz,
    • Ve bu anahtarın ismini “LocalDumps” olarak belirliyoruz,
    • createkey
  • Yeni oluşturduğumuz “LocalDumps” anahtarı içerisinde gerekli kayıt değerlerini oluşturacağız. Bunun içinde aşağıda sizlere aktardığım alanları kullanıyor olacağız:
    • Kullanıcı Çökme Dökümü Alma Ayarları
      Alt Alan İsmiAçıklamaAlan TipiVarsayılan Değer
      DumpFolderDöküm dosyalarının depolanacağı dizin. Eğer varsayılan dizini kullanmayacaksanız, bu dizinin gerekli yazma haklarına sahip olduğundan emin olunuz. Çökmelere ilişkin dökümler bu dizine saklanıyor olacaklar. Ör. D:\CrashDumpsREG_EXPAND_SZ%LOCALAPPDATA%\CrashDumps
      DumpCountDöküm dizini içerisinde tutulacak maksimum dosya adeti. İlgili adet dolunca en eski kayıt/dosya silinir.REG_DWORD10
      DumpTypeDöküm tipini belirler:

      • 0: Özelleşmiş döküm (sonraki satır 😉
      • 1: Mini döküm
      • 2: Tam döküm

      * Bu tiplere ilişkin aşağıya ek bilgiler ekliyorum.

      REG_DWORD1
      CustomDumpFlagsBurada ilgili döküme ilişkin özelleşmiş ayarları kombine ederek kullanabilirsiniz. Buradaki değerler bir önceli alanın 0 olması durumunda sadece kullanılıyor.REG_DWORDMiniDumpWithDataSegs | MiniDumpWithUnloadedModules | MiniDumpWithProcessThreadData.
    • Yukarıdaki tabloda döküm tiplerinin davranışları şu şekilde:
  • Yukarıdaki ayarları eğer doğru yaptıysanız, bundan sonra windows üzerinde gerçekleşen herhangi bir (ki buna bütün uygulamalar dahil, bunu nasıl sınırlayabileceğinize de bakacağız) göçmede, bu dizin altında ilgili döküm kayıtları oluşturulacaktır.
  • Peki, bilgisayarınızda çalışan bütün uygulamalar değil de, sadece belirli bir uygulamaya ilişkin döküm almak isterseniz ne yapacaksınız? Bunun için, döküm almak istediğini uygulamanın ismini içeren bir anahtarı “LocalDumps” dizini altına açıyorsunuz. Ör. OrnekUygulama.exe için:
    • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\OrnekUygulama.exe anahtarı ekleyip içerisine de yukarıda belirttiğimiz kayıt alanları istediğiniz şekilde düzenleyerek ekleyebilirsiniz.

Gerekli Araçlar

Elde ettiğiniz döküm dosyalarını anlamlandırabilmek için bir takım araçlar kullanmanız gerekmekte ve bunların en önemlisi de WinDbg aracıdır. Bu araç ile birlikte, kernel ve user mode uygulamalarınızı/kodlarınıza ilişkin hata ayıklama, dökümleri inceleme ve işlemci register’larına göz atabiliriniz. Microsoft’un buna ilişkin çok güzel kılavuzları da mevcut. Ör. https://docs.microsoft.com/tr-tr/windows-hardware/drivers/debugger/getting-started-with-windows-debugging

Öncelikle bu araçla inceleyebileceğimiz bir döküm dosyası oluşturalım nasıl mı? En kolayınızdaki bir C ya da C++ derleyecisi ile aşağıdaki kod parçasından oluşan bir uygulama oluşturun ve çalıştırın.

Eğer, bir önceki başlık altındaki ayarlarımızı düzgün yaptıysak. D:\CrashDumps dizini altında (siz hangi dizini ayarladıysanız), aşağıdaki dosyanın oluşmuş olduğunu göreceksiniz:

Şimdi, WinDbg aracı ile bu dökümü inceleyelim:

  1. Öncelikle WinDbg Preview aracını indirerek kurmanız gerekiyor, ilgili bağlantıyı izlediğinizde sizi microsoft store’a yönlendiriyor olacak ve orada ilgili uygulamayı indirebilirsiniz,
  2. Daha sonra bu uygulamayı yönetici hakları ile başlatmanız gerekiyor,

  3. Uygulamayı çalıştırdıktan sonra, Dosya -> Start Debugging -> Open dump file’ı seçmeniz gerekiyor. Daha sonra çıkan pencereden az önce gördüğümüz döküm dosyasını seçiyoruz,
  4. Dosyayı açtıktan sonra, uygulama ilgili .exe’iy analiz etmek için gerekli dosyaları yüklüyor (durum çubuğundan görebilirsiniz):
  5. Bu aşamadan sonra 0:000>’ın yanındaki komut alanına “!analyze -v” yazmanız yeterli. Bu komut da, oluşturulan döküm dosyasını analiz edip, ilgili çıktıları “Command” sekmesine basıyor olacak, hemen bakalım:
  6. Evet, bu analiz sonucunda sekmeye basılan bilgileri aşağıya ekliyorum. Eğer, uygulamanız, benim örneğimde olduğu gibi “Debug” bilgileri ile derlendiyse, ilgili hatanın/göçmenin kod içerisindeki satırına kadar bilgiyi görebilirsiniz. Burada önemli olan satırlar (PROCESS NAME, STACK_TEXT, FAULTING_SOURCE_LINE, FAULTING_SOURCE_LINE_NUMBER, MODULE_NAME ve tabi ki FAILURE_BUCKET_ID):
  7. Buradaki alanlar, hata kodları ve daha bir çok bilgi için https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/bug-check-code-reference2 sayfasına muhakkak göz atın.

Evet arkadaşlar bu yazım ile birlikte, sinir bozucu göçme hatalarını çözmede kullanabileceğiniz bir yaklaşıma da göz atmış olduk.

Biraz internette dolaştığımda, bu tarz göçme durumlarını uygulama içerisinde yakalamaya yönelik bir takım kütüphanelere de rast geldim. Açıkçası çok incelemesemde, ihtiyaç duyan arkadaşlar yardımcı olabilir. Bunlardan birisi de “crashrpt” kütüphanesi. Her ne kadar yeni bir kütüphane olmasa da, benzerleri için bir fikir verebilir veya kendi kütüphanenizi oluşturmak için faydalı olabilir. Bu konuda ayrıca https://www.wikiwand.com/en/Crash_reporter sayfasında da, güzel bilgilere ulaşabilirsiniz.

 

Bir sonraki yazımda görüşmek dileğiyle sevgili yazılımperver dostlarım, bol kodlu ve sağlıklı günler diliyorum 🙂

Kaynaklar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.