Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Not Bu özelliği etkinleştirme yönergeleri yalnızca Windows 8 için WDK için geçerlidir. Windows 8.1 için bu özellik Sürücü Doğrulayıcı ile tümleştirilmiş durumdadır. Windows 8.1 çalıştıran bilgisayarlarda Sistematik düşük kaynak benzetimi seçeneğini kullanın.
Yığın Tabanlı Hata Ekleme seçeneği, çekirdek modu sürücülerine kaynak hataları ekler. Bu seçenek, sürücü hata işleme yollarına nüfuz etmek için Sürücü Doğrulayıcı ile birlikte KmAutoFail.sysözel bir sürücü kullanır. Bu yolların test edilmesi geçmişte çok zor olmuştur. Yığın Tabanlı Hata Ekleme seçeneği, kaynak hatalarını tahmin edilebilir bir şekilde ekler ve bu da bulduğu sorunları yeniden üretilebilir hale getirir. Hata yollarını yeniden oluşturmak kolay olduğundan, bu sorunlara yönelik düzeltmeleri doğrulamayı da kolaylaştırır.
Hatanın kök nedenini belirlemenize yardımcı olmak için, tam olarak hangi hataların eklendiğini ve hangi sırayla eklendiğini anlayabilen bir hata ayıklayıcı uzantısı sağlanır.
Belirli bir sürücüde Yığın Tabanlı Hata Ekleme seçeneği etkinleştirildiğinde, bu sürücüden çekirdek modülüne ve Ndis.sys'e yapılan bazı çağrıları engeller. Yığın Tabanlı Hata Enjeksiyonu, çağrı yığınına, özellikle de etkinleştirildiği sürücüden gelen çağrı yığını bölümüne bakar. Bu yığını ilk kez gördüyse, bu çağrının semantiğine göre çağrı başarısız olur. Aksi takdirde, eğer bu çağrıyı daha önce gördüyse, dokunmadan geçirir. Yığın Tabanlı Hata Enjeksiyonu, bir sürücünün birden çok kez yüklenip kaldırılabileceği gerçeğiyle başa çıkmak için bir mantık içerir. Sürücü farklı bir bellek konumuna yeniden yüklense bile çağrı yığınının aynı olduğunu algılar.
bu seçeneği etkinleştirmeyi
Bir veya daha fazla sürücü için Yığın Tabanlı Hata Ekleme özelliğini etkinleştirebilirsinizTest Bilgisayarına Sürücü Dağıtma sırasında. Sürücü Paketi Projeleri içinSürücü Doğrulayıcı Ayarları'nı yapılandırırken Yığın Tabanlı Hata Ekleme özelliğini seçebilirsiniz. Yığın Tabanlı Hata Enjeksiyonu seçeneğini etkinleştirmek veya devre dışı bırakmak için bilgisayarı yeniden başlatmanız gerekir. Sürücü Doğrulayıcı'yı ve bu özelliği test bilgisayarında etkinleştirmek için bir test yardımcı programı da çalıştırabilirsiniz.
Önemli Test bilgisayarında Yığın Tabanlı Hata Ekleme özelliğini etkinleştirdiğinizde, Düşük Kaynak Benzetimiseçmediğinizden emin olun.
Sürücü Doğrulayıcı Özellik Sayfası Kullanımı
- Sürücü paketinizin özellik sayfalarını açın. Çözüm Gezgini'nde sürücü paketi projesine sağ tıklayın ve Özelliklerseçin.
- Sürücü paketinin özellik sayfalarında, Yapılandırma Özellikleri'ne tıklayın, Sürücü Yükleme öğesine tıklayın ve ardından sürücü doğrulayıcı öğesine tıklayın.
- Sürücü Doğrulayıcıyı Etkinleştirseçin. Test bilgisayarında Sürücü Doğrulayıcı'yı etkinleştirdiğinizde, bilgisayardaki tüm sürücüler için, yalnızca sürücü projesi için veya belirtilen sürücülerin listesi için Sürücü Doğrulayıcı'yı etkinleştirmeyi seçebilirsiniz.
- Yığın Tabanlı Hata Enjektörü altında Yığın Tabanlı Hata Ekleme'yi seçin (kontrol edin).
- Uygula veya Tamamtıklayın.
- Daha fazla bilgi için bkz. Test Bilgisayarına Sürücü Dağıtma. Bu seçeneği etkinleştirmek için test bilgisayarının yeniden başlatılması gerekir.
Sürücü Doğrulayıcı testini etkinleştirme ve devre dışı bırakma
Bir yardımcı program testi çalıştırarak Sürücü Doğrulayıcı'yı da etkinleştirebilirsiniz. Visual Studio kullanarak bir sürücüyü çalışma zamanında test etmebölümünde açıklanan yönergeleri izleyin. Tüm Testler\Sürücü Doğrulayıcı test kategorisinde, Sürücü Doğrulayıcıyı Etkinleştir (olası yeniden başlatma gerekli) ve Sürücü Doğrulayıcıyı Devre Dışı Bırak (olası yeniden başlatma gerekli) testlerini seçin.
Sürücü Test Grubu penceresinde, Sürücü Doğrulayıcıyı Etkinleştir (olası yeniden başlatma gerekli) test adına tıklayarak Sürücü Doğrulayıcı ayarlarını seçin.
Yığın Tabanlı Hata Enjeksiyonu'nu seçin (işaretleyin).
Bu testleri bir test grubuna ekledikten sonra test grubunu kaydedebilirsiniz. Yığın Tabanlı Hata Enjeksiyonunu etkinleştirmek için, test için yapılandırdığınız bilgisayarda Sürücü Doğrulayıcıyı etkinleştirme (yeniden başlatma gerekebilir) testini çalıştırın.
Sürücü Doğrulayıcı'yı devre dışı bırakmak için Sürücü Doğrulayıcıyı Devre Dışı Bırak (olası yeniden başlatma gerekli) testini çalıştırın.
Yığın Tabanlı Hata Enjeksiyonu seçeneğini kullanma
Yığın Tabanlı Hata Ekleme kullanarak test yaparken dikkate alınması gereken önemli noktalardan biri, bu sistemin bulduğu hataların çoğunun hata kontrollerine yol açmasıdır. Sürücünüz önyükleme yüklü bir sürücüyse bu biraz acı verici olabilir. Bu nedenle, Sürücü Doğrulayıcı devre dışı bırakıldığında, Yığın Tabanlı Arıza Enjeksiyonunu otomatik olarak devre dışı bırakacağız. Bu, !verifier –disablekomutunu kullanarak Sürücü Doğrulayıcıyı devre dışı bırakarak önyükleme zamanında hata ayıklayıcıdan Yığın Tabanlı Hata Eklemeyi devre dışı bırakabileceğiniz anlamına gelir.
Mümkünse, Yığın Tabanlı Hata Ekleme ile ilk testleriniz için sürücünüzü önyükleme zamanında yüklenmemesi için ayarlayın. Daha sonra bazı basit yük ve kaldırma testleri çalıştırabilirsiniz. Yığın Tabanlı Hata Enjeksiyonu tarafından bulunan hataların çoğu, başlatma veya temizleme sırasında görülür. Sürücünüzü tekrar tekrar yüklemek ve boşaltmak, bunları bulmak için iyi bir yoldur.
Yük kaldırma testlerinin başarılı olması için gerekli düzeltmeleri yaptıktan sonra IOCTL tabanlı testlere, tam işlevsel testlere ve son olarak stres testine geçebilirsiniz. Genel olarak, bu test ilerlemesini izlerseniz, kod yollarının çoğu bundan önce zaten yürütülmüş olduğundan stres testi sırasında birçok yeni sorunu ortaya çıkarmazsınız.
Yığın Tabanlı Hata Ekleme (SBFI) uzantısını kullanan hata ayıklayıcı
Yığın Tabanlı Hata Enjeksiyonu ile ilgili olarak bulunan sorunların çoğu hata kontrolleriyle sonuçlanır. WDK, bu kod hatalarının nedenini belirlemeye yardımcı olmak için Yığın Tabanlı Hata Ekleme hata ayıklayıcısı uzantısını ve gerekli simgeleri sağlar. Yükleme yordamı her ikisini de hata ayıklayıcı sisteminize yükler. Varsayılan konum C:\Program Files (x86)\Windows Kits\8.0\Debuggers\<arch>'dir.
Hata ayıklayıcısı uzantısını çalıştırmak için
Hata ayıklayıcısı komut isteminden şu komutu yazın: !<yol>\kmautofaildbg.dll.autofail. Örneğin, hata ayıklayıcısı uzantılarının c:\dbgext konumunda yüklendiğini ve kmautofail.pdb dosyasının sembol yolunda olduğunu varsayarsak, aşağıdaki komutu girersiniz:
!c:\dbgext\kmautofaildbg.dll.autofail
Bu, eklenen en son hatalardan gelen çağrı yığınlarını gösteren bilgileri hata ayıklayıcınıza döküm eder. Her bir giriş, gerçek bir test çalıştırmasından alınan aşağıdakine benzer gibi görünmektedir. Aşağıdaki örnekte, Mydriver.sys üzerinde Yığın Tabanlı Hata Enjeksiyonu etkinleştirilmiştir.
Sequence: 2, Test Number: 0, Process ID: 0, Thread ID: 0
IRQ Level: 2, HASH: 0xea98a56083aae93c
0xfffff8800129ed83 kmautofail!ShimHookExAllocatePoolWithTag+0x37
0xfffff88003c77566 mydriver!AddDestination+0x66
0xfffff88003c5eeb2 mydriver!ProcessPacketDestination+0x82
0xfffff88003c7db82 mydriver!ProcessPacketSource+0x8b2
0xfffff88003c5d0d8 mydriver!ForwardPackets+0xb8
0xfffff88003c81102 mydriver!RoutePackets+0x142
0xfffff88003c83826 mydriver!RouteNetBufferLists+0x306
0xfffff88003c59a76 mydriver!DeviceSendPackets+0x156
0xfffff88003c59754 mydriver!ProcessingComplete+0x4a4
0xfffff88001b69b81 systemdriver2!ProcessEvent+0x1a1
0xfffff88001b3edc4 systemdriver1!CallChildDriver+0x20
0xfffff88001b3fc0a systemdriver1!ProcessEvent+0x3e
0xfffff800c3ea6eb9 nt!KiRetireDpcList+0x209
0xfffff800c3ea869a nt!KiIdleLoop+0x5a
Çıkışın en üstünde, sıra numarası enjekte edilen hataların sayısını gösterir. Bu örnekte, bu test çalıştırması sırasında eklenen ikinci hata gösterilmektedir. İşlem kimliği 0 olduğundan, bu sistem işlemidir. IRQL 2'dir, bu nedenle dağıtım düzeyinde çağrılır.
KmAutoFail, yığından Yığın Tabanlı Hata Ekleme sürücüsüdür. KmAutoFail işlev adı, Mydriver.sys'dan hangi işlev çağrısının kesildiğini ve hatanın enjekte edildiğini gösterir. Burada başarısız olan işlev ExAllocatePoolWithTag. KmAutoFail'de Ntoskrnl.sys veya Ndis.sys çağrılarına müdahale eden tüm işlevler bu adlandırma kuralını kullanır. Ardından, test edilen sürücüyle (Mydriver.sys) çağrı yığınını göreceğiz. Bu, çağrı yığınının yığının benzersizliğini belirlemek için kullanılan bölümüdür. Bu nedenle, hata ayıklayıcısı uzantısı tarafından atılan her giriş çağrı yığınının bu bölümünde benzersiz olur. Çağrı yığınının geri kalanı sürücüyü kimin çağırdiğini gösterir. Bunun temel önemi, sürücünün kullanıcı modundan mı (IOCTL yoluyla) yoksa çekirdek modu sürücüsünden mi çağrıldığıdır.
Dikkat edin ki, bir sürücü DriverEntry yordamından hata döndürdüyse, yüklemenin yeniden denenmesi normalde farklı bir bellek konumunda gerçekleşir. Bu durumda, önceki konumdaki çağrı yığını muhtemelen sürücü yığın bilgileri yerine "çöp" içerir. Ama bu bir sorun değil; sürücünün enjekte edilen hatayı doğru işlediğini bildirir.
Bu sonraki girdi, kullanıcı modundan IOCTL yoluyla sürücüye yapılan çağrıyı gösterir. İşlem kimliğini ve IRQ düzeyini not edin. Mydriver.sys bir NDIS filtre sürücüsü olduğundan, IOCTL Ndis.sysaracılığıyla geldi. Dikkat edin, nt!NtDeviceIoControlFile yığındadır. Sürücünüzde IOCTL'leri kullanan herhangi bir testi çalıştırdığınızda, bu işlevden geçecektir.
Sequence: 5, Test Number: 0, Process ID: 2052, Thread ID: 4588
IRQ Level: 0, HASH: 0xecd4650e9c25ee4
0xfffff8800129ed83 kmautofail!ShimHookExAllocatePoolWithTag+0x37
0xfffff88003c6fb39 mydriver!SendMultipleOids+0x41
0xfffff88003c7157b mydriver!PvtDisconnect+0x437
0xfffff88003c71069 mydriver!NicDisconnect+0xd9
0xfffff88003ca3538 mydriver!NicControl+0x10c
0xfffff88003c99625 mydriver!DeviceControl+0x4c5
0xfffff88001559d93 NDIS!ndisDummyIrpHandler+0x73
0xfffff88001559339 NDIS!ndisDeviceControlIrpHandler+0xc9
0xfffff800c445cc96 nt!IovCallDriver+0x3e6
0xfffff800c42735ae nt!IopXxxControlFile+0x7cc
0xfffff800c4274836 nt!NtDeviceIoControlFile+0x56
0xfffff800c3e74753 nt!KiSystemServiceCopyEnd+0x13
Yığın Tabanlı Hata Enjeksiyonu Sonuçlarının Analizi
Testlerinizi sürücünüzde yürütüyorsunuz ve aniden bir sorunla karşılaştınız. Büyük olasılıkla bu bir hata denetimiydi, ancak bilgisayar yanıt vermemeye başladığından da olabilir. Nedenini nasıl buldun? Hata denetimi olduğunu varsayarsak, önce eklenen hataların listesini bulmak için yukarıdaki uzantıyı kullanın, ardından hata ayıklayıcı komutunu kullanın: !analyze –v.
En yaygın hata denetimi, bir ayırmanın başarısını kontrol etmeme nedeniyle oluşur. Bu durumda, hata denetimi analizindeki yığın büyük olasılıkla eklenen son hatayla neredeyse aynıdır. Başarısız ayırmadan sonraki bir noktada (genellikle en sonraki satır), sürücü null işaretçisine erişecektir. Bu tür bir hatayı düzeltmek çok kolaydır. Bazen başarısız olan ayırma listede birinci veya ikinci sırada olabilir, ancak bu tür sorunları bulmak ve düzeltmek yine de çok kolaydır.
İkinci en yaygın hata denetimi temizleme sırasında gerçekleşir. Bu durumda, sürücü büyük olasılıkla ayırma hatasını algıladı ve temizlemeye atladı; ancak temizleme sırasında sürücü işaretçiyi denetlemedi ve bir kez daha null işaretçiye erişti. Yakından ilişkili bir durum, temizlemenin iki kez çağrılabileceği durumdur. Temizleme, işaretçiyi serbest bırakıldıktan sonra null olarak ayarlamazsa, temizleme işlevi ikinci kez çağrıldığında yapıyı serbest bırakmaya çalışır ve bu da bir hata denetimiyle sonuçlanır.
Bilgisayarın yanıt vermemeye başlamasına neden olan hataları tanılamak daha zordur, ancak hata ayıklama yordamı benzerdir. Bu hatalar genellikle başvuru sayısı veya döngü kilidi sorunlarından kaynaklanmaktadır. Neyse ki, Sürücü Doğrulayıcı, birçok spin lock sorununu, problemlere yol açmadan önce yakalayacaktır. Bu gibi durumlarda, hata ayıklayıcıyı tetikleyin ve Yığın Tabanlı Hata Ekleme tarafından eklenen hataların listesini dökümleyin. En son hatalarla ilgili koda hızlı bir bakış, hatadan önce alınan ancak sonra yayımlanmayan bir referans sayısı olabilir. Aksi takdirde, sürücünüzde bir spin lock bekleyen bir iş parçacığını veya açıkça yanlış olan herhangi bir referans sayısını kontrol edin.