Aracılığıyla paylaş


Otopsi Sonrası Hata Ayıklamayı Etkinleştirme

Kullanıcı Modu Özel Durum İşleme

Özel Durumlar ve Kesme Noktaları

En yaygın uygulama hataları özel durumlar olarak adlandırılır. Bunlar erişim ihlalleri, sıfıra bölme hataları, sayısal taşmalar, CLR özel durumları ve diğer birçok hata türünü içerir. Uygulamalar durdurma noktası kesintilerine de neden olabilir. Bunlar, Windows uygulamayı çalıştıramadığında (örneğin, gerekli bir modül yüklenemediğinde) veya bir kesme noktasıyla karşılaşıldığında oluşur. Kesme noktaları bir hata ayıklayıcı tarafından koda eklenebilir veya DebugBreak gibi bir işlev aracılığıyla çağrılabilir.

Özel Durum İşleyicileri Önceliği

Windows, yapılandırma değerlerine ve hangi hata ayıklayıcılarının etkin olduğunu temel alarak kullanıcı modu hatalarını çeşitli yollarla işler. Aşağıdaki sıra, kullanıcı modu hata işleme için kullanılan önceliği gösterir:

  1. Kullanıcı modu hata ayıklayıcısı şu anda hata ayıklama işlemine bağlıysa, tüm hatalar hedefin bu hata ayıklayıcıya girmesine neden olur.

    Kullanıcı modu hata ayıklayıcısı ekli olduğu sürece, gn (Özel Durumla Git İşlenmedi) komutu kullanılsa bile başka bir hata işleme yöntemi kullanılmaz.

  2. Kullanıcı modu hata ayıklayıcısı eklenmemişse ve yürütülen kodun kendi özel durum işleme yordamları varsa (örneğin, deneyin - hariç), bu özel durum işleme yordamı hatayla ilgilenmeye çalışır.

  3. Kullanıcı modu hata ayıklayıcısı eklenmemişse ve Windows'un açık çekirdek hata ayıklama bağlantısı varsa ve hata bir kesme noktası kesintisiyse, Windows çekirdek hata ayıklayıcısıyla iletişim kurmaya çalışır.

    Çekirdek hata ayıklama bağlantıları Windows'un önyükleme işlemi sırasında açılmalıdır. Kullanıcı modu kesintisinin çekirdek hata ayıklayıcısına girmesini önlemek istiyorsanız, -du parametresiyle KDbgCtrl yardımcı programını kullanabilirsiniz. Çekirdek hata ayıklama bağlantılarını yapılandırma ve KDbgCtrl kullanma hakkında ayrıntılı bilgi için bkz. Hata Ayıklama için Ayarlama.

    Çekirdek hata ayıklayıcısında, hatayı göz ardı etmek ve hedefi çalıştırmaya devam etmek için gh (Özel Durum İşlenmiş Olarak Git) kullanabilirsiniz. Çekirdek hata ayıklayıcısını atlamak ve 4. adıma geçmek için gn (Özel Durumla Git İşlenmedi) kullanabilirsiniz.

  4. Adım 1, 2 ve 3'teki koşullar geçerli değilse, Windows AeDebug kayıt defteri değerlerinde yapılandırılmış bir hata ayıklama aracını etkinleştirir. Bu durumda kullanılacak araç olarak herhangi bir program önceden seçilebilir. Seçilen program, otopsi hata ayıklayıcısı olarak adlandırılır.

  5. 1., 2. ve 3. adımlardaki koşullar geçerli değilse ve kayıtlı bir otopsi hata ayıklayıcısı yoksa, Windows Hata Bildirimi (WER) bir ileti görüntüler ve varsa çözümler sağlar. WeR, Kayıt Defteri'nde uygun değerler ayarlanırsa bir bellek dökümü dosyası da yazar. Daha fazla bilgi için bkz. WER Kullanma ve User-Mode Dökümlerini Toplama.

DebugBreak İşlevi

Bir postmortem hata ayıklayıcısı yüklendiyse DebugBreak işlevini çağırarak kullanıcı modu uygulamasından hata ayıklayıcıya kasıtlı olarak girebilirsiniz.

Post-mortem Debugger Belirleme

Bu bölümde, WinDbg gibi araçların otopsi sonrası hata ayıklayıcısı olarak nasıl yapılandırıldığı açıklanmaktadır. Bir uygulama kilitlendiğinde, yapılandırıldıktan sonra postmortem hata ayıklayıcısı otomatik olarak başlatılır.

Post Mortem Debugger Kayıt Defteri Anahtarları

Windows Hata Raporlama (WER), AeDebug kayıt defteri anahtarında ayarlanan değerleri kullanarak postmortem hata ayıklayıcı işlemini oluşturur.

HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug

İki birincil kayıt defteri değeri vardır: Hata Ayıklayıcı ve Otomatik. Hata Ayıklayıcı kayıt defteri değeri, otopsi hata ayıklayıcısı için komut satırını belirtir. Auto (Otomatik) kayıt defteri değeri, postmortem hata ayıklayıcının otomatik olarak başlatılıp başlatılmadığını veya önce bir onay ileti kutusu sunulup sunulmadığını belirtir.

Hata Ayıklayıcı (REG_SZ)

Bu REG_SZ değeri, otopsi sonrası hata ayıklamayı işleyecek hata ayıklayıcıyı belirtir.

Hata ayıklayıcısı varsayılan yolda yer alan bir dizinde yer almadığı sürece hata ayıklayıcının tam yolu listelenmelidir.

Komut satırı, 3 parametre içeren bir printf stili çağrısı aracılığıyla Hata Ayıklayıcı dizesinden oluşturulur. Sipariş sabit olsa da, kullanılabilir parametrelerin hiçbirini veya tümünü kullanma gereksinimi yoktur.

DWORD (%ld) - Hedef işlemin işlem kimliği.

DWORD (%ld) - Olay İşleyicisi, postmortem hata ayıklayıcı işleminde yinelenir. Postmortem hata ayıklayıcısı olaya sinyal verirse, WER, postmortem hata ayıklayıcısının sonlanmasını beklemeden hedef sürece devam eder. Olay yalnızca sorun çözüldüyse işaretlenmelidir. Postmortem hata ayıklayıcısı olayı sinyal vermeden sonlandırırsa, WER hedef işlemler hakkında bilgi toplamaya devam eder.

void* (%p) - Hedef işlemin adres alanında ayrılan JIT_DEBUG_INFO yapısının adresi. Yapısı ek özel durum bilgileri ve bağlam içerir.

Otomatik (REG_SZ) Bu REG_SZ değeri her zaman 0 veya 1'dir.

Otomatik0 olarak ayarlanırsa, otopsi hata ayıklama işlemi başlatılmadan önce bir onay iletisi kutusu görüntülenir.

Otomatik1 olarak ayarlanırsa, otopsi hata ayıklayıcısı hemen oluşturulur.

Kayıt defterini el ile düzenlerken, kayıt defterinde yapılan yanlış değişiklikler Windows'un önyüklemesine izin vermeyebileceği için bunu çok dikkatli bir şekilde yapın.

Örnek Komut Satırı Kullanımı

Birçok postmortem hata ayıklayıcısı, parametrelerin bir PID ve Olay (sırasıyla) olduğunu belirtmek için -p ve -e anahtarları içeren bir komut satırı kullanır. Örneğin, windbg.exe -I aracılığıyla WinDbg'yi yüklemek aşağıdaki değerleri oluşturur:

Debugger = "<Path>\WinDbg -p %ld -e %ld -g"
Auto = 1

WER %ld %ld %p parametrelerinin nasıl kullanılabilmesi konusunda esneklik vardır. Mesela. WER parametrelerinin etrafında veya arasında herhangi bir anahtar belirtme gereksinimi yoktur. Örneğin, procdump.exe -i kullanarak Windows Sysinternals ProcDump'u yüklemek, WER %ld %ld %p parametreleri arasında herhangi bir anahtar kullanmadan aşağıdaki değerleri oluşturur.

Debugger = "<Path>\procdump.exe" -accepteula -j "c:\Dumps" %ld %ld %p
Auto = 1

32 ve 64 bit Hata Ayıklayıcıları

64 bit platformda Hata Ayıklayıcı (REG_SZ) ve Otomatik (REG_SZ) kayıt defteri değerleri 64 bit ve 32 bit uygulamalar için ayrı ayrı tanımlanır. 32 bit uygulamanın post mortem hata ayıklama değerlerini depolamak için Windows üzerinde ek bir Windows on Windows (WOW) anahtarı kullanılır.

HKLM\Yazılım\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug

64-bit platformda, 32-bit işlemler için 32-bit sonrası hata ayıklayıcı ve 64-bit işlemler için 64-bit hata ayıklayıcı kullanın. Bu, 64 bit hata ayıklayıcının 32 bit işlemde 32 bit iş parçacıkları yerine WOW64 iş parçacıklarına odaklanmasını önler.

Windows için Hata Ayıklama Araçları postmortem hata ayıklayıcıları da dahil olmak üzere birçok postmortem hata ayıklayıcı için, bu, yükleme komutunu iki kez çalıştırmayı gerektirir; bir kez x86 sürümüyle, bir kez de x64 sürümüyle. Örneğin, WinDbg'yi etkileşimli otopsi hata ayıklayıcısı olarak kullanmak için komut windbg.exe -I her sürüm için bir kez olmak üzere iki kez çalıştırılır.

64 bit Yükleme:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe –I

Bu, kayıt defteri anahtarını bu değerlerle güncelleştirir.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
Debugger = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -p %ld -e %ld –g

32 bit Yükleme:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe –I

Bu, kayıt defteri anahtarını bu değerlerle güncelleştirir.

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
Debugger = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe" -p %ld -e %ld –g

Ölüm Sonrası Hata Ayıklayıcılarını Yapılandırma

Windows için Hata Ayıklama Araçları

Windows hata ayıklayıcıları için Hata Ayıklama Araçları'nın tümü, otopsi sonrası hata ayıklayıcısı olarak ayarlanmasını destekler. Yükleme komutu, işlemin etkileşimli olarak hata ayıklamasını amaçlıyor.

WinDbg

Postmortem hata ayıklayıcısını WinDbg olarak ayarlamak için komutunu çalıştırın windbg -I. (büyük I harfle yazılmalıdır.) Bu komut, kullanıldıktan sonra bir başarı veya hata iletisi görüntüler. Hem 32 hem de 64 bit uygulamalarla çalışmak için hem 64 hem de 32 hata ayıklayıcıları için komutunu çalıştırın.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe –I
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe –I

AeDebug kayıt defteri girdisi çalıştırıldığında windbg -I bu şekilde yapılandırılır.

Debugger = "<Path>\WinDbg -p %ld -e %ld -g"
Auto = 1

Örneklerde Path>,< hata ayıklayıcının bulunduğu dizindir.

-p ve -e parametreleri, daha önce açıklandığı gibi İşlem Kimliği ve Olayı geçirir.

-g, g (Go) komutunu WinDbg'ye geçirir ve geçerli yönergeden yürütmeye devam eder.

Not g (Go) komutunu geçirirken önemli bir sorun oluştu. Bu yaklaşımdaki sorun, kod yeniden başlatıldığında artık var olmayan geçici bir koşul nedeniyle özel durumların genellikle her zaman tekrarlanmamasıdır. Bu sorun hakkında daha fazla bilgi için bkz . .jdinfo (JIT_DEBUG_INFO kullanma).

Bu sorunu önlemek için .jdinfo veya .dump /j kullanın. Bu yaklaşım, hata ayıklayıcının ilgili kod hatası bağlamında olmasını sağlar. Daha fazla bilgi için Tam Zamanında (JIT) Hata Ayıklama hakkında konunun ilerleyen kısımlarındaki açıklamalara bakın.

CDB

Postmortem hata ayıklayıcısını CDB olarak ayarlamak için cdb -iae (AeDebug Yükleme) veya cdb -iaecKeyString (Command ile AeDebug'u Yükleme) komutunu çalıştırın.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe -iae
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe -iae

-iaec parametresi kullanıldığında KeyString, postmortem hata ayıklayıcısını başlatmak için kullanılan komut satırının sonuna eklenecek bir dize belirtir. KeyString boşluk içeriyorsa, tırnak içine alınmalıdır.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe -iaec [KeyString]
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe -iaec [KeyString]

Bu komut başarılı olursa hiçbir şey görüntülemez ve başarısız olursa bir hata iletisi görüntüler.

NTSD

Postmortem hata ayıklayıcısını NTSD olarak ayarlamak için ntsd -iae (Install AeDebug) veya ntsd -iaecKeyString (Command ile AeDebug Yükleme) komutunu çalıştırın.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\ntsd.exe -iae
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\ntsd.exe -iae

-iaec parametresi kullanıldığında KeyString, postmortem hata ayıklayıcısını başlatmak için kullanılan komut satırının sonuna eklenecek bir dize belirtir. KeyString boşluk içeriyorsa, çift tırnak içine alınmalıdır.

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\ntsd.exe -iaec [KeyString]
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\ntsd.exe -iaec [KeyString]

Bu komut başarılı olursa hiçbir şey görüntülemez, başarısızlık durumunda ise yeni bir konsol penceresinde bir hata bildirir.

Not -p %ld -e %ld -g parametreleri her zaman ilk olarak postmortem hata ayıklayıcısının komut satırında göründüğünden, -server ilk olarak komut satırında görünmediği sürece çalışmayacağından -server parametresini belirtmek için -iaec anahtarını kullanmamalısınız. Bu parametreyi içeren bir postmortem hata ayıklayıcısı yüklemek için kayıt defterini el ile düzenlemeniz gerekir.

Visual Studio JIT Hata Ayıklayıcısı

Visual Studio yüklendiyse, vsjitdebugger.exe post mortem hata ayıklayıcısı olarak kaydedilir. Visual Studio JIT Hata Ayıklayıcısı, işlemin etkileşimli olarak hata ayıklamasını amaçlar.

Debugger = "C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld

Visual Studio güncelleştirildiyse veya yeniden yüklenirse, bu girdi yeniden yazılır ve ayarlanan diğer değerlerin üzerine yazılır.

Windows Sysinternals ProcDump

Windows Sysinternals ProcDump yardımcı programı, otopsi sonrası döküm yakalama için de kullanılabilir. ProcDump kullanma ve indirme hakkında daha fazla bilgi için bkz. ProcDump.

.dump WinDbg komutu gibi ProcDump, kilitlenmenin döküm dosyasını etkileşimli olmayan bir şekilde yakalayabilir. Yakalama herhangi bir Windows sistem oturumunda gerçekleşebilir.

Döküm dosyası yakalama tamamlandığında ProcDump çıkar ve WER hatayı bildirir, ardından hatalı işlem sonlandırılır.

Hem 32 hem de 64 bit sonrası hata ayıklama için procdump'ı yüklemek ve ProcDump'u kaldırmak için procdump -i ve -u kullanın.

<Path>\procdump.exe -i

Yükleme ve kaldırma komutları, başarıyla gerçekleştirildiğinde değiştirilen kayıt defteri değerlerini ve başarısızlık durumunda hataları çıktı verir.

Kayıt defterindeki ProcDump komut satırı seçenekleri şu şekilde ayarlanır:

Debugger = <Path>\ProcDump.exe -accepteula -j "<DumpFolder>" %ld %ld %p

ProcDump 3 parametrenin tümünü kullanır: PID, Event ve JIT_DEBUG_INFO. JIT_DEBUG_INFO parametresi hakkında daha fazla bilgi için aşağıdaki Tam Zamanında (JIT) Hata Ayıklama bölümüne bakın.

Yakalanan dökümün boyutu, boyut seçeneği ayarlanmadığında varsayılan olarak Mini (işlem/iş parçacıkları/tanıtıcılar/modüller/adres alanı), -mp ayarlandığında MiniPlus (Mini artı MEM_PRIVATE sayfaları) veya -ma ayarlandığında Tam (tüm bellek - ".dump /mA" ile eşdeğer) olarak belirlenir.

Yeterli sürücü alanı olan sistemler için Tam (-ma) çekimi önerilir.

Tüm bellek yakalamayı belirlemek için -i seçeneğiyle -ma kullanın. İsteğe bağlı olarak döküm dosyaları için bir yol sağlayın.

<Path>\procdump.exe -ma -i c:\Dumps

Sınırlı sürücü alanı olan sistemler için MiniPlus (-mp) yakalamasının önerildiği belirtilmektedir.

<Path>\procdump.exe -mp -i c:\Dumps

Döküm dosyasını kaydetmek için kullanılacak klasör isteğe bağlıdır. Varsayılan, geçerli klasördür. Klasörün güvenliği C:\Windows\Temp için kullanılandan eşit veya daha iyi bir ACL ile sağlanmalıdır. Klasörlerle ilgili güvenliği yönetme hakkında daha fazla bilgi için bkz. Postmortem Debugging Sırasında Güvenlik.

ProcDump'u postmortem hata ayıklayıcısı olarak kaldırmak ve önceki ayarları geri yüklemek için -u (Kaldır) seçeneğini kullanın.

<Path>\procdump.exe -u

ProcDump hakkında ek bilgi için bkz. ProcDump ve Mark Russinovich ve Aaron Margosis tarafından yazılan, Microsoft Press tarafından yayımlanan Windows SysInternals Administrator's Reference.

Tam Zamanında (JIT) Hata Ayıklama

Arızalı Uygulamaya Bağlam Ayarlama

Daha önce açıklandığı gibi, bağlamı JIT_DEBUG_INFO parametresi kullanılarak kilitlenmeye neden olan özel duruma ayarlamak çok tercih edilir. Bu konuda daha fazla bilgi için bkz . .jdinfo (JIT_DEBUG_INFO kullanma).

Windows için Hata Ayıklama Araçları

Bu örnekte, ek özel durum bilgilerini görüntülemek için .jdinfo <adres> komutunu kullanan bir ilk komut (-c) çalıştırmak ve bağlamı özel durumun konumuyla değiştirmek için kayıt defterinin nasıl düzenleneceği gösterilmektedir (bağlamı özel durum kaydına ayarlamaya benzer şekilde).

Debugger = "<Path>\windbg.exe -p %ld -e %ld -c ".jdinfo 0x%p"
Auto = 1

%p parametresi, hedef işlemin adres alanında bir JIT_DEBUG_INFO yapısının adresidir. %p parametresi 0x ile önceden eklenir, böylece onaltılık değer olarak yorumlanır. Daha fazla bilgi için bkz . .jdinfo (JIT_DEBUG_INFO kullanma).

32 ve 64 bit uygulamaların karışımında hata ayıklamak için (yukarıda açıklandığı gibi) hem 32 hem de 64 bit kayıt defteri anahtarlarını yapılandırın. 64 bit ve 32 bit WinDbg.exekonumuna giden doğru yolu ayarlayın.

.dump kullanarak döküm dosyası oluşturma

JIT_DEBUG_INFO verilerini içeren bir hata oluştuğunda döküm dosyasını yakalamak için .dump /j <adresini> kullanın.

<Path>\windbg.exe -p %ld -e %ld -c ".dump /j %p /u <DumpPath>\AeDebug.dmp; qd"

Birden çok döküm dosyasının otomatik olarak oluşturulmasına izin vermek için benzersiz bir dosya adı oluşturmak için /u seçeneğini kullanın. Seçenekler hakkında daha fazla bilgi için bkz. .dump (Döküm Dosyası Oluştur).

Oluşturulan dökümde varsayılan özel durum bağlamı olarak depolanan JITDEBUG_INFO verileri bulunur. Özel durum bilgilerini görüntülemek ve bağlamı ayarlamak için .jdinfo kullanmak yerine özel durum kaydını görüntülemek için .exr -1 ve bağlamı ayarlamak için .ecxr kullanın. Daha fazla bilgi için bkz . .exr (Görüntü Özel Durum Kaydı) ve .ecxr (Görüntü Özel Durum Bağlam Kaydı).

Windows Hata Raporlama - q / qd

Hata ayıklama oturumunun sona erme şekli, Windows Hata Raporlama'nın hatayı bildirip bildirmediğini belirler.

Hata ayıklama oturumu hata ayıklayıcı kapatılmadan önce qd kullanılarak ayrılırsa, WER hatayı bildirir.

Hata ayıklama oturumu q kullanılarak kapatılırsa (veya hata ayıklayıcı ayrılmadan kapatılırsa), WER hatayı bildirmez.

Komut dizesinin sonuna ;q veya ;qd ekleyerek istenen davranışı çağırın.

Örneğin, CDB dökümü kaydettikten sonra WER'nin hatayı bildirmesine izin vermek için bu komut dizesini yapılandırın.

<Path>\cdb.exe -p %ld -e %ld -c ".dump /j 0x%p /u c:\Dumps\AeDebug.dmp; qd"

Bu örnek, WinDbg dökümü yakaladıklarından sonra WER'nin hatayı bildirmesine izin verir.

<Path>\windbg.exe -p %ld -e %ld -c ".dump /j %p /u <DumpPath>\AeDebug.dmp; qd""

Güvenlik Açıkları

Başkalarıyla paylaştığınız bir bilgisayarda otopsi sonrası hata ayıklamayı etkinleştirmeyi düşünüyorsanız bkz. Postmortem Debugging Sırasında Güvenlik.