Aracılığıyla paylaş


Hata Ayıklama Sürücüleri - Adım Adım Laboratuvar (Sysvad Çekirdek Modu)

Bu laboratuvar, Sysvad ses çekirdek modu cihaz sürücüsünde hata ayıklamayı gösteren uygulamalı alıştırmalar sağlar.

Microsoft Windows Hata Ayıklayıcısı (WinDbg), kullanıcı modu ve çekirdek modu hata ayıklaması gerçekleştirmek için kullanabileceğiniz güçlü bir Windows tabanlı hata ayıklama aracıdır. WinDbg, Windows çekirdeği, çekirdek modu sürücüleri ve sistem hizmetlerinin yanı sıra kullanıcı modu uygulamaları ve sürücüleri için kaynak düzeyinde hata ayıklama sağlar.

WinDbg kaynak kodda adım adım ilerleyebilir, kesme noktaları ayarlayabilir, değişkenleri (C++ nesneleri dahil), yığın izlemelerini ve belleği görüntüleyebilir. Hata Ayıklayıcısı Komut penceresi, kullanıcının çok çeşitli komutlar vermesine olanak tanır.

Laboratuvar kurulumu

Laboratuvarı tamamlamak için aşağıdaki donanıma ihtiyacınız olacaktır:

  • Windows 10 çalıştıran bir dizüstü veya masaüstü bilgisayar (ana bilgisayar)
  • Windows 10 çalıştıran bir dizüstü veya masaüstü bilgisayar (hedef)
  • İki bilgisayarı bağlamak için bir ağ hub'ı/yönlendirici ve ağ kabloları
  • Sembol dosyalarını indirmek için İnternet'e erişim

Laboratuvarı tamamlayabilmeniz için aşağıdaki yazılıma ihtiyacınız olacaktır.

  • Microsoft Visual Studio 2017
  • Windows 10 için Windows Yazılım Geliştirme Seti (SDK)
  • Windows 10 için Windows Sürücü Seti (WDK)
  • Windows 10 için örnek Sysvad ses sürücüsü

WDK'yi indirme ve yükleme hakkında bilgi için bkz. windows sürücü setini (WDK) indirme .

Sysvad hata ayıklama kılavuzu

Bu laboratuvar, çekirdek modu sürücüsünde hata ayıklama işleminde size yol gösterir. Alıştırmalarda Syvad sanal ses sürücüsü örneği kullanılır. Syvad ses sürücüsü gerçek ses donanımıyla etkileşim kurmadığından çoğu cihazda kullanılabilir. Laboratuvar aşağıdaki görevleri kapsar:

Yankı sürücüsü laboratuvarı

Echo sürücüsü Sysvad ses sürücüsünden daha basit bir sürücüdür. WinDbg'e yeniyseniz, önce Evrensel Sürücülerde Hata Ayıklama - Adım Adım Laboratuvar (Echo çekirdek modu)'nu tamamlamayı düşünebilirsiniz. Bu laboratuvar, bu laboratuvardaki kurulum yönergelerini yeniden kullanabildiği için bu laboratuvarı tamamladıysanız buradaki 1. ve 2. bölümleri atlayabilirsiniz.

Bölüm 1: Çekirdek modu WinDbg oturumuna bağlanma

Bölüm 1'de ana bilgisayarda ve hedef sistemde ağ hata ayıklamasını yapılandıracaksınız.

Bu laboratuvardaki bilgisayarların çekirdek hata ayıklaması için Ethernet ağ bağlantısı kullanacak şekilde yapılandırılması gerekir.

Bu laboratuvarda iki bilgisayar kullanılır. WinDbg konak sisteminde, Sysvad sürücüsü ise hedef sistemde çalışır.

İki bilgisayarı bağlamak için bir ağ hub'ı/yönlendirici ve ağ kabloları kullanın.

Ağ hub'ı/yönlendiricisi aracılığıyla bağlanan iki bilgisayarı gösteren diyagram.

Çekirdek modu uygulamalarıyla çalışmak ve WinDbg kullanmak için Ethernet üzerinden KDNET aktarımını kullanmanızı öneririz. Ethernet aktarım protokollerini kullanma hakkında bilgi için bkz. WinDbg ile Çalışmaya Başlama (Kernel-Mode). Hedef bilgisayarı ayarlama hakkında daha fazla bilgi için bkz. Bilgisayarı El ile Sürücü Dağıtımına Hazırlama ve KDNET Ağ Çekirdeği Hata Ayıklamasını Otomatik Olarak Ayarlama.

Ethernet kullanarak çekirdek modu hata ayıklamayı yapılandırma

Hedef sistemde çekirdek modu hata ayıklamasını etkinleştirmek için aşağıdaki adımları gerçekleştirin.

<- Konak sisteminde

  1. Konak sisteminde bir komut istemi açın ve IP adresini belirlemek için ipconfig /all yazın.
C:\>ipconfig /all
Windows IP Configuration

 Host Name . . . . . . . . . . . . : TARGETPC
...

Ethernet adapter Ethernet:
   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::c8b6:db13:d1e8:b13b3
   Autoconfiguration IPv4 Address. . : 169.182.1.1
   Subnet Mask . . . . . . . . . . . : 255.255.0.0
   Default Gateway . . . . . . . . . :
  1. Konak Sisteminin IP adresini kaydedin: ______________________________________

  2. Ana sistemin ana bilgisayar adını kaydedin: ______________________________________

-> Hedef sistemde

  1. Hedef sistemde bir komut istemi açın ve ping komutunu kullanarak iki sistem arasındaki ağ bağlantısını onaylayın. Örnek çıktıda gösterilen 169.182.1.1 yerine kaydettiğiniz konak sisteminin gerçek IP adresini kullanın.
C:\> ping 169.182.1.1

Pinging 169.182.1.1 with 32 bytes of data:
Reply from 169.182.1.1: bytes=32 time=1ms TTL=255
Reply from 169.182.1.1: bytes=32 time<1ms TTL=255
Reply from 169.182.1.1: bytes=32 time<1ms TTL=255
Reply from 169.182.1.1: bytes=32 time<1ms TTL=255

Ping statistics for 169.182.1.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 1ms, Average = 0ms

Hedef sistemde çekirdek modu hata ayıklamasını etkinleştirmek üzere KDNET yardımcı programını kullanmak için aşağıdaki adımları gerçekleştirin.

  1. Konak sisteminde WDK KDNET dizinini bulun. Varsayılan olarak burada bulunur.

    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64

Bu laboratuvar, her iki bilgisayarın da hem hedef hem de konakta Windows'un 64 bit sürümünü çalıştırdığını varsayar. Durum böyle değilse, en iyi yaklaşım, hedefte çalıştırılan sistemle aynı "bit değerine" sahip araçları konakta çalıştırmaktır. Örneğin, hedef 32 bit Windows çalıştırıyorsa, konakta hata ayıklayıcının 32 sürümünü çalıştırın. Daha fazla bilgi için bkz. 32 Bit veya 64 Bit Hata Ayıklama Araçlarını Seçme.

  1. Bu iki dosyayı bulun ve hedef bilgisayarda kullanılabilmeleri için bir ağ paylaşımına veya başparmak sürücüsüne kopyalayın.

    kdnet.exe

    VerifiedNICList.xml

  2. Hedef bilgisayarda, Yönetici olarak bir Komut İstemi penceresi açın. Hedef bilgisayardaki NIC'nin desteklendiğini doğrulamak için bu komutu girin.

C:\KDNET>kdnet

Network debugging is supported on the following NICs:
busparams=0.25.0, Intel(R) 82579LM Gigabit Network Connection, KDNET is running on this NIC.kdnet.exe
  1. Konak sisteminin IP adresini ayarlamak için bu komutu yazın. Örnek çıktıda gösterilen 169.182.1.1 yerine kaydettiğiniz konak sisteminin gerçek IP adresini kullanın. Çalıştığınız her hedef/konak çifti için 50010 gibi benzersiz bir bağlantı noktası adresi seçin.
C:\>kdnet 169.182.1.1 50010

Enabling network debugging on Intel(R) 82577LM Gigabit Network Connection.
Key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p

Önemli

Önyükleme bilgilerini değiştirmek için BCDEdit'i kullanmadan önce, test bilgisayarında BitLocker ve Güvenli Önyükleme gibi Windows güvenlik özelliklerini geçici olarak askıya almanız gerekebilir. Test tamamlandığında bu güvenlik özelliklerini yeniden etkinleştirin ve güvenlik özellikleri devre dışı bırakıldığında test bilgisayarını uygun şekilde yönetin. Güvenli önyükleme genellikle UEFI'de devre dışı bırakılır. UEFI ayarına erişmek için Sistem, Kurtarma, Gelişmiş başlatma'yı kullanın. Yeniden başlatıldığında Sorun Giderme, Gelişmiş seçenekler, UEFI Üretici Yazılımı ayarları'nı seçin. UEFI seçeneklerinin yanlış ayarlanması veya BitLocker'ın devre dışı bırakılması sistemin çalışamaz duruma gelmesi için dikkatli olun.

  1. Dbgsetting'lerin düzgün ayarlandığını onaylamak için bu komutu yazın.
C:\> bcdedit /dbgsettings
busparams               0.25.0
key                     2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
debugtype               NET
hostip                  169.182.1.1
port                    50010
dhcp                    Yes
The operation completed successfully.

Otomatik olarak oluşturulan benzersiz anahtarı, ana bilgisayarda yazmak zorunda kalmamak için bir metin dosyasına kopyalayın. Anahtarla birlikte metin dosyasını konak sistemine kopyalayın.

NotGüvenlik duvarları ve hata ayıklayıcıları

Güvenlik duvarından bir açılır ileti alırsanız ve hata ayıklayıcısını kullanmak istiyorsanız, kutuların üçünü de işaretleyin.

Windows Güvenlik Duvarı'nın bir uygulamanın bazı özelliklerini engellediğini gösteren Windows Güvenlik Uyarısı'nın ekran görüntüsü.

<- Konak sisteminde

  1. Ana bilgisayarda, Yönetici olarak bir Komut İstemi penceresi açın. WinDbg.exe dizinine geçin. Windows seti yüklemesi kapsamında yüklenen Windows Sürücü Kiti'nden (WDK) WinDbg.exe x64 sürümünü kullanacağız.
C:\> Cd C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 
  1. Aşağıdaki komutu kullanarak uzak kullanıcı hata ayıklaması ile WinDbg'yi başlatın. Anahtarın ve bağlantı noktasının değeri, hedefte BCDEdit kullanarak daha önce ayarladığınız değerle eşleşmektedir.
C:\> WinDbg –k net:port=50010,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p

->Hedef sistemde

Hedef sistemi yeniden başlatın.

<-Konak sisteminde

Bir veya iki dakika içinde, ana bilgisayar sisteminde hata ayıklama çıktısı görüntülenmelidir.

Canlı çekirdek bağlantısından komut penceresi çıkışını görüntüleyen Windows Hata Ayıklayıcısı'nın ekran görüntüsü.

Hata Ayıklayıcı Komut penceresi, WinDbg'deki birincil hata ayıklama bilgileri penceresidir. Hata ayıklayıcı komutlarını girebilir ve komut çıkışını bu pencerede görüntüleyebilirsiniz.

Debugger Komut penceresi iki panele ayrılır. Komutları pencerenin alt kısmındaki daha küçük bölmeye (komut giriş bölmesi) yazar ve komut çıkışını pencerenin en üstündeki daha büyük bölmede görüntülersiniz.

Komut girişi bölmesinde, komut geçmişinde gezinmek için yukarı ok ve aşağı ok tuşlarını kullanın. Bir komut görüntülendiğinde, komutu düzenleyebilir veya ENTER tuşuna basarak komutu çalıştırabilirsiniz.

Bölüm 2: çekirdek modu hata ayıklama komutları ve teknikleri

Bölüm 2'de, hedef sistem hakkındaki bilgileri görüntülemek için hata ayıklama komutlarını kullanacaksınız.

<- Konak sisteminde

.prefer_dml ile Hata Ayıklayıcı biçimlendirme dilini (DML) etkinleştirme

Bazı hata ayıklama komutları, daha hızlı bilgi toplamak için seçebileceğiniz Hata Ayıklayıcı biçimlendirme dilini kullanarak metin görüntüler.

  1. Hedef sistemde çalışan koda girmek için WinDBg'de Ctrl+Break (Kaydırma Kilidi) tuşlarını kullanın. Hedef sistemin yanıt vermesi biraz zaman alabilir.
  2. Hata Ayıklayıcısı Komut penceresinde DML'yi etkinleştirmek için aşağıdaki komutu yazın.
0: kd> .prefer_dml 1
DML versions of commands on by default

Yardım almak için .hh kullanma

.hh komutunu kullanarak başvuru komutu yardımına erişebilirsiniz.

  1. .prefer_dml için komut başvurusu yardımını görüntülemek için aşağıdaki komutu yazın.
    0: kd> .hh .prefer_dml
    

Hata Ayıklayıcı yardım dosyası .prefer_dml komutu için yardım görüntüleyecektir.

.prefer-dml komutu için yardım görüntüleyen Hata Ayıklayıcı Yardımı uygulamasının ekran görüntüsü.

Hedef sistemde Windows sürümünü görüntüleme

  1. WinDbg penceresine vertarget (Hedef Bilgisayar Sürümünü Göster) komutunu yazarak hedef sistemde ayrıntılı sürüm bilgilerini görüntüleyin.
0: kd> vertarget
Windows 10 Kernel Version 9926 MP (4 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 9926.0.amd64fre.fbl_awesome1501.150119-1648
Machine Name: ""
Kernel base = 0xfffff801`8d283000 PsLoadedModuleList = 0xfffff801`8d58aef0
Debug session time: Fri Feb 20 10:15:17.807 2015 (UTC - 8:00)
System Uptime: 0 days 01:31:58.931

Yüklenen modülleri listeleme

  1. WinDbg penceresine lm (Yüklenen Modülleri Listele) komutunu yazarak yüklenen modülleri görüntüleyerek doğru çekirdek modu işlemiyle çalıştığınızı doğrulayabilirsiniz.
0: Kd> lm
start             end                 module name
fffff801`09200000 fffff801`0925f000   volmgrx    (no symbols)           
fffff801`09261000 fffff801`092de000   mcupdate_GenuineIntel   (no symbols)           
fffff801`092de000 fffff801`092ec000   werkernel   (export symbols)       werkernel.sys
fffff801`092ec000 fffff801`0934d000   CLFS       (export symbols)       CLFS.SYS
fffff801`0934d000 fffff801`0936f000   tm         (export symbols)       tm.sys
fffff801`0936f000 fffff801`09384000   PSHED      (export symbols)       PSHED.dll
fffff801`09384000 fffff801`0938e000   BOOTVID    (export symbols)       BOOTVID.dll
fffff801`0938e000 fffff801`093f7000   spaceport   (no symbols)           
fffff801`09400000 fffff801`094cf000   Wdf01000   (no symbols)           
fffff801`094d9000 fffff801`09561000   CI         (export symbols)       CI.dll
...

Not Çıkartılan çıktı "..." ile gösterilir " bu laboratuvarda.

Henüz sembol yolunu ayarlamadığımız ve sembolleri yüklediğimiz için hata ayıklayıcıda sınırlı bilgi sağlanır.

Bölüm 3: Sysvad ses sürücüsünü indirme ve derleme

Bölüm 3'te Sysvad ses sürücüsünü indirip oluşturacaksınız.

Genellikle WinDbg kullanırken kendi sürücü kodunuzla çalışıyor olursunuz. Ses sürücülerinin hatalarını ayıklama hakkında bilgi sahibi olmak için Sysvad sanal ses örnek sürücüsü kullanılır. Bu örnek, yerel çekirdek modu kodu aracılığıyla nasıl tek adım atabileceğinizi göstermek için kullanılır. Bu teknik, karmaşık çekirdek modu kod sorunlarının hatalarını ayıklamak için çok değerli olabilir.

Sysvad örnek ses sürücüsünü indirip oluşturmak için aşağıdaki adımları uygulayın.

  1. GitHub'dan Sysvad ses örneğini indirme ve ayıklama

    Sysvad örneğini ve Readme.md dosyasını burada görüntülemek için bir tarayıcı kullanabilirsiniz:

    https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad

    Genel klasörü ve ZIP'i İndir düğmesini görüntüleyen GitHub deposunun ekran görüntüsü.

    Bu bölümde evrensel sürücü örneklerinin tek bir zip dosyasında nasıl indirileceği gösterilmektedir.

    a. master.zip dosyasını yerel sabit sürücünüze indirin.

    https://github.com/Microsoft/Windows-driver-samples/archive/master.zip

    b. Windows-driver-samples-master.zipseçip basılı tutun (veya sağ tıklayın) ve Tümünü Ayıkla'yı seçin. Yeni bir klasör belirtin veya ayıklanan dosyaları depolayacak mevcut klasöre göz atın. Örneğin, dosyaların ayıklandığı yeni klasör olarak C:\WDK_Samples\ belirtebilirsiniz.

    ç. Dosyalar ayıklandıktan sonra aşağıdaki alt klasöre gidin.

    C:\WDK_Samples\Sysvad

  2. Visual Studio'da sürücü çözümünü açma

    Visual Studio'da Dosya>Proje/Çözüm Aç>... öğesini seçin ve ayıklanan dosyaları içeren klasöre gidin (örneğin, C:\WDK_Samples\Sysvad). Syvad çözüm dosyasına çift tıklayın.

    Visual Studio'da Çözüm Gezgini'ni bulun. (Bu henüz açık değilse, Görünümmenüsünden Çözüm Gezgini'ni seçin.) Çözüm Gezgini'nde, bir dizi projesi olan bir çözüm görebilirsiniz.

    Adapter.cpp dosyasının Sysvad projesinden yüklendiği Visual Studio'nun ekran görüntüsü.

  3. Örneğin yapılandırmasını ve platformunu ayarlama

    Çözüm Gezgini'nde 'sysvad' Çözümünü (7 projeden 7'sinde) seçip basılı tutun (veya sağ tıklayın) ve Configuration Manager'ı seçin. Yapılandırma ve platform ayarlarının dört proje için aynı olduğundan emin olun. Varsayılan olarak, yapılandırma "Win10 Debug" olarak ayarlanır ve platform tüm projeler için "Win64" olarak ayarlanır. Bir proje için yapılandırma ve/veya platform değişiklikleri yaparsanız, kalan üç proje için de aynı değişiklikleri yapmanız gerekir.

    Not Bu laboratuvarda 64 bit Windows'un kullanıldığı varsayılır. 32 bit Windows kullanıyorsanız sürücüyü 32 bit için derleyin.

  4. Sürücü imzalamayı kontrol et

    TabletAudioSample'i bulun. Sysvad sürücüsünün özellik sayfasını açın ve Sürücü İmzalama>İmza modu'nunTest İşareti olarak ayarlandığından emin olun.

  5. Sürücü örneklerinin, mevcut sürücülerle örtüşmeyen değerleri kullanacak şekilde değiştirilmesi gerekir. Örnek Koddan Üretim Sürücüsüne - Windows'ta yüklü mevcut gerçek sürücülerle beraber var olacak benzersiz bir sürücü örneğinin nasıl oluşturulacağı konusunda bilgi için, numaralı örneklerde yapılması gerekenlere bakın.

  6. Visual Studio kullanarak örneği derleme

    Visual Studio'da Yapı>Yapı Çözümüseçeneğini seçin.

    Derleme pencerelerinin altı projenin de derlemesinin başarılı olduğunu belirten bir ileti görüntülemesi gerekir.

Tavsiye

Derleme hata iletisiyle karşılaşırsanız, bir düzeltme belirlemek için derleme hata numarasını kullanın. Örneğin, MSBuild hatası MSB8040, spectre riskini azaltılmış kitaplıklarla nasıl çalışıldığını açıklar.

  1. Yerleşik sürücü dosyalarını bulma

    Dosya Gezgini'nde, örneğin ayıklanan dosyalarını içeren klasöre gidin. Örneğin, daha önce belirttiğiniz klasör buysa C:\WDK_Samples\Sysvad konumuna gidersiniz. Bu klasör içinde, derlenen sürücü dosyalarının konumu Configuration Manager'da seçtiğiniz yapılandırma ve platform ayarlarına bağlı olarak değişir. Örneğin, varsayılan ayarları değiştirmeden bıraktıysanız, derlenen sürücü dosyaları 64 bit hata ayıklama derlemesi için \x64\Debug adlı bir klasöre kaydedilir.

    TabletAudioSample sürücüsü için oluşturulan dosyaları içeren klasöre gidin:

    C:\WDK_Samples\Sysvad\TabletAudioSample\x64\Debug. Klasör TabletAudioSample .SYS sürücüsünü, sembol pdp dosyasını ve inf dosyasını içerir. DelayAPO, KWSApo ve KeywordDetectorContosoAdapter dll'lerini ve sembol dosyalarını da bulmanız gerekir.

    Sürücüyü yüklemek için aşağıdaki dosyalara ihtiyacınız vardır.

    Dosya adı Açıklama
    TabletAudioSample.sys Sürücü dosyası.
    TabletAudioSample.pdb Sürücü sembol dosyası.
    tabletaudiosample.inf Sürücüyü yüklemek için gereken bilgileri içeren bir bilgi (INF) dosyası.
    KeywordDetectorContosoAdapter.dll Örnek anahtar sözcük algılayıcısı.
    KeywordDetectorContosoAdapter.pdb Örnek anahtar sözcük algılayıcısı sembol dosyası.
    DelayAPO.dll Örnek gecikme APO.
    DelayAPO.pdb APO sembol dosyasının gecikmesi.
    KWSApo.dll Örnek anahtar kelime algılayıcı APO.
    KWSApo.pdb Anahtar sözcük benekleyici sembol dosyası.
    TabletAudioSample.cer TabletAudioSample sertifika dosyası.
  2. Bir USB başparmak sürücüsü bulun veya yerleşik sürücü dosyalarını konaktan hedef sisteme kopyalamak için bir ağ paylaşımı ayarlayın.

Sonraki bölümde, kodu hedef sisteme kopyalayıp sürücüyü yükleyip test edin.

Bölüm 4: Sysvad ses sürücüsü örneğini hedef sisteme yükleme

Bölüm 4'te, Sysvad ses sürücüsünü yüklemek için devcon kullanacaksınız.

-> Hedef sistemde

Sürücüyü yüklediğiniz bilgisayara hedef bilgisayar veya sınama bilgisayarıdenir. Genellikle bu, sürücü paketini geliştirip oluşturduğunuz bilgisayardan ayrı bir bilgisayardır. Sürücüyü geliştirip oluşturduğunuz bilgisayaraana bilgisayar adı verilir.

Sürücü paketini hedef bilgisayara taşıma ve sürücüyü yükleme işlemine, sürücü dağıtma adı verilir.

Bir sürücüyü dağıtmadan önce, test imzalamayı açarak hedef bilgisayarı hazırlamanız gerekir. Bundan sonra, hedef sistemde yerleşik sürücü örneğini çalıştırmaya hazırsınız.

Sürücüyü hedef sisteme yüklemek için aşağıdaki adımları uygulayın.

  1. Test imzalı sürücüleri etkinleştirme

    Test imzalı sürücüleri çalıştırma özelliğini etkinleştirmek için:

    1. Windows Ayarları'nı açın.

    2. Güncelleştirme ve Güvenlikbölümünde Kurtarmaseçeneğini seçin.

    3. Gelişmiş Başlangıç altında, Şimdi Yeniden Başlat'ı seçin.

    4. Bilgisayar yeniden başlatıldığında Sorun Gider'i seçin.

    5. Ardından Gelişmiş seçenekler'i, Başlangıç Ayarları'nı ve ardından Yeniden Başlat'ı seçin.

    6. F7 tuşuna basarak Sürücü imzası zorlamasını devre dışı bırak'ı seçin.

    7. Bilgisayar yeni değerlerle başlar.

  2. -> Hedef sistemde

    Sürücüyü yükleme

    Aşağıdaki yönergelerde örnek sürücüyü yükleme ve test etme adımları gösterilmektedir.

    Bu sürücüyü yüklemek için gereken INF dosyası TabletAudioSample.inf dosyasıdır. Hedef bilgisayarda, Yönetici olarak bir Komut İstemi penceresi açın. Sürücü paketi klasörünüze gidin, TabletAudioSample.inf dosyasına sağ tıklayın ve yükle'yi seçin.

    Test sürücüsünün imzasız bir sürücü olduğunu belirten bir iletişim kutusu görüntülenir. Devam etmek için yine de bu sürücüyü yükle seçeneğini belirleyin .

    Windows'un yayımcıyı doğrulayamadığını belirten Windows Güvenlik Uyarısı'nın ekran görüntüsü.

    Tavsiye

     Yüklemeyle ilgili herhangi bir sorun yaşıyorsanız daha fazla bilgi için aşağıdaki dosyaya bakın. %windir%\inf\setupapi.dev.log

    Daha ayrıntılı yönergeler için bkz. Bir Bilgisayarı Sürücü Dağıtımı, Testi ve Hata Ayıklama için Yapılandırma.

    INF dosyası ,tabletaudiosample.sysyüklemek için donanım kimliğini içerir. Syvad örneği için donanım kimliği: root\sysvad_TabletAudioSample

  3. Aygıt Yöneticisi'nde sürücüyü inceleme

    Hedef bilgisayardaki Komut İstemi penceresinde, Cihaz Yöneticisi'ni açmak için devmgmt girin. Cihaz Yöneticisi'ndeki Görünüm menüsünde Türe göre cihazlar'ı seçin.

    Cihaz ağacında, Ses Cihazı düğümünde Sanal Ses Cihazı (WDM) - Tablet Örneği'ni bulun. Bu genellikle Ses, video ve oyun denetleyicileri düğümü altındadır . Yüklü ve etkin olduğunu onaylayın.

    Cihaz Yöneticisi'nde bilgisayardaki gerçek donanımın sürücüsünü vurgulayın. Ardından sürücüyü seçip basılı tutun (veya sağ tıklayın) ve sürücüyü devre dışı bırakmak için Devre dışı bırak'ı seçin.

    Cihaz Yöneticisi'nde ses donanım sürücüsünün devre dışı olduğuna işaret eden bir aşağı ok simgesinin göründüğünü onaylayın.

    Sanal Ses Cihazı Tablet Örneği'nin vurgulandığı Cihaz Yöneticisi ağacının ekran görüntüsü.

    Örnek sürücüyü başarıyla yükledikten sonra test etmeye hazırsınız demektir.

Sysvad ses sürücüsünü test etme

  1. Hedef bilgisayardaki Komut İstemi penceresinde, Cihaz Yöneticisi'ni açmak için devmgmt girin. Cihaz Yöneticisi'ndeki Görünüm menüsünde Türe göre cihazlar'ı seçin. Cihaz ağacında Sanal Ses Cihazı (WDM) - Tablet Örneği'ni bulun.

  2. Denetim Masası'nı açın ve Donanım ve Ses>Yönetimi ses cihazları'na gidin. Ses iletişim kutusunda , Sanal Ses Cihazı (WDM) - Tablet Örneği olarak etiketli hoparlör simgesini seçin ve ardından Varsayılanı Ayarla'yı seçin, ancak Tamam'ı seçmeyin. Bu, Ses iletişim kutusunu açık tutar.

  3. Hedef bilgisayarda bir MP3 veya başka bir ses dosyası bulun ve çalmak için çift tıklayın. Ardından Ses iletişim kutusunda, Sanal Ses Cihazı (WDM) - Tablet Örnek sürücüsüyle ilişkili ses düzeyi göstergesinde etkinlik olduğunu doğrulayın.

Bölüm 5: Sürücü hakkındaki bilgileri görüntülemek için WinDbg kullanma

Bölüm 5'te, sysvad örnek sürücüsü hakkındaki bilgileri görüntülemek için sembol yolunu ayarlayıp çekirdek hata ayıklayıcısı komutlarını kullanacaksınız.

Simgeler, WinDbg'nin hata ayıklama sırasında çok değerli olabilecek değişken adları gibi ek bilgileri görüntülemesine olanak sağlar. WinDbg, kaynak düzeyinde hata ayıklama için Microsoft Visual Studio hata ayıklama simgesi biçimlerini kullanır. PDB sembol dosyalarını içeren bir modülden herhangi bir simgeye veya değişkene erişebilir.

Hata ayıklayıcısını yüklemek için aşağıdaki adımları uygulayın.

<-Konak sisteminde

  1. Hata ayıklayıcıyı kapattıysanız, yönetici komut istemi penceresinde aşağıdaki komutu kullanarak yeniden açın. Anahtarı ve bağlantı noktasını daha önce yapılandırdığınız değerle değiştirin.

    C:\> WinDbg –k net:port=50010,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
    
  2. Hedef sistemde çalışan kodda kesinti yapmak için Ctrl+Break (Scroll Lock) tuşlarını kullanın.

Simge yolunu ayarlama

  1. WinDbg ortamında semboller yolunu Microsoft sembol sunucusuna ayarlamak için .symfix komutunu kullanın.

    0: kd> .symfix
    
  2. Yerel sembollerinizi kullanmak üzere yerel simge konumunuzu eklemek için yolu .sympath+ kullanarak ekleyin ve ardından /f dosyasını yeniden yükleyin.

    0: kd> .sympath+ C:\WDK_Samples\Sysvad
    0: kd> .reload /f
    

    Not/f force seçeneğiyle .reload komutu, belirtilen modül için tüm sembol bilgilerini siler ve simgeleri yeniden yükler. Bazı durumlarda, bu komut modülün kendisini de yeniden yükler veya kaldırır.

Not WinDbg'nin sağladığı gelişmiş işlevleri kullanmak için uygun simgeleri yüklemeniz gerekir. Simgeleriniz düzgün yapılandırılmadıysa, sembollere bağımlı işlevleri kullanmaya çalıştığınızda simgelerin kullanılamadığını belirten iletiler alırsınız.

0:000> dv
Unable to enumerate locals, HRESULT 0x80004005
Private symbols (symbols.pri) are required for locals.
Type “.hh dbgerr005” for details.

NotSembol sunucuları

Simgelerle çalışmak için kullanılabilecek bir dizi yaklaşım vardır. Birçok durumda, gerektiğinde Microsoft'un sağladığı bir sembol sunucusundan sembollere erişmek için bilgisayarı yapılandırabilirsiniz. Bu kılavuzda bu yaklaşımın kullanılacağı varsayılır. Ortamınızdaki simgeler farklı bir konumdaysa, bu konumu kullanmak için adımları değiştirin. Ek bilgi için bkz. Windows hata ayıklayıcısı için sembol yolu.

NotKaynak kodu simgesi gereksinimlerini anlama

Kaynak hata ayıklaması gerçekleştirmek için, ikili dosyalarınızın denetimli (hata ayıklama) bir sürümünü oluşturmanız gerekir. Derleyici sembol dosyaları (.pdb dosyaları) oluşturur. Bu sembol dosyaları, hata ayıklayıcıya ikili talimatların kaynak satırlarına nasıl karşılık geldiğini gösterecektir. Gerçek kaynak dosyaların da hata ayıklayıcı tarafından erişilebilir olması gerekir.

Sembol dosyaları kaynak kodun metnini içermez. Hata ayıklama için en iyisi bağlayıcının kodunuzu iyileştirmemesidir. Kaynak hata ayıklama ve yerel değişkenlere erişim daha zordur ve kod iyileştirilmişse bazen neredeyse imkansızdır. Yerel değişkenleri veya kaynak satırları görüntülerken sorun yaşıyorsanız aşağıdaki derleme seçeneklerini ayarlayın.

set COMPILE_DEBUG=1

set ENABLE_OPTIMIZER=0

  1. Sysvad sürücüsü hakkındaki bilgileri görüntülemek için hata ayıklayıcının komut alanına aşağıdakileri yazın.

    0: kd> lm m tabletaudiosample v
    Browse full module list
    start             end                 module name
    fffff801`14b40000 fffff801`14b86000   tabletaudiosample   (private pdb symbols)  C:\Debuggers\sym\TabletAudioSample.pdb\E992C4803EBE48C7B23DC1596495CE181\TabletAudioSample.pdb
        Loaded symbol image file: tabletaudiosample.sys
        Image path: \SystemRoot\system32\drivers\tabletaudiosample.sys
        Image name: tabletaudiosample.sys
        Browse all global symbols  functions  data
        Timestamp:        Thu Dec 10 12:20:26 2015 (5669DE8A)
        CheckSum:         0004891E
    ...  
    

    Daha fazla bilgi için bkz. lm.

  2. A harfiyle başlayan öğe simgeleri hakkındaki bilgileri görüntülemek için hata ayıklama çıkışında Tüm genel simgelere gözat bağlantısını seçin.

  3. DML etkinleştirildiğinden, çıkışın bazı öğeleri seçebileceğiniz sık erişimli bağlantılardır. A harfiyle başlayan öğe simgeleriyle ilgili bilgileri görüntülemek için hata ayıklama çıkışındaki veri bağlantısını seçin.

    0: kd> x /D /f tabletaudiosample!a*
     A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    
    fffff806`9adb1000 tabletaudiosample!AddDevice (struct _DRIVER_OBJECT *, struct _DEVICE_OBJECT *)
    

    Daha fazla bilgi için bkz. x (Simgeleri İncele).

  4. !lmi uzantısı bir modülle ilgili ayrıntılı bilgileri görüntüler. !lmi tabletaudiosample yazın. Çıktınız aşağıda gösterilen metne benzer olmalıdır.

    0: kd> !lmi tabletaudiosample
    Loaded Module Info: [tabletaudiosample] 
             Module: tabletaudiosample
       Base Address: fffff8069ad90000
         Image Name: tabletaudiosample.sys
       Machine Type: 34404 (X64)
         Time Stamp: 58ebe848 Mon Apr 10 13:17:12 2017
               Size: 48000
           CheckSum: 42df7
    Characteristics: 22  
    Debug Data Dirs: Type  Size     VA  Pointer
                 CODEVIEW    a7,  e5f4,    d1f4 RSDS - GUID: {5395F0C5-AE50-4C56-AD31-DD5473BD318F}
                   Age: 1, Pdb: C:\Windows-driver-samples-master\audio\sysvad\TabletAudioSample\x64\Debug\TabletAudioSample.pdb
                       ??   250,  e69c,    d29c [Data not mapped]
         Image Type: MEMORY   - Image read successfully from loaded memory.
        Symbol Type: PDB      - Symbols loaded successfully from image header.
                     C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\TabletAudioSample.pdb\5395F0C5AE504C56AD31DD5473BD318F1\TabletAudioSample.pdb
           Compiler: Resource - front end [0.0 bld 0] - back end [14.0 bld 24210]
        Load Report: private symbols & lines, not source indexed 
                     C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\TabletAudioSample.pdb\5395F0C5AE504C56AD31DD5473BD318F1\TabletAudioSample.pdb
    
  5. Aşağıda gösterildiği gibi üst bilgi bilgilerini görüntülemek için !dh uzantısını kullanın.

    0: kd> !dh tabletaudiosample 
    
    File Type: EXECUTABLE IMAGE
    FILE HEADER VALUES
        8664 machine (X64)
           9 number of sections
    5669DE8A time date stamp Thu Dec 10 12:20:26 2015
    
           0 file pointer to symbol table
           0 number of symbols
          F0 size of optional header
          22 characteristics
                Executable
                App can handle >2gb addresses
    ...
    

Bölüm 6: Tak Çalıştır cihaz ağacı bilgilerini görüntüleme

Bölüm 6'da Sysvad örnek cihaz sürücüsü ve Tak Çalıştır cihaz ağacında nerede yaşadığı hakkında bilgi görüntüleyeceksiniz.

Tak ve Kullan cihaz ağacındaki cihaz sürücüsü hakkındaki bilgiler sorun giderme için yararlı olabilir. Örneğin, cihaz sürücüsü cihaz ağacında yerleşik değilse, cihaz sürücüsünün yüklenmesiyle ilgili bir sorun olabilir.

Cihaz düğümü hata ayıklama uzantısı hakkında daha fazla bilgi için bkz. !devnode.

<-Konak sisteminde

  1. Tak çalıştır cihaz ağacındaki tüm cihaz düğümlerini görmek için !devnode 0 1 komutunu girin. Bu komutun çalıştırılması bir veya iki dakika sürebilir. Bu süre boyunca WinDbg'nin durum alanında "*Meşgul" görüntülenir.

    0: kd> !devnode 0 1
    Dumping IopRootDeviceNode (= 0xffffe0005a3a8d30)
    DevNode 0xffffe0005a3a8d30 for PDO 0xffffe0005a3a9e50
      InstancePath is "HTREE\ROOT\0"
      State = DeviceNodeStarted (0x308)
      Previous State = DeviceNodeEnumerateCompletion (0x30d)
      DevNode 0xffffe0005a3a3d30 for PDO 0xffffe0005a3a4e50
        InstancePath is "ROOT\volmgr\0000"
        ServiceName is "volmgr"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeEnumerateCompletion (0x30d)
        DevNode 0xffffe0005a324560 for PDO 0xffffe0005bd95ca0…
    ...
    
  2. Cihaz sürücüsünün adını ( sysvad) aramak üzere oluşturulan çıktıda arama yapmak için Ctrl+F tuşlarını kullanın.

    Arama alanına 'sysvad' terimi girilmiş olan Bul iletişim kutusunu bulun.

    Adı sysvad_TabletAudioSample olan bir cihaz düğümü girişi, Syvad için !devnode çıkışında bulunur.

      DevNode 0xffffe00086e68190 for PDO 0xffffe00089c575a0
        InstancePath is "ROOT\sysvad_TabletAudioSample\0000"
        ServiceName is "sysvad_tabletaudiosample"
        State = DeviceNodeStarted (0x308)
    ...
    

    PDO adresinin ve DevNode adresinin görüntülendiğini unutmayın.

  3. !devnode 0 1 sysvad_TabletAudioSample Sysvad cihaz sürücümüzle ilişkili Tak Çalıştır bilgilerini görüntülemek için komutunu kullanın.

    0: kd> !devnode 0 1 sysvad_TabletAudioSample
    Dumping IopRootDeviceNode (= 0xffffe00082df8d30)
    DevNode 0xffffe00086e68190 for PDO 0xffffe00089c575a0
      InstancePath is "ROOT\sysvad_TabletAudioSample\0000"
      ServiceName is "sysvad_tabletaudiosample"
      State = DeviceNodeStarted (0x308)
      Previous State = DeviceNodeEnumerateCompletion (0x30d)
      DevNode 0xffffe000897fb650 for PDO 0xffffe00089927e30
        InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{64097438-cdc0-4007-a19e-62e789062e20}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe00086d2f5f0 for PDO 0xffffe00089939ae0
        InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{78880f4e-9571-44a4-a9df-960bde446487}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe00089759bb0 for PDO 0xffffe000875aa060
        InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{7cad07f2-d0a0-4b9b-8100-8dc735e9c447}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe00087735010 for PDO 0xffffe000872068c0
        InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{fc38551b-e69f-4b86-9661-ae6da78bc3c6}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe00088457670 for PDO 0xffffe0008562b830
        InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{0894b831-c9fe-4c56-86a6-092380fc5628}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe000893dbb70 for PDO 0xffffe00089d68060
        InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{15eb6b5c-aa54-47b8-959a-0cff2c1500db}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe00088e6f250 for PDO 0xffffe00089f6e990
        InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{778c07f0-af9f-43f2-8b8d-490024f87239}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe000862eb4b0 for PDO 0xffffe000884443a0
        InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{e4b72c7c-be50-45df-94f5-0f2922b85983}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
    
  4. Önceki komutta görüntülenen çıkış, sürücümüzünün çalışan örneğiyle ilişkilendirilmiş PDO'ları içerir, bu örnekte 0xffffe00089c575a0. Sysvad cihaz sürücüsüyle ilişkili Tak Çalıştır bilgilerini görüntülemek için !devobj<PDO adresi> komutunu girin. !devnode uygulamasının burada gösterileni değil, bilgisayarınızda görüntülediği PDO adresini kullanın.

    0: kd> !devobj 0xffffe00089c575a0
    Device object (ffffe00089c575a0) is for:
    0000004e \Driver\PnpManager DriverObject ffffe00082d47e60
    Current Irp 00000000 RefCount 65 Type 0000001d Flags 00001040
    SecurityDescriptor ffffc102b0f6d171 DevExt 00000000 DevObjExt ffffe00089c576f0 DevNode ffffe00086e68190 
    ExtensionFlags (0000000000)  
    Characteristics (0x00000180)  FILE_AUTOGENERATED_DEVICE_NAME, FILE_DEVICE_SECURE_OPEN
    AttachedDevice (Upper) ffffe00088386a50 \Driver\sysvad_tabletaudiosample
    Device queue is not busy.
    
  5. !devobj komutunda görüntülenen çıkış, ekli cihazın adını içerir: \Driver\sysvad_tabletaudiosample. Ekli cihazla ilişkili bilgileri görüntülemek için !drvobj komutunu bit maskesi 2 ile kullanın.

    0: kd> !drvobj \Driver\sysvad_tabletaudiosample 2
    Driver object (ffffe0008834f670) is for:
    \Driver\sysvad_tabletaudiosample
    DriverEntry:   fffff80114b45310  tabletaudiosample!FxDriverEntry
    DriverStartIo: 00000000 
    DriverUnload:  fffff80114b5fea0                tabletaudiosample!DriverUnload
    AddDevice:     fffff80114b5f000  tabletaudiosample!AddDevice
    
    Dispatch routines:
    [00] IRP_MJ_CREATE                      fffff80117b49a20             portcls!DispatchCreate
    [01] IRP_MJ_CREATE_NAMED_PIPE           fffff8015a949a00          nt!IopInvalidDeviceRequest
    [02] IRP_MJ_CLOSE                       fffff80115e26f90                ks!DispatchCleanup
    [03] IRP_MJ_READ                        fffff80115e32710                ks!DispatchRead
    [04] IRP_MJ_WRITE                       fffff80115e327e0              ks!DispatchWrite
    [05] IRP_MJ_QUERY_INFORMATION           fffff8015a949a00         nt!IopInvalidDeviceRequest
    [06] IRP_MJ_SET_INFORMATION             fffff8015a949a00              nt!IopInvalidDeviceRequest
    [07] IRP_MJ_QUERY_EA                    fffff8015a949a00         nt!IopInvalidDeviceRequest
    [08] IRP_MJ_SET_EA                      fffff8015a949a00              nt!IopInvalidDeviceRequest
    [09] IRP_MJ_FLUSH_BUFFERS               fffff80115e32640  ks!DispatchFlush
    [0a] IRP_MJ_QUERY_VOLUME_INFORMATION    fffff8015a949a00           nt!IopInvalidDeviceRequest
    [0b] IRP_MJ_SET_VOLUME_INFORMATION      fffff8015a949a00               nt!IopInvalidDeviceRequest
    [0c] IRP_MJ_DIRECTORY_CONTROL           fffff8015a949a00           nt!IopInvalidDeviceRequest
    [0d] IRP_MJ_FILE_SYSTEM_CONTROL         fffff8015a949a00         nt!IopInvalidDeviceRequest
    [0e] IRP_MJ_DEVICE_CONTROL              fffff80115e27480               ks!DispatchDeviceIoControl
    [0f] IRP_MJ_INTERNAL_DEVICE_CONTROL     fffff8015a949a00   nt!IopInvalidDeviceRequest
    [10] IRP_MJ_SHUTDOWN                    fffff8015a949a00      nt!IopInvalidDeviceRequest
    [11] IRP_MJ_LOCK_CONTROL                fffff8015a949a00  nt!IopInvalidDeviceRequest
    [12] IRP_MJ_CLEANUP                     fffff8015a949a00           nt!IopInvalidDeviceRequest
    [13] IRP_MJ_CREATE_MAILSLOT             fffff8015a949a00               nt!IopInvalidDeviceRequest
    [14] IRP_MJ_QUERY_SECURITY              fffff80115e326a0 ks!DispatchQuerySecurity
    [15] IRP_MJ_SET_SECURITY                fffff80115e32770      ks!DispatchSetSecurity
    [16] IRP_MJ_POWER                       fffff80117b3dce0            portcls!DispatchPower
    [17] IRP_MJ_SYSTEM_CONTROL              fffff80117b13d30              portcls!PcWmiSystemControl
    [18] IRP_MJ_DEVICE_CHANGE               fffff8015a949a00 nt!IopInvalidDeviceRequest
    [19] IRP_MJ_QUERY_QUOTA                 fffff8015a949a00  nt!IopInvalidDeviceRequest
    [1a] IRP_MJ_SET_QUOTA                   fffff8015a949a00       nt!IopInvalidDeviceRequest
    [1b] IRP_MJ_PNP                         fffff80114b5f7d0 tabletaudiosample!PnpHandler
    
  6. Cihaz sürücüsüyle ilişkili Tak Çalıştır bilgilerini görüntülemek için !devstack<PDO adresi> komutunu girin. !devnode 0 1 komutunda görüntülenen çıkış, sürücümüze ait çalışan örnekle ilişkilendirilmiş PDO adresini içerir. Bu örnekte 0xffffe00089c575a0. !devnode dosyasının aşağıda gösterilen adresi değil, bilgisayarınızda görüntülediği PDO adresini kullanın.

    0: kd> !devstack 0xffffe00089c575a0
      !DevObj           !DrvObj            !DevExt           ObjectName
      ffffe00088d212e0  \Driver\ksthunk    ffffe00088d21430  0000007b
      ffffe00088386a50  \Driver\sysvad_tabletaudiosampleffffe00088386ba0  0000007a
    > ffffe00089c575a0  \Driver\PnpManager 00000000  0000004e
    !DevNode ffffe00086e68190 :
      DeviceInst is "ROOT\sysvad_TabletAudioSample\0000"
      ServiceName is "sysvad_tabletaudiosample"
    

Çıktı, çok basit bir cihaz sürücü yığınına sahip olduğumuzu gösterir. sysvad_TabletAudioSample sürücüsü PnPManager düğümünün alt öğesidir. PnPManager bir kök düğümdür.

Bu diyagramda daha karmaşık bir cihaz düğümü ağacı gösterilmektedir.

Yaklaşık 20 düğümden oluşan bir cihaz düğümü ağacının diyagramı.

Not Daha karmaşık sürücü yığınları hakkında daha fazla bilgi için bkz . Sürücü yığınları ve Cihaz düğümleri ve cihaz yığınları.

Bölüm 7: Kesme noktalarıyla çalışma

Bölüm 7'de belirli noktalarda kod yürütmeyi durdurmak için kesme noktalarıyla çalışacaksınız.

Komutları kullanarak kesme noktalarını ayarlama

Kesme noktaları, belirli bir kod satırında kod yürütmeyi durdurmak için kullanılır. Daha sonra kodun belirli bir bölümünde hata ayıklamak için bu noktadan itibaren kodda ileri gidebilirsiniz.

Hata ayıklama komutu kullanarak kesme noktası ayarlamak için aşağıdaki b komutlarından birini kullanın.

Bp

Modül bulunduğu yerden kaldırılana kadar etkin olacak bir kesme noktası ayarlar.

bu

Modül kaldırıldığında çözümsüz kalan ve modül yeniden yüklendiğinde yeniden etkinleştirilen bir kesme noktası ayarlar.

bm

Simge için bir kesme noktası ayarlar. Bu komut, bu veya bp'yi uygun şekilde kullanır ve eşleşen her simgede kesme noktaları ayarlamak için joker karakterlerin * kullanılmasına izin verir (bir sınıftaki tüm yöntemler gibi).

  1. Geçerli WinDbg oturumunda Hata Ayıklama>Kaynak Modu'nu etkinleştirmek için WinDbg kullanıcı arabirimini kullanın.

  2. Aşağıdaki komutu yazarak yerel kod konumunuzu kaynak yola ekleyin.

    .sympath+ C:\WDK_Samples\Sysvad
    
  3. Aşağıdaki komutu yazarak yerel simge konumunuzu sembol yoluna ekleyin.

    .sympath+ C:\WDK_Samples\Sysvad
    
  4. Hata ayıklama maskesini ayarlama

    Bir sürücüyle çalışırken, görüntüleyebileceği tüm iletileri görmek kullanışlı olabilir. Hedef sistemdeki tüm hata ayıklama iletilerinin hata ayıklayıcıda görüntülenmesi için varsayılan hata ayıklama bit maskesini değiştirmek için aşağıdakileri yazın.

    0: kd> ed nt!Kd_DEFAULT_MASK 0xFFFFFFFF
    
  5. Sürücü adını kullanarak bm komutuyla kesme noktasını, ardından kesme noktasını ünlem işaretiyle ayırarak ayarlamak istediğiniz işlev adını (AddDevice) ayarlayın.

    0: kd> bm tabletaudiosample!AddDevice
    breakpoint 1 redefined
      1: fffff801`14b5f000 @!"tabletaudiosample!AddDevice"
    

    Farklı söz dizimini, <modül>,<sembol>, <sınıf>::<metot>, '<dosya.cpp>:<satır numarası>' gibi değişkenleri ayarlamakla ve <koşulu><#> birkaç kez atlamayla birlikte kullanabilirsiniz. Daha fazla bilgi için bkz. Kesme Noktalarını Kullanma.

  6. Bl komutunu yazarak kesme noktasının ayarlandığını onaylamak için geçerli kesme noktalarını listeleyin.

    0: kd> bl
    1 e fffff801`14b5f000     0001 (0001) tabletaudiosample!AddDevice
    
  7. g go komutunu yazarak hedef sistemde kod yürütmeyi yeniden başlatın.

  8. ->Hedef sistemde

    Windows'ta, simgeyi kullanarak veya mmc devmgmt.msc girerek Cihaz Yöneticisi'ni açın. Cihaz Yöneticisi'ndeSes, video ve oyun denetleyicileri düğümünü genişletin. Sanal ses sürücüsü girişini seçip basılı tutun (veya sağ tıklayın) ve menüden Devre Dışı Bırak'ı seçin.

  9. Sanal ses sürücüsü girişini yeniden seçip basılı tutun (veya sağ tıklayın) ve menüden Etkinleştir'i seçin.

  10. <- Konak sisteminde

    Bu, Windows'un AddDevice'i çağıran sürücüyü yeniden yüklemesine neden olmalıdır. Bu, AddDevice hata ayıklama kesme noktasının tetiklenmesine neden olur ve hedef sistemdeki sürücü kodunun yürütülmesi durdurulmalıdır.

    Breakpoint 1 hit
    tabletaudiosample!AddDevice:
    fffff801`14baf000 4889542410      mov     qword ptr [rsp+10h],rdx
    

    Kaynak yolunuz doğru ayarlanmışsa, adapter.cpp dosyasındaki AddDevice rutininde durmalısınız.

    {
        PAGED_CODE();
    
        NTSTATUS        ntStatus;
        ULONG           maxObjects;
    
        DPF(D_TERSE, ("[AddDevice]"));
    
        maxObjects = g_MaxMiniports;
    
        #ifdef SYSVAD_BTH_BYPASS
        // 
        // Allow three (3) Bluetooth hands-free profile devices.
        //
        maxObjects += g_MaxBthHfpMiniports * 3; 
        #endif // SYSVAD_BTH_BYPASS
    
        // Tell the class driver to add the device.
        //
        ntStatus = 
            PcAddAdapterDevice
            ( 
                DriverObject,
                PhysicalDeviceObject,
                PCPFNSTARTDEVICE(StartDevice),
                maxObjects,
                0
            );
        return ntStatus;
    } // AddDevice
    
  11. p komutunu yazarak veya F10 tuşuna basarak kodda satır satır ilerleyin. Sysvad AddDevice kodundan PpvUtilCall, PnpCallAddDevice ve ardından PipCallDriverAddDevice Windows koduna ilerleyebilirsiniz. p komutuna birden çok satır ileri gitmek için bir sayı sağlayabilirsiniz, örneğin p 5.

  12. Kodda adım adım ilerleydiğinizde, hedef sistemde yürütmeyi yeniden başlatmak için g go komutunu kullanın.

Bellek erişim kesme noktalarını ayarlama

Bir bellek konumuna erişildiğinde tetiklenen kesme noktalarını da ayarlayabilirsiniz. Aşağıdaki söz dizimiyle ba (erişimde kesme) komutunu kullanın.

ba <access> <size> <address> {options}
Seçenek Açıklama

e

yürüt (CPU bir yönergeyi adresten aldığında)

r

okuma/yazma (CPU adresi okuduğunda veya yazdığında)

w

yazma (CPU adrese yazdığında)

Herhangi bir anda yalnızca dört veri kesme noktası ayarlayabildiğinizi ve verilerinizi doğru hizaladığınızdan veya kesme noktasını tetiklemediğinizden emin olmak size bağlıdır (sözcükler 2 ile bölünebilir adreslerle bitmelidir, dword'lar 4 ve dörtlüler 0 veya 8 bölünebilir olmalıdır)

Örneğin, belirli bir bellek adresinde okuma/yazma kesme noktası ayarlamak için bunun gibi bir komut kullanın.

ba r 4 fffff800`7bc9eff0

Kesme noktası durumunu değiştirme

Aşağıdaki komutları kullanarak var olan kesme noktalarını değiştirebilirsiniz.

bl

Kesme noktalarını listeler.

Listeden bir kesme noktasını temizler. Tüm kesme noktalarını temizlemek için bc * kullanın.

Bd

Kesme noktasını devre dışı bırakır. Tüm kesme noktalarını devre dışı bırakmak için bd * kullanın.

olmak

Kesme noktasını etkinleştirir. Tüm kesme noktalarını etkinleştirmek için "be *" kullanın.

Alternatif olarak kesme noktalarını düzenle'yi> seçerekkesme noktalarını da değiştirebilirsiniz. Kesme noktası iletişim kutusunun yalnızca var olan kesme noktalarıyla çalıştığını unutmayın. Komut satırından yeni kesme noktaları ayarlanmalıdır.

MixerVolume'da kesme noktası ayarlama

Cihaz sürücüsü yüklendikten sonra çeşitli olaylara yanıt vermek için ses sürücüsü kodunun farklı bölümleri çağrılır. Sonraki bölümde, kullanıcı virtüel ses sürücüsü için ses kontrolünü ayarladığında tetiklenecek bir kesme noktası ayarlayacağız.

MixerVolume'da kesme noktası ayarlamak için aşağıdaki adımları uygulayın.

  1. <- Konak sisteminde

    Birimi değiştiren yöntemi bulmak için x komutunu kullanarak CAdapterCommon'da dize birimini içeren simgeleri listeleyin.

    kd> x tabletaudiosample!CAdapterCommon::*
    ...
    fffff800`7bce26a0 tabletaudiosample!CAdapterCommon::MixerVolumeWrite (unsigned long, unsigned long, long)
    …
    

    CTRL+F tuşlarını kullanarak çıktıda ses seviyesini yukarı doğru ara ve MixerVolumeWrite yöntemini bul.

  2. bc * kullanarak önceki kesme noktalarını temizleyin.

  3. Aşağıdaki komutu kullanarak CAdapterCommon::MixerVolumeWrite yordamında bir sembol kesme noktası ayarlayın.

    kd> bm tabletaudiosample!CAdapterCommon::MixerVolumeWrite
      1: fffff801`177b26a0 @!"tabletaudiosample!CAdapterCommon::MixerVolumeWrite"
    
  4. Kesme noktasının düzgün ayarlandığını onaylamak için kesme noktalarını listeleyin.

    kd> bl
    1 e fffff801`177b26a0 [c:\WDK_Samples\audio\sysvad\common.cpp @ 1668]    0001 (0001) tabletaudiosample!CAdapterCommon::MixerVolumeWrite
    
  5. g go komutunu yazarak hedef sistemde kod yürütmeyi yeniden başlatın.

  6. Denetim Masası'nda Donanım ve Ses Sesi'ni> seçin. Havuz Açıklaması Örneği'ni seçip basılı tutun (veya sağ tıklayın) ve Özellikler'i seçin. Düzeyler sekmesini seçin. Kaydırıcı ses düzeyini ayarlayın.

  7. Bu, SetMixerVolume hata ayıklama kesme noktasının tetiklenmesine ve hedef sistemdeki sürücü kodu yürütümünün durmasına neden olmalıdır.

    kd> g
    Breakpoint 1 hit
    tabletaudiosample!CAdapterCommon::MixerVolumeWrite:
    fffff801`177b26a0 44894c2420      mov     dword ptr [rsp+20h],r9d
    

    common.cpp'da bu satırda durmanız gerekiyor

    {
        if (m_pHW)
        {
            m_pHW->SetMixerVolume(Index, Channel, Value);
        }
    } // MixerVolumeWrite
    
  8. Geçerli değişkenleri ve değerlerini görüntülemek için dv komutunu kullanın. Değişkenler hakkında daha fazla bilgi bu laboratuvarın sonraki bölümünde sağlanmıştır.

    2: kd> dv
               this = 0x00000000`00000010
             ulNode = 0x344
          ulChannel = 0x210a45f8
            lVolume = 0n24
    
  9. Koddaki tek adım için F10 tuşuna basın.

  10. MixerVolumeWrite kodunun yürütülmesini tamamlamak için F5 tuşuna basın.

Özet - Hata Ayıklayıcı Komut penceresinden kod üzerinde adımlama

Aşağıda, kodunuzda adım adım ilerleyebileceğiniz komutlar bulunur (ilişkili klavye kısa kesimleri parantez içinde gösterilir).

  • Break in (Ctrl+Break) - Bu komut, sistem çalıştığı ve WinDbg ile iletişim halinde olduğu sürece bir sistemi kesintiye uğratır (Çekirdek Hata Ayıklayıcısı'ndaki sıra Ctrl+C'dir).

  • Step over (F10) – Bu komut, kod yürütmenin tek seferde bir deyim veya bir yönergeyle devam etmesine neden olur. Bir çağrıyla karşılaşılırsa, kod yürütme çağrılan rutini girmeden çağrıyı atlar. (Programlama dili C veya C++ ise ve WinDbg kaynak modundaysa, Hata Ayıklama> kullanılarak kaynak modu açılabilir veya kapatılabilirKaynak Modu).

  • Step in (F11) – Bu komut, çağrılan alt programa girilmesi dışında, adım at (step-over) gibi çalışır.

  • Step Out (Shift+F11) – Bu komut, yürütmeyi geçerli alt programın (çağrı yığınındaki mevcut yer) tamamlanıp çıkılmasını sağlar. Rutini yeterince gördüyseniz bu faydalıdır.

  • İmlece çalıştır (F7 veya Ctrl+F10) – İmleci yürütmenin kesmesini istediğiniz bir kaynak veya ayrıştırma penceresine getirin, ardından F7 tuşuna basın; kod yürütmesi bu noktaya kadar çalışır. Kod yürütme akışı imleç tarafından belirtilen noktaya ulaşmazsa (örneğin, bir IF deyimi yürütülmezse), kod yürütme belirtilen noktaya ulaşmadığından WinDbg'nin kırılmayacağını unutmayın.

  • Run (F5) – Bir kesme noktasıyla karşılaşılana veya hata denetimi gibi bir olay gerçekleşene kadar çalıştırın.

Gelişmiş seçenekler

  • Yönergeyi geçerli satıra ayarlayın (Ctrl+Shift+I) – Kaynak pencerede imlecinizi bir satıra yerleştirebilir, bu klavye kısayolunu girebilir ve devam etmesine izin verir vermez kod yürütme bu noktadan başlar (örneğin F5 veya F10 kullanarak). Bu, bir diziyi yeniden denemek istiyorsanız kullanışlıdır, ancak biraz özen gerektirir. Örneğin, yazmaçlar ve değişkenler, kod yürütme bu satıra doğal olarak ulaşmış olsaydı olacakları değere ayarlanmamıştır.

  • Eip kaydının doğrudan ayarı -- Eip yazmaç içine bir değer koyabilirsiniz ve F5(veya F10, F11 vb.) tuşlarına bastığınızda bu adresten yürütme başlar. Bu, yönergeyi imleç tarafından belirlenen geçerli satıra ayarlamaya benzer, ancak derleme yönergesinin adresini belirtmeniz gerekir.

Komut satırından değil, kullanıcı arabiriminde adım adım gezinmek daha kolay olabilir, bu nedenle bu yöntem önerilir. Gerekirse, komut satırındaki bir kaynak dosyada adım adım ilerleyebilmek için aşağıdaki komutlar kullanılabilir:

  • .lines - Kaynak satır bilgilerini etkinleştirin.

  • bp main - Modülünüzün başındaki ilk kesme noktasını ayarlayın.

  • l+t - İlerleme kaynak satırına göre yapılacaktır.

  • Hata Ayıkla>Kaynak Modu'nu seçerek kaynak moduna girin; L+t komutu yeterli değildir.

  • l+s - Kaynak satırlar istendiğinde görüntülenir.

  • g - "main" fonksiyonu girilene kadar programı çalıştırın.

  • p - Bir kaynak satırını yürüt.

Daha fazla bilgi için hata ayıklama başvuru belgelerindeki WinDbg (Klasik) Kaynak Kodu Hata Ayıklama bölümüne bakın.

Kodda kesme noktaları ayarlama

deyimini DebugBreak() ekleyerek ve projeyi yeniden oluşturup sürücüyü yeniden yükleyerek kodda bir kesme noktası ayarlayabilirsiniz. Bu kesme noktası, sürücü her etkinleştirildiğinde tetiklenir, bu nedenle üretim kodunda değil, ilk geliştirme aşamalarında kullanılacak teknikler olacaktır. Bu teknik, kesme noktası komutlarını kullanarak kesme noktalarını dinamik olarak ayarlamak kadar esnek değildir.

İpucu: Sysvad sürücüsünün kesme noktası eklenmemiş bir kopyasını tutmak, daha fazla laboratuvar çalışması için faydalı olabilir.

  1. AddDevice yöntemi her çalıştırıldığında bir kesme noktası oluşturmak için DebugBreak() ifadesini örnek koda ekleyin.

    ...
        // Insert the DebugBreak() statment before the  PcAddAdapterDevice is called.
        //
    
        DebugBreak()
    
        // Tell the class driver to add the device.
        //
        ntStatus = 
            PcAddAdapterDevice
            ( 
                DriverObject,
                PhysicalDeviceObject,
                PCPFNSTARTDEVICE(StartDevice),
                maxObjects,
                0
            );
    
        return ntStatus;
    } // AddDevice
    
  2. Microsoft Visual Studio'da sürücüyü yeniden derlemek ve hedef makineye yeniden yüklemek için daha önce açıklanan tüm adımları izleyin. Güncelleştirilmiş sürücüyü yüklemeden önce mevcut sürücüyü kaldırdığınızdan emin olun.

  3. Önceki kesme noktalarını temizleyin ve hata ayıklayıcının hedef bilgisayara bağlı olduğundan emin olun.

  4. Kod çalıştırıldığında ve deyimine DebugBreak ulaştığında yürütme durur ve bir ileti görüntülenir.

    KERNELBASE!DebugBreak:
    77b3b770 defe     __debugbreak
    

Bölüm 8: Değişkenleri görüntüleme

Bölüm 8'de, değişkenleri görüntülemek için hata ayıklayıcı komutlarını kullanacaksınız.

Kodun beklendiği gibi çalıştığını onaylamak için kod yürütülürken değişkenleri incelemek yararlı olabilir. Bu laboratuvar, ses sürücüsü ses üretirken değişkenleri inceler.

  1. tabletaudiosample ile ilişkili yerel ayar değişkenlerini incelemek için dv komutunu kullanın! CMiniportWaveRT::New*.

    kd> dv tabletaudiosample!CMiniportWaveRT::New*
    
  2. Önceki kesme noktalarını temizleme

    bc *
    
  3. Aşağıdaki komutu kullanarak CMiniportWaveCyclicStreamMSVAD yordamlarında bir sembol kesme noktası ayarlayın.

    0: kd> bm tabletaudiosample!CMiniportWaveRT::NewStream
      1: fffff801`177dffc0 @!"tabletaudiosample!CMiniportWaveRT::NewStream"
    
  4. g go komutunu yazarak hedef sistemde kod yürütmeyi yeniden başlatın.

  5. -> Hedef sistemde

    Küçük bir medya dosyasını (.wav dosya uzantısına sahip Windows bildirim ses dosyası gibi) bulun ve yürütmek için dosyayı seçin. Örneğin, Windows\Media dizininde bulunan Ring05.wav kullanabilirsiniz.

  6. <- Konak sisteminde

    Medya dosyası oynatıldığında kesme noktası tetiklenmeli ve hedef sistemdeki sürücü kodunun yürütülmesi durdurulmalıdır.

    Breakpoint 1 hit
    tabletaudiosample!CMiniportWaveRT::NewStream:
    fffff801`177dffc0 44894c2420      mov     dword ptr [rsp+20h],r9d
    

    Kaynak kodu penceresi, NewStream işlevinin girişindeki ayracı vurgulamalıdır.

    /*++
    
    Routine Description:
    
      The NewStream function creates a new instance of a logical stream 
      associated with a specified physical channel. Callers of NewStream should 
      run at IRQL PASSIVE_LEVEL.
    
    Arguments:
    
      OutStream -
    
      OuterUnknown -
    
      Pin - 
    
      Capture - 
    
      DataFormat -
    
    Return Value:
    
      NT status code.
    
    --*/
    {
    
    ...
    
  7. Yerel değişkenler

    dv komutunu yazarak belirli bir çerçeve için tüm yerel değişkenlerin adlarını ve değerlerini görüntüleyebilirsiniz.

    0: kd> dv
                    this = 0xffffe000`4436f8e0
               OutStream = 0xffffe000`49d2f130
            OuterUnknown = 0xffffe000`4436fa30
                     Pin = 0
                 Capture = 0x01 '
              DataFormat = 0xffffe000`44227790
    signalProcessingMode = {487E9220-E000-FFFF-30F1-D24900E0FFFF}
                ntStatus = 0n1055
                  stream = 0x00000000`00000200
    
  8. Değişkenleri Görüntülemek için DML Kullanma

    Değişkenleri keşfetmek için DML kullanmak için altı çizili öğeleri seçin. Seçme eylemi, iç içe veri yapılarında detaya gitmenizi sağlayan bir dx (NatVis İfadesini Görüntüle) komutu oluşturur.

    0: kd> dx -r1 (*((tabletaudiosample!CMiniportWaveRT *)0xffffe001d10b8380))
    (*((tabletaudiosample!CMiniportWaveRT *)0xffffe001d10b8380)) :  [Type: CMiniportWaveRT]
        [+0x020] m_lRefCount      : 0
        [+0x028] m_pUnknownOuter  : 0xffffe001d1477e50 : [Type: IUnknown *]
        [+0x030] m_ulLoopbackAllocated : 0x2050
        [+0x034] m_ulSystemAllocated : 0x180
        [+0x038] m_ulOffloadAllocated : 0x0
        [+0x03c] m_dwCaptureAllocatedModes : 0x0
    
    0: kd> dx -r1 (*((tabletaudiosample!_GUID *)0xffffd001c8acd348))
    (*((tabletaudiosample!_GUID *)0xffffd001c8acd348)) : {487E9220-E000-FFFF-30F1-D24900E0FFFF} [Type: _GUID]
        [<Raw View>]    
    
    0: kd> dx -r1 -n (*((tabletaudiosample!_GUID *)0xffffd001c8acd348))
    (*((tabletaudiosample!_GUID *)0xffffd001c8acd348)) :  [Type: _GUID]
        [+0x000] Data1            : 0x487e9220
        [+0x004] Data2            : 0xe000
        [+0x006] Data3            : 0xffff
        [+0x008] Data4            :  [Type: unsigned char [8]]
    
    0: kd> dx -r1 -n (*((tabletaudiosample!unsigned char (*)[8])0xffffd001c8acd350))
    (*((tabletaudiosample!unsigned char (*)[8])0xffffd001c8acd350)) :  [Type: unsigned char [8]]
        [0]              : 0x30
        [1]              : 0xf1
        [2]              : 0xd2
        [3]              : 0x49
        [4]              : 0x0
        [5]              : 0xe0
        [6]              : 0xff
        [7]              : 0xff
    
  9. Genel değişkenler

    Bir genel değişkenin bellek konumunu yazarak bulabilirsiniz ? <değişken adı>.

    0: kd> ? signalProcessingMode
    Evaluate expression: -52768896396472 = ffffd001`c8acd348
    
  10. Bu, değişkenin bellek konumunu döndürür; bu örnekte ffffd001'c8acd348. Önceki komut tarafından döndürülen bellek konumunu kullanarak dd komutunu yazarak, o konumun değerinin dökümünü alabilir ve bellekteki içeriği görüntüleyebilirsiniz.

    0: kd> dd ffffd001`c8acd348
    ffffd001`c8acd348  487e9220 ffffe000 49d2f130 ffffe000
    ffffd001`c8acd358  4837c468 ffffe000 18221570 ffffc000
    ffffd001`c8acd368  4436f8e0 ffffe000 487e9220 ffffe000
    ffffd001`c8acd378  18ab145b fffff801 4837c420 ffffe000
    ffffd001`c8acd388  4436f8e0 ffffe000 49d2f130 ffffe000
    ffffd001`c8acd398  4436fa30 ffffe000 00000000 00000000
    ffffd001`c8acd3a8  00000001 00000000 44227790 ffffe000
    ffffd001`c8acd3b8  18adc7f9 fffff801 495972a0 ffffe000
    
  11. Değişken adlarını dd komutuyla da kullanabilirsiniz.

    0: kd> dd signalProcessingMode
    ffffd001`c8acd348  487e9220 ffffe000 49d2f130 ffffe000
    ffffd001`c8acd358  4837c468 ffffe000 18221570 ffffc000
    ffffd001`c8acd368  4436f8e0 ffffe000 487e9220 ffffe000
    ffffd001`c8acd378  18ab145b fffff801 4837c420 ffffe000
    ffffd001`c8acd388  4436f8e0 ffffe000 49d2f130 ffffe000
    ffffd001`c8acd398  4436fa30 ffffe000 00000000 00000000
    ffffd001`c8acd3a8  00000001 00000000 44227790 ffffe000
    ffffd001`c8acd3b8  18adc7f9 fffff801 495972a0 ffffe000
    
  12. Değişkenleri görüntüleme

    Yerel değişkenleri görüntülemek içinYerel ÖğeleriGörüntüle> menü öğesini kullanın. Bu arabirim, daha karmaşık veri yapılarında detaya gitme olanağı da sağlar.

    Örnek kod yerel değerlerini ve komut pencerelerini görüntüleyen WinDbg arabirimi.

  13. Kodda yaklaşık 10 satır ileri gitmek için p veya F10 tuşunu kullanarak ntStatus = IsFormatSupported(Pin, Capture, DataFormat); satırı üzerinde durana kadar devam edin.

        PAGED_CODE();
    
        ASSERT(OutStream);
        ASSERT(DataFormat);
    
        DPF_ENTER(("[CMiniportWaveRT::NewStream]"));
    
        NTSTATUS                    ntStatus = STATUS_SUCCESS;
        PCMiniportWaveRTStream      stream = NULL;
        GUID                        signalProcessingMode = AUDIO_SIGNALPROCESSINGMODE_DEFAULT;
    
        *OutStream = NULL;
    
         //
        // If the data format attributes were specified, extract them.
        //
        if ( DataFormat->Flags & KSDATAFORMAT_ATTRIBUTES )
        {
            // The attributes are aligned (QWORD alignment) after the data format
            PKSMULTIPLE_ITEM attributes = (PKSMULTIPLE_ITEM) (((PBYTE)DataFormat) + ((DataFormat->FormatSize + FILE_QUAD_ALIGNMENT) & ~FILE_QUAD_ALIGNMENT));
            ntStatus = GetAttributesFromAttributeList(attributes, attributes->Size, &signalProcessingMode);
        }
    
        // Check if we have enough streams.
        //
        if (NT_SUCCESS(ntStatus))
        {
            ntStatus = ValidateStreamCreate(Pin, Capture, signalProcessingMode);
        }
    
        // Determine if the format is valid.
        //
        if (NT_SUCCESS(ntStatus))
        {
            ntStatus = IsFormatSupported(Pin, Capture, DataFormat);
        }
    
    ...
    
  14. Belirli bir çerçeve için tüm yerel değişkenlerin adlarını ve değerlerini görüntülemek için dv komutunu kullanın. Yerel değişkenleri değiştiren ek kod çalıştırıldığından ve bazı değişkenlerin geçerli çerçevede olmadığından veya değerleri değiştiğinden, değerlerin beklendiği gibi bu komutu son çalıştırmamızdan farklı olduğunu unutmayın.

    2: kd> dv
                    this = 0xffffe001`d1182000
               OutStream = 0xffffe001`d4776d20
            OuterUnknown = 0xffffe001`d4776bc8
                     Pin = 0
                 Capture = 0x00 '
              DataFormat = 0xffffe001`cd7609b0
    signalProcessingMode = {4780004E-7133-41D8-8C74-660DADD2C0EE}
                ntStatus = 0n0
                  stream = 0x00000000`00000000
    

Bölüm 9: Çağrı yığınlarını görüntüleme

Bölüm 9'da çağıran/çağrılan kodu incelemek için çağrı yığınlarını görüntüleyeceksiniz.

Çağrı yığını, program sayacının geçerli konumuna yol açan işlev çağrıları zinciridir. Çağrı yığınındaki en üstteki işlev geçerli işlevdir ve sonraki işlev geçerli işlevi çağıran işlevdir, vb.

Çağrı yığınını görüntülemek için k* komutlarını kullanın:

kilobayt (KB)

Yığını ve ilk üç parametreyi görüntüler.

kp

Yığınları ve parametrelerin tam listesini görüntüler.

Referans notu (eğer "kn" İngilizce'de "reference note" anlamına geliyorsa)

Çerçeve bilgileriyle birlikte yığını görmenizi sağlar.

Çağrı yığınını kullanılabilir durumda tutmak istiyorsanızArama yığınınıgörüntüle'yi> seçerek görüntüleyebilirsiniz. Ek bilgilerin görüntülenmesini değiştirmek için pencerenin üst kısmındaki sütunları seçin.

Çağrı yığını penceresini görüntüleyen WinDbg arabirimi.

Bu çıkış, kesme durumu esnasında örnek bağdaştırıcı kodunda hata ayıklama sırasında çağrı yığınını gösterir.

0: kd> kb
# RetAddr           : Args to Child                                                           : Call Site
00 fffff800`7a0fa607 : ffffe001`d1182000 ffffe001`d4776d20 ffffe001`d4776bc8 ffffe001`00000000 : tabletaudiosample!CMiniportWaveRT::NewStream+0x1dc [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 597]
01 fffff800`7a0fb2c3 : 00000000`00000000 ffffe001`d122bb10 ffffe001`ceb81750 ffffe001`d173f058 : portcls!CPortPinWaveRT::Init+0x2e7
02 fffff800`7a0fc7f9 : ffffe001`d4776bc0 00000000`00000000 ffffe001`d10b8380 ffffe001`d122bb10 : portcls!CPortFilterWaveRT::NewIrpTarget+0x193
03 fffff800`7a180552 : 00000000`00000000 ffffe001`d10b8380 ffffe001`d122bb10 ffffe001`d4565600 : portcls!xDispatchCreate+0xd9
04 fffff800`7a109a9a : ffffe001`d10b84d0 ffffe001`d10b8380 00000000`00000000 ffffe001`00000000 : ks!KsDispatchIrp+0x272
05 fffff800`7bd314b1 : ffffe001`d122bb10 ffffd001`c3098590 ffffe001`d122bd90 ffffe001`ce80da70 : portcls!DispatchCreate+0x7a
06 fffff803`cda1bfa8 : 00000000`00000024 00000000`00000000 00000000`00000000 ffffe001`d122bb10 : ksthunk!CKernelFilterDevice::DispatchIrp+0xf9
07 fffff803`cda7b306 : 00000000`000001f0 ffffe001`d48ce690 ffffe001`d13d6400 ffffe001`d13d64c0 : nt!IopParseDevice+0x7c8
08 fffff803`cda12916 : 00000000`000001f0 ffffd001`c30988d0 ffffe001`d13d6490 fffff803`cda7b250 : nt!IopParseFile+0xb6
09 fffff803`cda1131c : ffffe001`d2ccb001 ffffd001`c30989e0 00ffffe0`00000040 ffffe001`cd127dc0 : nt!ObpLookupObjectName+0x776
0a fffff803`cd9fedb8 : ffffe001`00000001 ffffe001`d48ce690 00000000`00000000 00000000`00000000 : nt!ObOpenObjectByNameEx+0x1ec
0b fffff803`cd9fe919 : 000000ee`6d1fc8d8 000000ee`6d1fc788 000000ee`6d1fc7e0 000000ee`6d1fc7d0 : nt!IopCreateFile+0x3d8
0c fffff803`cd752fa3 : ffffc000`1f296870 fffff803`cd9d9fbd ffffd001`c3098be8 00000000`00000000 : nt!NtCreateFile+0x79
0d 00007fff`69805b74 : 00007fff`487484e6 0000029b`00000003 00000000`0000012e 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x13
0e 00007fff`487484e6 : 0000029b`00000003 00000000`0000012e 00000000`00000000 00000000`00000000 : 0x00007fff`69805b74
0f 0000029b`00000003 : 00000000`0000012e 00000000`00000000 00000000`00000000 00000000`00000000 : 0x00007fff`487484e6
10 00000000`0000012e : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000080 : 0x0000029b`00000003
11 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000080 00000000`00000000 : 0x12e

Kodu daha fazla keşfetmek için DML kullanabilirsiniz. İlk 00 girdisini seçtiğinizde bağlamı ayarlamak için .frame (Yerel Bağlamı Ayarla) komutu kullanılır ve ardından dv (Yerel Değişkenleri Görüntüle) komutu yerel değişkenleri görüntüler.

0: kd> .frame 0n0;dv /t /v
00 ffffd001`c30981d0 fffff800`7a0fa607 tabletaudiosample!CMiniportWaveRT::NewStream+0x1dc [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 597]
ffffd001`c30982b0 class CMiniportWaveRT * this = 0xffffe001`d1182000
ffffd001`c30982b8 struct IMiniportWaveRTStream ** OutStream = 0xffffe001`d4776d20
ffffd001`c30982c0 struct IPortWaveRTStream * OuterUnknown = 0xffffe001`d4776bc8
ffffd001`c30982c8 unsigned long Pin = 0
ffffd001`c30982d0 unsigned char Capture = 0x00 '
ffffd001`c30982d8 union KSDATAFORMAT * DataFormat = 0xffffe001`cd7609b0
ffffd001`c3098270 struct _GUID signalProcessingMode = {4780004E-7133-41D8-8C74-660DADD2C0EE}
ffffd001`c3098210 long ntStatus = 0n0
ffffd001`c3098218 class CMiniportWaveRTStream * stream = 0x00000000`00000000

Bölüm 10: İşlemleri ve iş parçacıklarını görüntüleme

Bölüm 10'da, işlemleri ve iş parçacıklarını görüntülemek için hata ayıklayıcı komutlarını kullanacaksınız.

İşlem

Geçerli işlem bağlamını değiştirmek için .process process <> komutunu kullanın. Aşağıdaki örnek, bir işlemi tanımlamayı ve bağlamı buna nasıl değiştirmeyi gösterir.

  • Geçerli ses çalma işlemine dahil olan süreci görüntülemek için !process komutunu kullanın.

    Daha fazla bilgi için bkz . !process

Çıktı, işlemin audiodg.exeile ilişkilendirildiğini gösterir. Bu konunun önceki bölümünde açıklanan kesme noktasındaysanız, şu anki süreç audiodg.exe görüntüsüyle ilişkili olmalıdır.

<- Konak sisteminde

0: kd> !process
PROCESS ffffe001d147c840
    SessionId: 0  Cid: 10f0    Peb: ee6cf8a000  ParentCid: 0434
    DirBase: d2122000  ObjectTable: ffffc0001f191ac0  HandleCount: <Data Not Accessible>
    Image: audiodg.exe
    VadRoot ffffe001d4222f70 Vads 70 Clone 0 Private 504. Modified 16. Locked 0.
    DeviceMap ffffc00019113080
    Token                             ffffc0001f1d4060
    ElapsedTime                       <Invalid>
    UserTime                          00:00:00.000
    KernelTime                        00:00:00.000
    QuotaPoolUsage[PagedPool]         81632
    QuotaPoolUsage[NonPagedPool]      9704
    Working Set Sizes (now,min,max)  (2154, 1814, 2109) (8616KB, 7256KB, 8436KB)
    PeakWorkingSetSize                2101
    VirtualSize                       2097192 Mb
    PeakVirtualSize                   2097192 Mb
    PageFaultCount                    2336
    MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      1573

        THREAD ffffe001d173e840  Cid 10f0.1dac  Teb: 000000ee6cf8b000 Win32Thread: ffffe001d1118cf0 WAIT: (UserRequest) UserMode Non-Alertable
            ffffe001d16c4dd0  NotificationEvent
            ffffe001d08b0840  ProcessObject

        THREAD ffffe001ceb77080  Cid 10f0.16dc  Teb: 000000ee6cf8d000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001cf2d1840  QueueObject

        THREAD ffffe001d112c840  Cid 10f0.0a4c  Teb: 000000ee6cf8f000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001cf2d1840  QueueObject

        THREAD ffffe001d16c7840  Cid 10f0.13c4  Teb: 000000ee6cf91000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001cf2d1840  QueueObject

        THREAD ffffe001cec67840  Cid 10f0.0dbc  Teb: 000000ee6cf93000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001d173e5c0  QueueObject

        THREAD ffffe001d1117840  Cid 10f0.1d6c  Teb: 000000ee6cf95000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001d173e5c0  QueueObject

        THREAD ffffe001cdeae840  Cid 10f0.0298  Teb: 000000ee6cf97000 Win32Thread: 0000000000000000 RUNNING on processor 2

Bu işlemle ilişkili iş parçacıklarından birinin ÇALıŞıYOR durumunda olduğunu unutmayın. Bu iş parçacığı, kesme noktası tetiklendiğinde medya klibinin oynatılmasını destekliyordu.

Tüm işlemlerin özet bilgilerini görüntülemek için !process 0 0 komutunu kullanın. Komut çıktısında, audiodg.exe görüntüsüyle ilişkilendirilmiş işlemin işlem kimliğini bulmak için CTRL+F tuşlarını kullanın. Aşağıda gösterilen örnekte işlem kimliği ffffe001d147c840 şeklindedir.

Bu laboratuvarın ilerleyen bölümlerinde kullanmak üzere bilgisayarınızdaki audiodg.exe ile ilişkili işlem kimliğini kaydedin. ________________________

...

PROCESS ffffe001d147c840
    SessionId: 0  Cid: 10f0    Peb: ee6cf8a000  ParentCid: 0434
    DirBase: d2122000  ObjectTable: ffffc0001f191ac0  HandleCount: <Data Not Accessible>
    Image: audiodg.exe
...

Medya klibi tamamlanana kadar kodu ileri adım adım çalıştırmak için hata ayıklayıcıya g girin. Ardından Ctrl+ScrLk (Ctrl+Break) tuşlarına basarak hata ayıklayıcıya girin. Şimdi farklı bir işlem çalıştırdığınızı onaylamak için !process komutunu kullanın.

!process
PROCESS ffffe001cd0ad040
    SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 001aa000  ObjectTable: ffffc00017214000  HandleCount: <Data Not Accessible>
    Image: System
    VadRoot ffffe001d402b820 Vads 438 Clone 0 Private 13417. Modified 87866. Locked 64.
    DeviceMap ffffc0001721a070
    Token                             ffffc00017216a60
    ElapsedTime                       05:04:54.716
    UserTime                          00:00:00.000
    KernelTime                        00:00:20.531
    QuotaPoolUsage[PagedPool]         0
    QuotaPoolUsage[NonPagedPool]      0
    Working Set Sizes (now,min,max)  (1720, 50, 450) (6880KB, 200KB, 1800KB)
    PeakWorkingSetSize                15853
    VirtualSize                       58 Mb
    PeakVirtualSize                   74 Mb
    PageFaultCount                    46128
   MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      66

        THREAD ffffe001cd0295c0  Cid 0004.000c  Teb: 0000000000000000 Win32Thread: 0000000000000000 WAIT: (Executive) KernelMode Non-Alertable
            fffff803cd8e0120  SynchronizationEvent

        THREAD ffffe001cd02a6c0  Cid 0004.0010  Teb: 0000000000000000 Win32Thread: 0000000000000000 WAIT: (Executive) KernelMode Non-Alertable
            fffff803cd8e0ba0  Semaphore Limit 0x7fffffff
...

Yukarıdaki çıktı ffffe001cd0ad040'ın farklı bir sistem işleminin çalıştığını gösterir. Görüntü adı audiodg.exedeğil, Sistem'i gösteriyor.

Şimdi audiodg.exeile ilişkilendirilmiş işleme geçmek için !process komutunu kullanın. Örnekte işlem kimliği ffffe001d147c840 şeklindedir. Örnekteki işlem kimliğini daha önce kaydettiğiniz işlem kimliğiniz ile değiştirin.

0: kd> !process  ffffe001d147c840
PROCESS ffffe001d147c840
    SessionId: 0  Cid: 10f0    Peb: ee6cf8a000  ParentCid: 0434
    DirBase: d2122000  ObjectTable: ffffc0001f191ac0  HandleCount: <Data Not Accessible>
    Image: audiodg.exe
    VadRoot ffffe001d4222f70 Vads 60 Clone 0 Private 299. Modified 152. Locked 0.
    DeviceMap ffffc00019113080
    Token                             ffffc0001f1d4060
    ElapsedTime                       1 Day 01:53:14.490
    UserTime                          00:00:00.031
    KernelTime                        00:00:00.031
    QuotaPoolUsage[PagedPool]         81552
    QuotaPoolUsage[NonPagedPool]      8344
    Working Set Sizes (now,min,max)  (1915, 1814, 2109) (7660KB, 7256KB, 8436KB)
    PeakWorkingSetSize                2116
    VirtualSize                       2097189 Mb
    PeakVirtualSize                   2097192 Mb
    PageFaultCount                    2464
    MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      1418

        THREAD ffffe001d173e840  Cid 10f0.1dac  Teb: 000000ee6cf8b000 Win32Thread: ffffe001d1118cf0 WAIT: (UserRequest) UserMode Non-Alertable
            ffffe001d16c4dd0  NotificationEvent
            ffffe001d08b0840  ProcessObject
        Not impersonating
        DeviceMap                 ffffc00019113080
        Owning Process            ffffe001d147c840       Image:         audiodg.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      338852         Ticks: 197682 (0:00:51:28.781)
        Context Switch Count      36             IdealProcessor: 0             
        UserTime                  00:00:00.015
        KernelTime                00:00:00.000
        Win32 Start Address 0x00007ff7fb928de0
        Stack Init ffffd001c2ec6dd0 Current ffffd001c2ec60c0
        Base ffffd001c2ec7000 Limit ffffd001c2ec1000 Call 0
        Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
        Kernel stack not resident.

        THREAD ffffe001d115c080  Cid 10f0.15b4  Teb: 000000ee6cf9b000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001d0bf0640  QueueObject
        Not impersonating
        DeviceMap                 ffffc00019113080
        Owning Process            ffffe001d147c840       Image:         audiodg.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      338852         Ticks: 197682 (0:00:51:28.781)
        Context Switch Count      1              IdealProcessor: 0             
        UserTime                  00:00:00.000
        KernelTime                00:00:00.000
        Win32 Start Address 0x00007fff6978b350
        Stack Init ffffd001c3143dd0 Current ffffd001c3143520
        Base ffffd001c3144000 Limit ffffd001c313e000 Call 0
        Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
        Kernel stack not resident.

        THREAD ffffe001d3a27040  Cid 10f0.17f4  Teb: 000000ee6cf9d000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001d173e5c0  QueueObject
        Not impersonating
        DeviceMap                 ffffc00019113080
        Owning Process            ffffe001d147c840       Image:         audiodg.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      518918         Ticks: 17616 (0:00:04:35.250)
        Context Switch Count      9              IdealProcessor: 1             
        UserTime                  00:00:00.000
        KernelTime                00:00:00.000
        Win32 Start Address 0x00007fff6978b350
        Stack Init ffffd001c70c6dd0 Current ffffd001c70c6520
        Base ffffd001c70c7000 Limit ffffd001c70c1000 Call 0
        Priority 9 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
        Kernel stack not resident.

Bu kod aktif olmadığından, tüm iş parçacıkları beklenildiği gibi bekleme durumundadır.

Thread'ler

İş parçacıklarını görüntüleme ve ayarlama komutları, işlemlerinkine çok benzer. İş parçacıklarını görüntülemek için !thread komutunu kullanın. Geçerli iş parçacıklarını ayarlamak için .thread öğesini kullanın.

Medya oynatıcıyla ilişkilendirilmiş iş parçacıklarını keşfetmek için medya klibini yeniden oynatın. Önceki bölümde açıklanan kesme noktası hala yerindeyse, audiodg.exebağlamında durursunuz.

Geçerli iş parçacığının kısa bilgilerini görüntülemek için !thread -1 0 komutunu kullanın. İş parçacığı adresi, iş parçacığı ve işlem kimlikleri, iş parçacığı ortam bloğu (TEB) adresi, iş parçacığının çalıştırılacak şekilde oluşturulduğu Win32 işlevinin (varsa) adresi ve iş parçacığının zamanlama durumu gösterilir.

0: kd> !thread -1 0
THREAD ffffe001d3a27040  Cid 10f0.17f4  Teb: 000000ee6cf9d000 Win32Thread: 0000000000000000 RUNNING on processor 0

Çalışan iş parçacığı hakkında daha fazla bilgi görüntülemek için !thread yazın. Aşağıdakine benzer bilgiler görüntülenmelidir.

0: kd> !thread
THREAD ffffe001d3a27040  Cid 10f0.17f4  Teb: 000000ee6cf9d000 Win32Thread: 0000000000000000 RUNNING on processor 0
IRP List:
    ffffe001d429e580: (0006,02c8) Flags: 000008b4  Mdl: 00000000
Not impersonating
DeviceMap                 ffffc00019113080
Owning Process            ffffe001d147c840       Image:         audiodg.exe
Attached Process          N/A            Image:         N/A
Wait Start TickCount      537630         Ticks: 0
Context Switch Count      63             IdealProcessor: 1             
UserTime                  00:00:00.000
KernelTime                00:00:00.015
Win32 Start Address 0x00007fff6978b350
Stack Init ffffd001c70c6dd0 Current ffffd001c70c6520
Base ffffd001c70c7000 Limit ffffd001c70c1000 Call 0
Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
Child-SP          RetAddr           : Args to Child                                                           : Call Site
ffffd001`c70c62a8 fffff800`7a0fa607 : ffffe001`d4aec5c0 ffffe001`cdefd3d8 ffffe001`d4aec5c0 ffffe001`cdefd390 : tabletaudiosample!CMiniportWaveRT::NewStream [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 562]
ffffd001`c70c62b0 fffff800`7a0fb2c3 : 00000000`00000000 ffffe001`d429e580 ffffe001`d4ea47b0 ffffe001`cdefd3d8 : portcls!CPortPinWaveRT::Init+0x2e7
ffffd001`c70c6340 fffff800`7a0fc7f9 : ffffe001`d4aec430 00000000`00000000 ffffe001`d10b8380 ffffe001`d429e580 : portcls!CPortFilterWaveRT::NewIrpTarget+0x193
ffffd001`c70c63c0 fffff800`7a180552 : 00000000`00000000 ffffe001`d10b8380 ffffe001`d429e580 ffffe001`d4565600 : portcls!xDispatchCreate+0xd9
ffffd001`c70c6450 fffff800`7a109a9a : ffffe001`d10b84d0 ffffe001`d10b8380 00000000`00000000 ffffe001`00000000 : ks!KsDispatchIrp+0x272
ffffd001`c70c6510 fffff800`7bd314b1 : ffffe001`d429e580 ffffd001`c70c6590 ffffe001`d429e800 ffffe001`ce80da70 : portcls!DispatchCreate+0x7a
ffffd001`c70c6540 fffff803`cda1bfa8 : 00000000`00000025 00000000`00000000 00000000`00000000 ffffe001`d429e580 : ksthunk!CKernelFilterDevice::DispatchIrp+0xf9
ffffd001`c70c65a0 fffff803`cda7b306 : 00000000`000002fc ffffe001`d5e0d510 00000000`00000000 ffffe001`d3341bd0 : nt!IopParseDevice+0x7c8
ffffd001`c70c6770 fffff803`cda12916 : 00000000`000002fc ffffd001`c70c68d0 ffffe001`d3341ba0 fffff803`cda7b250 : nt!IopParseFile+0xb6
ffffd001`c70c67d0 fffff803`cda1131c : ffffe001`ceb6c601 ffffd001`c70c69e0 00000000`00000040 ffffe001`cd127dc0 : nt!ObpLookupObjectName+0x776
ffffd001`c70c6970 fffff803`cd9fedb8 : ffff8ab8`00000001 ffffe001`d5e0d510 00000000`00000000 00000000`00000000 : nt!ObOpenObjectByNameEx+0x1ec
ffffd001`c70c6a90 fffff803`cd9fe919 : 000000ee`6d37c6e8 00000004`6d37c500 000000ee`6d37c5f0 000000ee`6d37c5e0 : nt!IopCreateFile+0x3d8
ffffd001`c70c6b40 fffff803`cd752fa3 : fffff6fb`7da05360 fffff6fb`40a6c0a8 fffff681`4d815760 ffff8ab8`92895e23 : nt!NtCreateFile+0x79
ffffd001`c70c6bd0 00007fff`69805b74 : 00007fff`487484e6 0000029b`00000003 00000000`0000012e 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ ffffd001`c70c6c40)
000000ee`6d37c568 00007fff`487484e6 : 0000029b`00000003 00000000`0000012e 00000000`00000000 00000000`00000000 : 0x00007fff`69805b74
000000ee`6d37c570 0000029b`00000003 : 00000000`0000012e 00000000`00000000 00000000`00000000 00000000`00000000 : 0x00007fff`487484e6
000000ee`6d37c578 00000000`0000012e : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000080 : 0x0000029b`00000003
000000ee`6d37c580 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000080 00000000`00000000 : 0x12e

İş parçacığıyla ilişkili çağrı yığınını görüntülemek için k komutunu kullanın.

0: kd> k
# Child-SP          RetAddr           Call Site
00 ffffd001`c70c62a8 fffff800`7a0fa607 tabletaudiosample!CMiniportWaveRT::NewStream [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 562]
01 ffffd001`c70c62b0 fffff800`7a0fb2c3 portcls!CPortPinWaveRT::Init+0x2e7
02 ffffd001`c70c6340 fffff800`7a0fc7f9 portcls!CPortFilterWaveRT::NewIrpTarget+0x193
03 ffffd001`c70c63c0 fffff800`7a180552 portcls!xDispatchCreate+0xd9
04 ffffd001`c70c6450 fffff800`7a109a9a ks!KsDispatchIrp+0x272
05 ffffd001`c70c6510 fffff800`7bd314b1 portcls!DispatchCreate+0x7a
06 ffffd001`c70c6540 fffff803`cda1bfa8 ksthunk!CKernelFilterDevice::DispatchIrp+0xf9
07 ffffd001`c70c65a0 fffff803`cda7b306 nt!IopParseDevice+0x7c8
08 ffffd001`c70c6770 fffff803`cda12916 nt!IopParseFile+0xb6
09 ffffd001`c70c67d0 fffff803`cda1131c nt!ObpLookupObjectName+0x776
0a ffffd001`c70c6970 fffff803`cd9fedb8 nt!ObOpenObjectByNameEx+0x1ec
0b ffffd001`c70c6a90 fffff803`cd9fe919 nt!IopCreateFile+0x3d8
0c ffffd001`c70c6b40 fffff803`cd752fa3 nt!NtCreateFile+0x79
0d ffffd001`c70c6bd0 00007fff`69805b74 nt!KiSystemServiceCopyEnd+0x13
0e 000000ee`6d37c568 00007fff`487484e6 0x00007fff`69805b74
0f 000000ee`6d37c570 0000029b`00000003 0x00007fff`487484e6
10 000000ee`6d37c578 00000000`0000012e 0x0000029b`00000003
11 000000ee`6d37c580 00000000`00000000 0x12e

Medya klibi oynatılmayı bitirene kadar kodu ileriye doğru çalıştırmak için hata ayıklayıcıya 'g' tuşuna basın. Ardından, Ctrl - ScrLk (Ctrl-Break) tuşlarına basarak hata ayıklayıcıya girin. Şimdi farklı bir iş parçacığı çalıştırdığınızı onaylamak için !thread komutunu kullanın.

0: kd> !thread
THREAD ffffe001ce80b840  Cid 17e4.01ec  Teb: 00000071fa9b9000 Win32Thread: ffffe001d41690d0 RUNNING on processor 0
Not impersonating
DeviceMap                 ffffc0001974e2c0
Owning Process            ffffe001d1760840       Image:         rundll32.exe
Attached Process          N/A            Image:         N/A
Wait Start TickCount      538040         Ticks: 0
Context Switch Count      3181840        IdealProcessor: 0             
UserTime                  00:00:08.250
KernelTime                00:00:10.796
Win32 Start Address 0x00007ff6d2f24270
Stack Init ffffd001cd16afd0 Current ffffd001cd16a730
Base ffffd001cd16b000 Limit ffffd001cd165000 Call 0
Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5

Child-SP          RetAddr           : Args to Child                                                           : Call Site
fffff803`cf373d18 fffff800`7a202852 : fffff803`cf373e60 00000000`00000001 ffffe001`cf4ed330 00000000`0000ffff : nt!DbgBreakPointWithStatus
fffff803`cf373d20 fffff803`cd6742c6 : ffffe001`cf4ed2f0 fffff803`cf373e60 00000000`00000001 00000000`0004e4b8 : kdnic!TXSendCompleteDpc+0x142
fffff803`cf373d60 fffff803`cd74d495 : 00000000`00000000 fffff803`cd923180 fffff803`cde1f4b0 fffff901`40669010 : nt!KiRetireDpcList+0x5f6
fffff803`cf373fb0 fffff803`cd74d2a0 : 00000000`00000090 0000000e`0000006a 00000000`00000092 00000000`00000000 : nt!KxRetireDpcList+0x5 (TrapFrame @ fffff803`cf373e70)
ffffd001`cd16a6c0 fffff803`cd74bd75 : 00000000`00000000 fffff803`cd74a031 00000000`00000000 00000000`00000000 : nt!KiDispatchInterruptContinue
ffffd001`cd16a6f0 fffff803`cd74a031 : 00000000`00000000 00000000`00000000 ffffe001`cff4d2a0 fffff803`cd67738e : nt!KiDpcInterruptBypass+0x25
ffffd001`cd16a700 fffff960`50cdb5a4 : fffff901`400006d0 00000000`00000001 fffff901`40000d60 ffffd001`cd16a9f0 : nt!KiInterruptDispatchNoLockNoEtw+0xb1 (TrapFrame @ ffffd001`cd16a700)
ffffd001`cd16a890 fffff960`50c66b2f : 00000000`00000000 fffff901`40669010 fffff901`42358580 fffff901`40000d60 : win32kfull!Win32FreePoolImpl+0x34
ffffd001`cd16a8c0 fffff960`50c68cd6 : 00000000`00000000 ffffd001`cd16a9f0 fffff901`400006d0 fffff901`400c0460 : win32kfull!EXLATEOBJ::vAltUnlock+0x1f
ffffd001`cd16a8f0 fffff803`cd752fa3 : 00000000`00000000 00000000`00000000 ffffe001`ce80b840 00000000`00000000 : win32kfull!NtGdiAlphaBlend+0x1d16
ffffd001`cd16add0 00007fff`674c1494 : 00007fff`674b1e97 0000a7c6`daee0559 00000000`00000001 0000020b`741f3c50 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ ffffd001`cd16ae40)
00000071`fa74c9a8 00007fff`674b1e97 : 0000a7c6`daee0559 00000000`00000001 0000020b`741f3c50 00000000`00ffffff : 0x00007fff`674c1494
00000071`fa74c9b0 0000a7c6`daee0559 : 00000000`00000001 0000020b`741f3c50 00000000`00ffffff 00000000`00000030 : 0x00007fff`674b1e97
00000071`fa74c9b8 00000000`00000001 : 0000020b`741f3c50 00000000`00ffffff 00000000`00000030 00000000`01010bff : 0x0000a7c6`daee0559
00000071`fa74c9c0 0000020b`741f3c50 : 00000000`00ffffff 00000000`00000030 00000000`01010bff 00000000`00000000 : 0x1
00000071`fa74c9c8 00000000`00ffffff : 00000000`00000030 00000000`01010bff 00000000`00000000 00000000`000000c0 : 0x0000020b`741f3c50
00000071`fa74c9d0 00000000`00000030 : 00000000`01010bff 00000000`00000000 00000000`000000c0 00000000`00000030 : 0xffffff
00000071`fa74c9d8 00000000`01010bff : 00000000`00000000 00000000`000000c0 00000000`00000030 00000071`00000030 : 0x30
00000071`fa74c9e0 00000000`00000000 : 00000000`000000c0 00000000`00000030 00000071`00000030 00000071`01ff8000 : 0x1010bff

Görüntü adı rundll32.exe, medya klibini oynatmayla ilişkilendirilmiş resim adı değildir.

Not Geçerli iş parçacığını ayarlamak için, .thread <iş parçacığı numarası> yazın.

İş parçacıkları ve işlemler hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.

İş Parçacıkları ve İşlemler

Bağlamları Değiştirme

Bölüm 11: IRQL, yazmaçlar ve ayrıştırma

Kaydedilen IRQL'i görüntüleme

Bölüm 11'de IRQL'i ve kayıt defterlerinin içeriğini görüntüleyeceksiniz.

<- Konak sisteminde

Kesme isteği düzeyi (IRQL), kesme hizmeti önceliğini yönetmek için kullanılır. Her işlemci, iş parçacıklarının yükseltebileceği veya azaltabileceği bir IRQL ayarına sahiptir. İşlemcinin IRQL ayarında veya altında gerçekleşen kesmeler maskelenir ve mevcut işlemi engellemez. İşlemcinin IRQL ayarının üzerinde gerçekleşen kesmeler mevcut işlemden önceliklidir. !irql uzantısı, hata ayıklama kesintisi oluşmadan önce hedef bilgisayardaki geçerli işlemcide kesme isteği düzeyini (IRQL) gösterir. Hedef bilgisayar hata ayıklayıcıya girdiğinde, IRQL değişir, ancak hata ayıklayıcı kırılmasından hemen önce etkili olan IRQL kaydedilir ve !irql tarafından görüntülenir.

0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)

< Yazmaçları ve ayrıştırmaları görüntüleme

Yazmaçları görüntüle

r (Registers) komutunu kullanarak geçerli işlemcideki geçerli iş parçacığı için yazmaçların içeriğini görüntüleyin.

0: kd> r
rax=000000000000c301 rbx=ffffe00173eed880 rcx=0000000000000001
rdx=000000d800000000 rsi=ffffe00173eed8e0 rdi=ffffe00173eed8f0
rip=fffff803bb757020 rsp=ffffd001f01f8988 rbp=ffffe00173f0b620
 r8=000000000000003e  r9=ffffe00167a4a000 r10=000000000000001e
r11=ffffd001f01f88f8 r12=0000000000000000 r13=ffffd001f01efdc0
r14=0000000000000001 r15=0000000000000000
iopl=0         nv up ei pl nz na pe nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
nt!DbgBreakPointWithStatus:
fffff803`bb757020 cc              int     3

Alternatif bir yöntem olarak, Görünüm>Yazmaçlaröğesini seçerek yazmaçların içeriğini görüntüleyebilirsiniz.

Yaklaşık 12 yazmaç görüntüleyen WinDbg yazmaçları penceresinin ekran görüntüsü.

Makine dili kod yürütmesi ve diğer senaryolarda yazmaçların içeriğini görüntülemek yararlı olabilir. Daha fazla bilgi için bkz. r (Yazmaçlar).

Yazmaç içeriği hakkında bilgi için bkz. x86 Mimarisi ve x64 Mimarisi.

Demontaj

Çalıştırılmakta olan kodu görüntülemek için Görüntüle>Ayrıştırma seçeneğini seçerek derleme dili kodunu görüntüleyebilirsiniz.

Derleme dili kodunu gösteren WinDbg ayrıştırma penceresinin ekran görüntüsü.

Derleme dilinin ayrıştırılması hakkında daha fazla bilgi için bkz. Açıklamalı x86 Ayrıştırma ve Açıklamalı x64 Ayrıştırma.

Bölüm 12: Bellekle çalışma

Bölüm 12'de, belleğin içeriğini görüntülemek için hata ayıklayıcı komutlarını kullanacaksınız.

Belleği görüntüle

Bir sorunu tanımlamak veya değişkenleri, işaretçileri vb. incelemek için belleği incelemeniz gerekebilir. Aşağıdaki d* <adres> komutlarından birini yazarak belleği görüntüleyebilirsiniz.

Db

Verileri bayt değerlerinde ve ASCII karakterlerinde görüntüler.

Dd

Verileri çift geniş sözcükler (4 bayt) olarak görüntüler.

"du"

Verileri Unicode karakterleri olarak görüntüler.

Dw

Verileri sözcük değerleri (2 bayt) ve ASCII karakterleri olarak görüntüler.

Not Geçersiz bir adres görüntülemeye çalışırsanız, içeriği soru işaretleri (?) olarak gösterilir.

Alternatif olarak, Belleği Görüntüle'yi seçerekbelleğigörüntüleyebilirsiniz>. Belleğin nasıl görüntülendiğini değiştirmek için Görüntü biçimi açılır menüsünü kullanın.

Çeşitli görüntüleme biçimi seçeneklerine sahip WinDbg görünümü bellek penceresinin ekran görüntüsü.

  1. Ses seviyesi denetimi ile ilişkili verileri görüntülemek için, bm komutunu kullanarak PropertyHandlerAudioEngineVolumeLevel yordamında tetiklenecek bir kesme noktası ayarlayın. Yeni kesme noktasını ayarlamadan önce bc * kullanarak önceki kesme noktalarının tümünü temizleyeceğiz.

    kd> bc *
    
  2. bm komutunu kullanarak PropertyHandlerAudioEngineVolumeLevel yordamında tetiklemek için bir kesme noktası ayarlayın.

    kd> bm tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume
      1: fffff80f`02c3a4b0 @!"tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume"
    
  3. Kesme noktasının düzgün ayarlandığını onaylamak için kesme noktalarını listeleyin.

    kd> bl
      1: fffff80f`02c3a4b0 @!"tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume"
    
  4. Kod yürütmeyi yeniden başlatmak için g komutunu kullanın.

    Hedef sistemde sistem tepsisindeki ses düzeyini ayarlayın. Bu, kesme noktasının yanmasına neden olur.

    Breakpoint 1 hit
    tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume:
    fffff80f`02c3a4b0 44894c2420      mov     dword ptr [rsp+20h],r9d
    
  5. Yerel değişkenleri görüntülemek içinYereliGörüntüle> menü öğesini kullanın. IVolume değişkeninin geçerli değerini not edin.

  6. Dt komutunu ve değişkenin adını yazarak örnek kodda IVolume değişkeninin veri türünü ve geçerli değerini görüntüleyebilirsiniz.

    kd> dt lVolume
    Local var @ 0xa011ea50 Type long
    0n-6291456
    
  7. Kesme noktasına SetDeviceChannelVolume girilirken isabet edilir.

    STDMETHODIMP_(NTSTATUS) CMiniportWaveRT::SetDeviceChannelVolume(_In_  ULONG _ulNodeId, _In_ UINT32 _uiChannel, _In_  LONG  _Volume)
    {
        NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
    
        PAGED_CODE ();
    
        DPF_ENTER(("[CMiniportWaveRT::SetEndpointChannelVolume]"));
        IF_TRUE_ACTION_JUMP(_ulNodeId != KSNODE_WAVE_AUDIO_ENGINE, ntStatus = STATUS_INVALID_DEVICE_REQUEST, Exit);
    
        // Snap the volume level to our range of steppings.
        LONG lVolume = VOLUME_NORMALIZE_IN_RANGE(_Volume); 
    
        ntStatus = SetChannelVolume(_uiChannel, lVolume);
    Exit:
        return ntStatus;
    }
    
  8. dt (Görüntüleme Türü) komutunu kullanarak değeri IVolume'un bellek konumunda görüntülemeye çalışın.

    kd> dt dt lVolume
    Local var @ 0xffffb780b7eee664 Type long
    0n0
    

    Değişken henüz tanımlanmadığından, bilgi içermez.

  9. SetDeviceChannelVolume içindeki son kod satırına ilerlemek için F10 tuşuna basın.

        return ntStatus;
    
  10. dt (Görüntüleme Türü) komutunu kullanarak değeri IVolume'un bellek konumunda görüntüleyin.

    kd> dt lVolume
    Local var @ 0xffffb780b7eee664 Type long
    0n-6291456
    

    Değişkenin etkin olduğuna göre, bu örnekte 6291456 değeri görüntülenir.

  11. Ayrıca? komutunu kullanarak IVolume'un bellek konumunu görüntüleyebilirsiniz . (İfadeyi Değerlendir) komut.

    kd> ? lVolume
    Evaluate expression: -79711507126684 = ffffb780`b7eee664
    
  12. Gösterilen adres olan ffffb780'b7eee664 , lVolume değişkeninin adresidir. Bu konumdaki belleğin içeriğini görüntülemek için dd komutunu kullanın.

    kd>  dd ffffb780`b7eee664
    ffffb780`b7eee664  ffa00000 00000018 00000000 c52d7008
    ffffb780`b7eee674  ffffc98e e0495756 fffff80e c52d7008
    ffffb780`b7eee684  ffffc98e 00000000 fffff80e 00000000
    ffffb780`b7eee694  ffffc98e ffa00000 ffffb780 b7eee710
    ffffb780`b7eee6a4  ffffb780 00000000 00000000 c7477260
    ffffb780`b7eee6b4  ffffc98e b7eee7a0 ffffb780 b7eee6f0
    ffffb780`b7eee6c4  ffffb780 e04959ca fffff80e 00000000
    ffffb780`b7eee6d4  00000000 00000028 00000000 00000002
    
  13. L4 aralık parametresini belirterek adresin ilk dört baytını görüntüleyebilirsiniz.

    kd> dd ffffb780`b7eee664 l4
    ffffb780`b7eee664  ffa00000 00000018 00000000 c52d7008
    
  14. Görüntülenen farklı bellek çıkışı türlerini görmek için du, da ve db komutlarını yazın.

    kd> du ffffb780`b7eee664 
    ffffb780`b7eee664  ""
    
    kd> a ffffb780`b7eee664 
    ffffb780`b7eee664  ""
    
    kd> db 0xffffae015ff97664 
    ffffae01`5ff97664  00 80 bc ff 18 00 00 00-00 00 00 00 08 50 e0 51  .............P.Q
    ffffae01`5ff97674  00 c0 ff ff 56 57 da 56-0e f8 ff ff 08 50 e0 51  ....VW.V.....P.Q
    ffffae01`5ff97684  00 c0 ff ff 00 00 00 00-0e f8 ff ff 00 00 00 00  ................
    ffffae01`5ff97694  00 c0 ff ff aa 80 bc ff-01 ae ff ff 10 77 f9 5f  .............w._
    ffffae01`5ff976a4  01 ae ff ff 40 00 00 00-00 e6 ff ff 10 dc 30 55  ....@.........0U
    ffffae01`5ff976b4  00 c0 ff ff a0 77 f9 5f-01 ae ff ff f0 76 f9 5f  .....w._.....v._
    ffffae01`5ff976c4  01 ae ff ff ca 59 da 56-0e f8 ff ff 00 00 00 00  .....Y.V........
    ffffae01`5ff976d4  00 00 00 00 28 00 00 00-00 00 00 00 02 00 00 00  ....(...........
    

    Verileri tek duyarlıklı kayan noktalı sayılar (4 bayt) olarak görüntülemek için df float seçeneğini kullanın.

    df ffffb780`b7eee664 
    ffffb780`b7eee664          -1.#QNAN   3.3631163e-044                0        -2775.002
    ffffb780`b7eee674          -1.#QNAN  -5.8032637e+019         -1.#QNAN        -2775.002
    ffffb780`b7eee684          -1.#QNAN                0         -1.#QNAN                0
    ffffb780`b7eee694          -1.#QNAN         -1.#QNAN         -1.#QNAN  -2.8479408e-005
    

Belleğe yazma

Belleği okumak için kullanılan komutlara benzer şekilde, bellek içeriğini değiştirmek için e* komutlarını kullanabilirsiniz.

Komut Açıklama

her biri

ASCII dizesi (NULL ile sonlandırılmamış)

AB

Unicode dizesi (NULL ile sonlandırılmamış)

Ew

Word değerleri (2 bayt)

eza

NULL ile sonlandırılan ASCII dizesi

ezu

NULL ile sonlandırılan Unicode dizesi

Eb

Bayt değerleri

Ed

Çift sözcüklü değerler (4 bayt)

Aşağıdaki örnekte belleğin üzerine yazma gösterilmektedir.

  1. İlk olarak, örnek kodda kullanılan lVolume adresini bulun.

    kd> ? lVolume
    Evaluate expression: -79711507126684 = ffffb780`b7eee664
    
  2. eb komutunu kullanarak bu bellek adresinin üzerine yeni karakterler yazın.

    kd> eb 0xffffb780`b7eee664 11 11 11 11 11
    
  3. Db komutunu yazarak karakterlerin üzerine yazıldığını onaylamak için bellek konumunu görüntüleyin.

    kd> db 0xffffb780`b7eee664
    ffffb780`b7eee664  11 11 11 11 11 00 00 00-00 00 00 00 08 70 2d c5  .............p-.
    ffffb780`b7eee674  8e c9 ff ff 56 57 49 e0-0e f8 ff ff 08 70 2d c5  ....VWI......p-.
    ffffb780`b7eee684  8e c9 ff ff 00 00 00 00-0e f8 ff ff 00 00 00 00  ................
    ffffb780`b7eee694  8e c9 ff ff 00 00 a0 ff-80 b7 ff ff 10 e7 ee b7  ................
    ffffb780`b7eee6a4  80 b7 ff ff 00 00 00 00-00 00 00 00 60 72 47 c7  ............`rG.
    ffffb780`b7eee6b4  8e c9 ff ff a0 e7 ee b7-80 b7 ff ff f0 e6 ee b7  ................
    ffffb780`b7eee6c4  80 b7 ff ff ca 59 49 e0-0e f8 ff ff 00 00 00 00  .....YI.........
    ffffb780`b7eee6d4  00 00 00 00 28 00 00 00-00 00 00 00 02 00 00 00  ....(...........
    

Alternatif olarak, saat veya yerel ayarlar penceresinde belleğin içeriğini değiştirebilirsiniz. Geçerli çerçevenin bağlamı dışında olan değişkenleri izleme penceresinde görebilirsiniz. Bağlam içinde değillerse bunları değiştirmek uygun değildir.

Bölüm 13: WinDbg oturumunu sonlandırma

<-Konak sisteminde

Hata ayıklayıcıyı bağlı bırakmak istiyor ama hedef üzerinde çalışmak istiyorsanız, bc *kullanarak tüm kesme noktalarını temizleyin; böylece hedef bilgisayar konak bilgisayarın hata ayıklayıcısına bağlanmaya çalışmaz. Ardından hedef bilgisayarın yeniden çalışmasına izin vermek için g komutunu kullanın.

Hata ayıklama oturumunu sonlandırmak için ana sistemde hata ayıklayıcıya girin ve qd (Çık ve Ayır) komutunu girin veya menüden Hata Ayıklamayı Durdur seçin.

0: kd> qd

Daha fazla bilgi için, hata ayıklama başvuru belgelerindeki WinDbg'de Hata Ayıklama Oturumunu Sonlandırma (Klasik) bölümüne bakın.

Bölüm 14: Windows hata ayıklama kaynakları

Windows hata ayıklaması hakkında ek bilgiler sağlanır. Bu kitaplardan bazılarının örneklerinde Windows Vista gibi windows'un eski sürümlerini kullanacağını, ancak ele alınan kavramların Windows'un çoğu sürümü için geçerli olduğunu unutmayın.

Kitaplar

  • Mario Hewardt ve Daniel Pravat tarafından Gelişmiş Windows Hata Ayıklama

  • Windows'un İçinde Hata Ayıklama: Tarik Soulami Tarafından Windows'ta® Hata Ayıklama ve İzleme Stratejileri için Pratik Bir Kılavuz

  • Windows Internals by Pavel Yosifovich, Alex Ionescu, Mark Russinovich and David Solomon

Video

Defrag Araçları Gösterisi WinDbg Bölümleri 13-29: </shows/defrag-tools/>

Eğitim Satıcıları:

OSR - https://www.osr.com/

Ayrıca Bkz.

Windows Hata Ayıklamaya Başlarken