Aracılığıyla paylaş


Video: WDF kaynak koduyla sürücünüzde hata ayıklama

Bu konu, WDF kaynak koduna tam erişim sağlanarak Windows Driver Frameworks (WDF) sürücünüzde nasıl hata ayıklanacağını gösteren bir video öğretici içerir. Videodan sonra, kolay başvurmak için videoda takip edilen adım adım prosedür yer alır.

WDF kaynak hata ayıklama, WDF kaynak kodunu indirmeye gerek kalmadan çerçeve koduna serbestçe adımlamanızı sağlar. Hata ayıklayıcı, GitHub'dan otomatik olarak doğru WDF sürümünü indirir.

Örneğin, Windows 10 makinesinde WDF sürücünüzün hatalarını ayıklamak için WinDbg kullanıyorsanız ve hata ayıklayıcı çağrı yığınında çerçeve koduyla bozuksa, Çağrı Yığını görünümünde WDF çerçevesine çift tıklayabilir ve WinDbg ilgili WDF kaynak dosyasını eşleşen satırda otomatik olarak indirip açar. Ardından kodda adım adım ilerleyebilir ve kesme noktaları ayarlayabilirsiniz.

Bu özellik Windows 10, Technical Preview derleme 10041 veya sonraki sürümlerin genel sürümlerini çalıştıran hedef sistemler için kullanılabilir. Bu derlemeler, Microsoft Genel Sembol Sunucusu'nda KMDF (Wdf01000.sys) ve UMDF (Wudfx02000.dll) için özel kaynak dizinli sembol dosyalarına sahiptir. WDF kodunun kaynak düzeyinde hata ayıklaması yalnızca WinDbg'de kullanılabilir, Visual Studio hata ayıklayıcısında kullanılamaz.

Hızlı Başlangıç

Hedef makinede bir WinDbg çekirdeği hata ayıklama oturumu başlatın, oturum açın ve şu adımları izleyin:

  1. .symfix kullanarak varsayılan simge yolunu ayarlayın. Bu, sembol yolunu konumundaki https://msdl.microsoft.com/download/symbolssembol sunucusuna işaret etmek için ayarlar.

    kd> .symfix

  2. .srcfix kullanarak varsayılan kaynak yolunu ayarlayın. Bu, kaynak yolu srv* olarak ayarlar ve hata ayıklayıcıya hedef modüllerin sembol dosyalarında belirtilen konumlardan kaynak dosyaları almasını söyler.

    kd> .srcfix
    Source search path is: SRV*
    
  3. .reload kullanarak simgeleri yeniden yükleyin ve Wdf01000.sys simgelerinin (veya UMDF için Wudfx02000.dll) kaynak dizine eklendiğini onaylayın. Aşağıdaki !lmi çıktısında gösterildiği gibi, Wdf01000.sys PDB kaynak indekslidir. Sizinki değilse, aşağıdaki WinDbg Kurulumu bölümüne bakın.

    kd> .reload
    ...
    
    kd> !lmi wdf01000.sys
    Loaded Module Info: [wdf01000.sys] 
    ...
    Load Report: private symbols & lines, source indexed 
    C:\...\Wdf01000.pdb\...\Wdf01000.pdb
    
  4. Artık hazırsınız! WDF kaynak kodunda adım adım ilerleyecek kolay bir yol, çerçevenin IRP dağıtım yordamında bir kesme noktası ayarlamak ve kodun geri kalanında adım adım ilerleyebilmektir. Bir Windows sisteminde birçok yerleşik KMDF sürücüsü olduğundan, WDF her zaman yüklüdür ve çalışır, bu nedenle bu kesme noktasına hemen ulaşılır (kendi sürücünüzü yüklemenize gerek kalmadan).

    kd> bp Wdf01000!FxDevice::DispatchWithLock
    kd> g
    Breakpoint 0 hit
    Wdf01000!FxDevice::DispatchWithLock:
    87131670 8bff mov edi,edi 
    

Bu işe yaramazsa aşağıdaki WinDbg Kurulumu adımlarını gözden geçirin.

WinDbg Kurulumu

Yukarıdaki örnek beklendiği gibi çalışmadıysa aşağıdaki yönergelerden birini veya daha fazlasını gerçekleştirmeniz gerekebilir.

Kaynak Modu Hata Ayıklamasını Etkinleştirme

Kaynak Modu'nda hata ayıklamanın etkinleştirildiğinden emin olun. Hata Ayıklama menüsünü açın ve Kaynak Modu'nun işaretli olduğunu onaylayın.

Eski Simgeler Önbelleğini Temizle

Daha önce aynı Windows hedefi için WDF sürücülerinin hatalarını ayıkladıysanız, kaynak dizine alınmamış yerel olarak önbelleğe alınmış WDF simgelerini kullanıyor olabilirsiniz. Bunu !lmi komutuyla de kontrol edebilirsiniz:

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, not source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

Yukarıdaki Yük Raporu'na göre Wdf01000.pdb kaynak dizinlenmiş değil. Bu, yerel WinDbg sembolleri önbelleğinizin eski olduğu anlamına gelir. Bunu düzeltmek için PDB'yi WinDbg'den kaldırın, yerel önbelleği temizleyin (yolunuz yukarıdaki !lmi çıkışına göre farklılık gösterebilir) ve PDB'yi yeniden yükleyin:

kd> .reload /u Wdf01000.sys

CMD> del
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

kd> .reload Wdf01000.sys

Şimdi yeniden denetlemek için !lmi komutunu çalıştırın: PDB kaynak dizini oluşturulmuş olarak görünmelidir ve bir kaynak kodu penceresi açılmalıdır.

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb 

WDF kaynak düzeyinde hata ayıklamayı yalnızca canlı hata ayıklama ve kilitlenme dökümlerini analiz etmek için değil, aynı zamanda IRP dağıtıcısı gibi temel işlevlerde kesme noktaları ayarlayarak ve sonraki kod yollarını keşfederek çerçeve iç bileşenleri hakkında daha fazla bilgi edinmek için de kullanabilirsiniz.