Aracılığıyla paylaş


Windows sürücülerinde hata ayıklama adım adım laboratuvar çalışması (echo çekirdek modu)

Bu laboratuvar, WinDbg çekirdek hata ayıklayıcısını tanıtır. Yankı çekirdek modu örnek sürücü kodunda hata ayıklamak için WinDbg kullanırsınız.

Laboratuvar hedefleri

Bu laboratuvar, hata ayıklama araçlarını tanıtan, yaygın hata ayıklama komutlarını öğreten, kesme noktalarının kullanımını anlatan ve hata ayıklama uzantılarının nasıl kullanılacağını gösteren egzersizler içerir.

Bu laboratuvarda, aşağıdaki eylemleri keşfetmek için canlı çekirdek hata ayıklama bağlantısı kullanırsınız:

  • Windows hata ayıklayıcısı komutlarını kullanma
  • Standart komutları kullanın (çağrı yığınları, değişkenler, iş parçacıkları, IRQL)
  • Gelişmiş sürücü hata ayıklama komutlarını kullanma (!komutlar)
  • Sembolleri kullanma
  • Canlı hata ayıklamada kesme noktaları ayarlama
  • Çağrı yığınlarını görüntüleme
  • Tak Çalıştır cihaz ağacını görüntüleme
  • İş parçacığı ve işlem bağlamı ile çalışma

Kullanıcı ve çekirdek modunda hata ayıklama

Windows hata ayıklayıcısı ile çalışırken iki tür hata ayıklama yapabilirsiniz:

Kullanıcı modu - Uygulamalar ve alt sistemler bilgisayarda kullanıcı modunda çalışır. Kullanıcı modunda çalışan işlemler bunu kendi sanal adres alanları içinde yapar. Sistem donanımı, kullanımları için ayrılmamış bellek ve sistemin bütünlüğünü tehlikeye atabilecek diğer bölümleri dahil olmak üzere sistemin birçok bölümüne doğrudan erişim sağlamaları kısıtlanır. Kullanıcı modunda çalışan işlemler sistemden ve diğer kullanıcı modu işlemlerinden etkili bir şekilde yalıtıldığından, bu kaynakları engelleyemezler.

Çekirdek modu - İşletim sistemi ve ayrıcalıklı programlar çekirdek modunda çalışır. Çekirdek modu kodu, sistemin herhangi bir bölümüne erişme iznine sahiptir. Kullanıcı modu kodu gibi kısıtlı değildir. Kullanıcı modunda veya çekirdek modunda çalışan diğer işlemlerin herhangi bir bölümüne erişim sağlayabilir. Çekirdek işletim sistemi işlevselliğinin çoğu ve birçok donanım cihaz sürücüsü çekirdek modunda çalışır.

Bu alıştırma, hem kullanıcı modu hem de çekirdek modunda hata ayıklama sırasında sık kullanılan hata ayıklama komutlarını kapsar. Alıştırma, bazen "bang" !commandsolarak adlandırılan ve çekirdek modunda hata ayıklama için kullanılan hata ayıklama uzantılarını da kapsar.

Laboratuvar kurulumu

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

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

Laboratuvarı tamamlamak için aşağıdaki yazılıma ihtiyacınız vardır:

  • Visual Studio
  • Windows 11 için Windows Yazılım Geliştirme Seti (SDK)
  • Windows 11 için Windows Sürücü Seti (WDK)
  • Windows 11 için örnek yankı sürücüsü

Laboratuvarda aşağıdaki bölümler vardır:

Çekirdek modunda WinDbg oturumuna bağlanma

Bu bölümde, konak ve hedef sistemde ağ hata ayıklamasını yapılandırın.

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. Windows hata ayıklayıcısı ana bilgisayar sisteminde ve Çekirdek Modu Sürücü Çerçevesi (KMDF) yankı sürücüsü hedef sisteminde çalışır.

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

Bir ağ hub'ı veya yönlendirici 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 protokolünü kullanma hakkında bilgi için bkz. WinDbg ile çalışmaya başlama (çekirdek modu). Hedef bilgisayarı ayarlama hakkında daha fazla bilgi için bkz. El ile sürücü dağıtımı için bilgisayar hazırlama ve KDNET ağ çekirdeği hata ayıklamasını otomatik olarak ayarlama.

Ethernet kullanarak çekirdek modu hata ayıklamasını yapılandırma

Ana bilgisayar IP adresini kaydetme

Hedef sistemde çekirdek modu hata ayıklamasını etkinleştirmek için:

  1. Konak sisteminde bir Komut İstemi penceresi açın ve IPv4 adresini belirlemek için ipconfig girin.

    Windows IP Configuration
    Ethernet adapter Ethernet:
       Connection-specific DNS Suffix  . :
       Link-local IPv6 Address . . . . . : fe80::c8b6:db13:d1e8:b13b%3
       Autoconfiguration IPv4 Address. . : 169.182.1.1
       Subnet Mask . . . . . . . . . . . : 255.255.0.0
       Default Gateway . . . . . . . . . :
    
  2. Konak sisteminin IP adresini kaydedin: ______________________________________

Hata ayıklamayı etkinleştirmek için önyükleme ayarlarını değiştirme

Aşağıdaki adımları tamamlayarak hedef sistemde çekirdek modu hata ayıklamasını etkinleştirin.

Ö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. 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.

Uyarı

Bağlantının güvenliğini artırmak ve rastgele istemci hata ayıklayıcısı bağlantı isteklerinin riskini azaltmak için otomatik olarak oluşturulan rastgele bir anahtar kullanın. Daha fazla bilgi için bkz. KDNET ağ çekirdeği hata ayıklamasını otomatik olarak ayarlama.

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. Böyle bir durum söz konusu değilse, en iyi yaklaşım, hedefin çalıştığı ana bilgisayarda aynı "bitliğe" sahip araçları ç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
  1. dbgsettings değerlerinin düzgün ayarlandığını onaylamak için şu komutu girin:

    bcdedit /dbgsettings
    
    key                     2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
    debugtype               NET
    hostip                  169.168.1.1
    port                    50000
    dhcp                    Yes
    The operation completed successfully.
    

    Not

    Güvenlik duvarından bir ileti alırsanız ve hata ayıklayıcısını kullanmak istiyorsanız, kutuların üçünü de seçin.

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

  2. Ana bilgisayarda, Yönetici olarak bir Komut İstemi penceresi açın. Bu laboratuvar, Windows seti yüklemesi kapsamında yüklenen Windows Sürücü Seti'nden (WDK) WinDbg.exe x64 sürümünü kullanır. Varsayılan WinDbg dizinine geçin; varsayılan konum aşağıda gösterilir.

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

    Bu laboratuvar, her iki bilgisayarın da hedefte ve konakta Windows'un 64 bit sürümünü çalıştırdığını varsayar. Böyle bir durum söz konusu değilse en iyi yaklaşım, hedefte çalıştırılan araçların aynı bitlikte olanını ana bilgisayarda çalıştırmaktır. Örneğin, hedef 32 bit Windows çalıştırıyorsa konakta hata ayıklayıcının 32 bit 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.

  3. Aşağıdaki komutu kullanarak uzak kullanıcı hata ayıklaması ile WinDbg'yi açın. Anahtar ve bağlantı noktası değerleri, hedef bilgisayarda BCDEdit kullanarak daha önce ayarladığınız değerlerle eşleşmektedir.

    WinDbg –k net:port=50000,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
    
  4. Hedef sistemi yeniden başlatın.

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

    Microsoft (R) Windows Debugger Version 10.0.17074.1002 AMD64
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    Using NET for debugging
    Opened WinSock 2.0
    Waiting to reconnect...
    Connected to target 169.182.1.1 on port 50005 on local IP 169.182.1.2
    You can get the target MAC address by running .kdtargetmac command.
    Connected to Windows 10 16299 x64 target at (Wed Feb 28 17:16:23.051 2018 (UTC - 8:00)), ptr64 TRUE
    Kernel Debugger connection established.  (Initial Breakpoint requested)
    Symbol search path is: srv*
    Executable search path is: 
    Windows 10 Kernel Version 16299 MP (4 procs) Free x64
    Product: WinNt, suite: TerminalServer SingleUserTS
    Built by: 16299.15.amd64fre.rs3_release.170928-1534
    Machine Name:
    Kernel base = 0xfffff800`9540d000 PsLoadedModuleList = 0xfffff800`95774110
    Debug session time: Wed Feb 28 17:16:23.816 2018 (UTC - 8:00)
    System Uptime: 0 days 0:00:20.534
    

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. Pencerenin en altındaki komut girişi bölmesi olan daha küçük bölmeye komutları girin ve pencerenin en üstündeki daha büyük bölmede komut çıkışını görüntüleyin.

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.

Çekirdek modu hata ayıklama komutları ve teknikleri

Bu bölümde, hedef sistem hakkındaki bilgileri görüntülemek için hata ayıklama komutlarını kullanın.

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

  1. Konak sisteminde, hedef sistemde çalışmakta olan koda müdahale etmek için WinDBg'de Ctrl+Scroll Lock tuşlarını kullanın. Hedef sistemin yanıt vermesi biraz zaman alabilir.

    Ana ekran, hata ayıklayıcıda canlı çekirdek bağlantısından Komut Penceresi çıkışını gösteriyor.

  2. Hata Ayıklayıcı Komut penceresinde DML'yi etkinleştirmek için aşağıdaki komutu girin:

    0: kd> .prefer_dml 1
    DML versions of commands on by default
    
  3. .hh komutunu kullanarak başvuru komutu yardımına erişebilirsiniz. .prefer_dmliçin komut başvurusu yardımını görüntülemek için aşağıdaki komutu girin:

    0: kd> .hh .prefer_dml
    

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

    .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ü.

  4. Hedef sistemde ayrıntılı sürüm bilgilerini görüntülemek için WinDbg penceresinde vertarget (Hedef Bilgisayar Sürümünü Göster) komutunu girin:

    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
    
  5. Doğru çekirdek modu işlemiyle çalıştığınızı doğrulamak için, yüklenen modülleri görüntülemek için WinDbg penceresinde lm (Yüklenen Modülleri Listele) komutunu girin:

    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
    ...
    

    Bu laboratuvarda atlanan içerik "..." ile gösterilir.

  6. Belirli bir modül hakkında ayrıntılı bilgi istemek için v (ayrıntılı) seçeneğini kullanın:

    0: Kd> lm v m tcpip
    Browse full module list
    start             end                 module name
    fffff801`09eeb000 fffff801`0a157000   tcpip      (no symbols)           
        Loaded symbol image file: tcpip.sys
        Image path: \SystemRoot\System32\drivers\tcpip.sys
        Image name: tcpip.sys
        Browse all global symbols  functions  data
        Timestamp:        Sun Nov 09 18:59:03 2014 (546029F7)
        CheckSum:         00263DB1
        ImageSize:        0026C000
        Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4
    
    Unable to enumerate user-mode unloaded modules, Win32 error 0n30
    

    Ayarlanmış bir simge yolu ve yüklü simgeler olmadığından, hata ayıklayıcıda sınırlı bilgi sağlanır.

KMDF yankı sürücüsünü indirme ve derleme

Bu bölümde, KMDF yankı sürücüsünü indirip derleyin.

Genellikle WinDbg kullanırken kendi sürücü kodunuzla çalışıyor olursunuz. WinDbg işlemi hakkında bilgi sahibi olmak için bu laboratuvar KMDF Şablonu "Echo" örnek sürücüsünü kullanır. Kaynak kodu, WinDbg'de görüntülenen bilgileri anlamanıza yardımcı olmak için kullanılabilir. Bu örnek, yerel çekirdek modu kodunda tek adım adım nasıl ilerleyebileceğinizi göstermek için de kullanılır. Bu teknik, karmaşık çekirdek modu kod sorunlarının hatalarını ayıklamak için değerli olabilir.

Echo örnek sürücüsünü indirmek ve oluşturmak için:

  1. İlk olarak GitHub'dan KMDF Echo Örneği indirin ve ayıklayın.

    KMDF Echo örneği genel klasöründe bulunur.

    GitHub windows-driver-samples sayfasının genel klasörü ve indirme zip düğmesini vurgulayan ekran görüntüsü.

    1. Sürücü örneklerini tek bir zip dosyasına indirin: Sürücü örnekleri

    2. Zip dosyasını yerel sabit sürücünüze indirin.

    3. Zip dosyasını seçip basılı tutun veya sağ tıklayın ve Tümünü Çıkartseçin. Yeni bir klasör belirtin veya ayıklanan dosyaları depolamak için var olan bir klasöre göz atın. Örneğin, dosyaların ayıklandığı yeni klasör olarak C:\DriverSamples\ belirtebilirsiniz.

    4. Dosyalar ayıklandıktan sonra şu alt klasöre gidin: C:\DriverSamples\general\echo\kmdf

  2. Microsoft Visual Studio'da DosyaProje/ÇözümAç... seçin ve ayıklanan dosyaları içeren klasöre gidin( örneğin, C:\DriverSamples\general\echo\kmdf). kmdfecho çözüm dosyasına çift tıklayarak açın.

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

    kmdfecho projesinden yüklenen device.c dosyasını görüntüleyen Visual Studio ekran görüntüsü.

  3. Numunenin yapılandırma seçeneklerini ve platformunu ayarlayın. Çözüm Gezgini'nde 'kmdfecho' (3 proje) çözümüseçin ve basılı tutun veya sağ tıklayın ve Configuration Manageröğesini seçin. Yapılandırma ve platform ayarlarının üç proje için aynı olduğundan emin olun. Varsayılan olarak, yapılandırma win10 hata ayıklamaolarak ayarlanır ve platform tüm projeler için win64 olarak ayarlanır. Bir proje için yapılandırma veya platform değişiklikleri yaparsanız, kalan üç proje için de aynı değişiklikleri yapın.

  4. 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.

  5. Çalışma zamanı kitaplığını ayarlayın. Eko sürücüsü özellik sayfasını açın ve C/C++>Kod Oluşturma'ü bulun. Çalışma Zamanı Kitaplığı'nı Çok İş Parçacıklı Hata Ayıklama (/MTd) olarak değiştirin. Derleme seçenekleri hakkında daha fazla bilgi için bkz. /MD, /MT, /LD (Run-Time Kitaplığını Kullanma).

    Visual Studio'da çalışma zamanı kitaplığı ayarını vurgulayan echo özellik sayfasının ekran görüntüsü.

  6. Sürücü özelliklerinde, Sürücü İmzalama>İmza Modu'ün Test İmzalamaolarak ayarlandığından emin olun.

    Visual Studio'da işaret modu ayarı vurgulanan yankı özellik sayfasının ekran görüntüsü.

  7. Visual Studio'da Derle>Çözümü Derleöğesini seçin.

    Derleme pencereleri, üç proje için de derlemenin başarılı olduğunu belirten bir ileti görüntülemelidir.

Bahşiş

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. Dosya Gezgini'nde, örneğin ayıklanan dosyalarını içeren klasöre gidin. Örneğin, daha önce belirttiğiniz klasör buysa C:\DriverSamples\general\echo\kmdfgidin. 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. 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.

    Autosync sürücüsü için oluşturulan dosyaları içeren klasöre gidin: C:\DriverSamples\general\echo\kmdf\driver\AutoSync\x64\Debug.

    Klasör şu dosyaları içermelidir:

    Dosya Açıklama
    Echo.sys Sürücü dosyası.
    Echo.inf Sürücüyü yüklemek için gereken bilgileri içeren bir bilgi (INF) dosyası.

    Ayrıca, echoapp.exe dosyası oluşturulmuş ve burada bulunmalıdır: C:\DriverSamples\general\echo\kmdf\exe\x64\Debug.

    Dosya Açıklama
    EchoApp.exe echo.sys sürücüsüyle iletişim kuran bir Komut İstemi yürütülebilir test dosyası.
  2. Yerleşik sürücü dosyalarını ve EchoApp test uygulamasını ana bilgisayardan hedef sisteme kopyalamak için bir USB belleği bulun veya bir ağ paylaşımı ayarlayın.

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

Hedef sisteme KMDF yankı sürücüsü örneğini yükleme

Bu bölümde, yankı örnek sürücüsünü yüklemek için DevCon aracını kullanın.

Sürücüyü yüklediğiniz bilgisayara hedef bilgisayar veya sınama bilgisayarıdenir. Bu bilgisayar genellikle sürücü paketini geliştirip oluşturduğunuz bilgisayardan ayrıdı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.

Test imzalı bir sürücü dağıtmadan önce, test imzalamayı etkinleştirerek hedef bilgisayarı hazırlayın. Ayrıca WDK yüklemenizde DevCon aracını bulmanız ve bunu hedef sisteme kopyalamanız gerekir.

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

Hedef sistemde, test imzalı sürücüleri etkinleştirin:

  1. Windows Ayarları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 başlangıç seçenekleriseçin. Windows 11'deGelişmiş seçeneklerin>Sorunlarını Giderme>Başlangıç Ayarları'nı ve ardından Yeniden Başlat'ı seçin.

  5. F7 tuşuna basarak Sürücü imzası zorlamayı devre dışı bırakma seçeneğini seçin.

  6. Hedef bilgisayarı yeniden başlatın.

Konak sisteminde, WDK yüklemenizde Araçları klasörüne gidin ve DevCon aracını bulun. Örneğin, şu klasöre bakın: C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe.

Oluşturulan sürücü paketinin hedefinde bir klasör oluşturun; örneğin, C:\EchoDriver. devcon.exe hedef sisteme kopyalayın. Ana bilgisayar sisteminde .cer sertifikasını bulun. Sürücü dosyalarını içeren klasörle aynı klasörde, konak bilgisayarda yer almaktadır. Konak bilgisayarda daha önce açıklanan yerleşik sürücüdeki tüm dosyaları kopyalayın ve hedef bilgisayarda oluşturduğunuz klasöre kaydedin.

Hedef bilgisayarda sertifika dosyasını seçip basılı tutun veya sağ tıklayın ve yükle'yi seçin ve ardından sınama sertifikasını yüklemek için istemleri izleyin.

Hedef bilgisayarı ayarlamak için daha ayrıntılı yönergelere ihtiyacınız varsa bkz. Bilgisayarı el ile sürücü dağıtımı için hazırlama.

Aşağıdaki yönergelerde örnek sürücüyü yükleme ve test etme adımları gösterilmektedir. Sürücüyü yüklemek için kullandığınız devcon aracının genel söz dizimi aşağıdadır:

devcon install <INF file> <hardware ID>

Bu sürücüyü yüklemek için gereken INF dosyası echo.inf. Inf dosyası, echo.sysyüklemek için donanım kimliğini içerir. Yankı örneği için donanım kimliği root\ECHO.

Hedef bilgisayarda, Yönetici olarak bir Komut İstemi penceresi açın. Sürücü paketi klasörünüze gidin ve aşağıdaki komutu girin:

devcon install echo.inf root\ECHO

devcon'in tanınmadığı belirtilen bir hata iletisi alırsanız, devcon aracının yolunu eklemeyi deneyin. Örneğin, C:\Toolsadlı bir klasöre kopyaladıysanız aşağıdaki komutu kullanmayı deneyin:

c:\tools\devcon install echo.inf root\ECHO

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 sürücü yazılımının yayımcısını doğrulayamayacağını belirten Windows Güvenliği uyarısının ekran görüntüsü.

Bahşiş

 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

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

Hedef bilgisayardaki Komut İstemi penceresinde, Cihaz Yöneticisi'ni açmak için devmgmt girin. Cihaz Yöneticisi'nde, Görünüm menüsünde Türe göre Cihazlar'ı seçin. Cihaz ağacında Örnek Cihaz düğümünde Örnek WDF Yankı Sürücüsü bulun.

Örnek WDF yankı sürücüsünü vurgulayan Cihaz Yöneticisi ağacının ekran görüntüsü.

Test yankı uygulamasını başlatmak ve sürücünün işlevsel olduğunu onaylamak için echoapp girin.

C:\Samples\KMDF_Echo_Sample> echoapp
DevicePath: \\?\root#sample#0005#{cdc35b6e-0be4-4936-bf5f-5537380a7c1a}
Opened device successfully
512 Pattern Bytes Written successfully
512 Pattern Bytes Read successfully
Pattern Verified successfully
30720 Pattern Bytes Written successfully
30720 Pattern Bytes Read successfully
Pattern Verified successfully

Sürücü hakkındaki bilgileri görüntülemek için WinDbg kullanma

Bu bölümde, sembol yolunu ayarlayın ve KMDF yankı örnek sürücüsü hakkındaki bilgileri görüntülemek için çekirdek hata ayıklayıcısı komutlarını kullanın.

Sürücü hakkındaki bilgileri görüntülemek için:

  1. Konak sisteminde, hata ayıklayıcıyı kapattıysanız, yönetici Komut İstemi penceresinde aşağıdaki komutu kullanarak yeniden açın.

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

  3. WinDbg ortamında Microsoft sembol sunucusunun sembol yolunu ayarlamak için .symfix komutunu kullanın.

    0: kd> .symfix
    
  4. Yerel simgelerinizi kullanmak üzere yerel simge konumunuzu eklemek için, .sympath+ kullanarak yolu ekleyin ve ardından .reload /f.

    0: kd> .sympath+ C:\DriverSamples\general\echo\kmdf
    0: kd> .reload /f
    

    .reload zorla seçeneğine sahip /f 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.

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 kullanmayı denediğinizde, 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.

Simgelerle çalışmak için kullanılabilecek birçok yaklaşım vardır. Birçok durumda, bilgisayarı Microsoft'un ihtiyaç duyulduğunda sağladığı bir sembol sunucusundan sembollere erişecek şekilde yapılandırabilirsiniz. Bu laboratuvarda bu yaklaşım kullanılır. Ortamınızdaki simgeler farklı bir konumdaysa, bu konumu kullanmak için adımları değiştirin. Daha fazla bilgi için bkz. Windows hata ayıklayıcısı için sembol yolu.

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 kod satırlarına nasıl karşılık geldiğini gösterir. 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. Yankı sürücüsü hakkındaki bilgileri görüntülemek için hata ayıklayıcının komut alanına aşağıdaki komutu girin:

    0: kd> lm m echo* v
    Browse full module list
    start             end                 module name
    fffff801`4ae80000 fffff801`4ae89000   ECHO       (private pdb symbols)  C:\Samples\KMDF_ECHO_SAMPLE\echo.pdb
        Loaded symbol image file: ECHO.sys
        Image path: \SystemRoot\system32\DRIVERS\ECHO.sys
        Image name: ECHO.sys
    ...  
    

    Daha fazla bilgi için bkz. lm.

  2. Bu laboratuvar seti daha önce prefer_dml olarak ayarlandığı için, çıkışın bazı öğeleri seçebileceğiniz tıklanabilir bağlantılardır. "a" harfiyle başlayan öge simgeleri hakkında bilgi görüntülemek için hata ayıklama çıktısında Tüm genel simgelere göz at bağlantısını seçin.

    0: kd> x /D Echo!a*
    
  3. Yankı örneği "a" harfiyle başlayan herhangi bir simge içermez, bu nedenle "Yankı" ile başlayan yankı sürücüsüyle ilişkili tüm simgeler hakkındaki bilgileri görüntülemek için x ECHO!Echo* yazın.

    0: kd> x ECHO!Echo*
    fffff801`0bf95690 ECHO!EchoEvtIoQueueContextDestroy (void *)
    fffff801`0bf95000 ECHO!EchoEvtDeviceSelfManagedIoStart (struct WDFDEVICE__ *)
    fffff801`0bf95ac0 ECHO!EchoEvtTimerFunc (struct WDFTIMER__ *)
    fffff801`0bf9b120 ECHO!EchoEvtDeviceSelfManagedIoSuspend (struct WDFDEVICE__ *)
    ...
    

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

  4. !lmi uzantısı bir modülle ilgili ayrıntılı bilgileri görüntüler. !lmi echogirin. Çıktınız bu örnekte gösterilen metne benzer olmalıdır:

    0: kd> !lmi echo
    Loaded Module Info: [echo] 
             Module: ECHO
       Base Address: fffff8010bf94000
         Image Name: ECHO.sys
    … 
    
  5. Bu örnekte gösterildiği gibi üst bilgi bilgilerini görüntülemek için !dh uzantısını kullanın:

    0: kd> !dh echo
    
    File Type: EXECUTABLE IMAGE
    FILE HEADER VALUES
         14C machine (i386)
           6 number of sections
    54AD8A42 time date stamp Wed Jan 07 11:34:26 2015
    ...
    
  6. 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 girin:

    0: kd> ed nt!Kd_DEFAULT_MASK 0xFFFFFFFF
    

    0xFFFFFFFF maskesi kullanıldığında bazı sürücüler ek bilgiler görüntüler. Görüntülenen bilgi miktarını azaltmak istiyorsanız maskeyi 0x00000000 olarak ayarlayın.

    0: kd> ed nt!Kd_DEFAULT_MASK 0x00000000
    

    Maskenin tüm hata ayıklayıcı iletilerini görüntüleyecek şekilde ayarlandığını onaylamak için dd komutunu kullanın.

    0: kd> dd nt!kd_DEFAULT_MASK 
    fffff802`bb4057c0  ffffffff 00000000 00000000 00000000
    fffff802`bb4057d0  00000000 00000000 00000000 00000000
    fffff802`bb4057e0  00000001 00000000 00000000 00000000
    fffff802`bb4057f0  00000000 00000000 00000000 00000000
    fffff802`bb405800  00000000 00000000 00000000 00000000
    fffff802`bb405810  00000000 00000000 00000000 00000000
    fffff802`bb405820  00000000 00000000 00000000 00000000
    fffff802`bb405830  00000000 00000000 00000000 00000000
    

Tak Çalıştır cihaz ağacı bilgilerini görüntüleme

Bu bölümde, yankı örnek aygıt sürücüsü ve Tak ve Çalıştır cihaz ağacında nerede bulunduğu hakkındaki bilgileri gösterin.

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.

  1. Konak sisteminde Tak ve Kullan cihaz ağacındaki tüm cihaz düğümlerini görmek için !devnode 0 1 komutunu girin.

    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ı aramak için oluşturulan çıktıda arama yapmak için Ctrl+F tuşlarını kullanın echo.

    WinDbg'de 'echo' terimini arayan Bul iletişim kutusunun ekran görüntüsü.

  3. Yankı cihazı sürücüsü yüklenmelidir. Bu örnekte gösterildiği gibi echo cihaz sürücünüzle ilişkili Tak Çalıştır bilgilerini görüntülemek için !devnode 0 1 echo komutunu kullanın:

    0: Kd> !devnode 0 1 echo
    Dumping IopRootDeviceNode (= 0xffffe0007b725d30)
    DevNode 0xffffe0007b71a630 for PDO 0xffffe0007b71a960
      InstancePath is "ROOT\SAMPLE\0000"
      ServiceName is "ECHO"
      State = DeviceNodeStarted (0x308)
      Previous State = DeviceNodeEnumerateCompletion (0x30d)
    …
    
  4. Önceki komutta görüntülenen çıktı, sürücünüzün çalışan örneğiyle ilişkilendirilmiş PDO'ları içerir, bu örnekte 0xffffe0007b71a960. Echo cihaz sürücüsüyle ilişkili Tak ve Çalıştır bilgilerini görüntülemek için !devobj <PDO address> komutunu girin. !devnode'ın bilgisayarınızda gösterdiği PDO adresini kullanın, burada gösterileni değil.

    0: kd> !devobj 0xffffe0007b71a960
    Device object (ffffe0007b71a960) is for:
     0000000e \Driver\PnpManager DriverObject ffffe0007b727e60
    Current Irp 00000000 RefCount 0 Type 00000004 Flags 00001040
    Dacl ffffc102c9b36031 DevExt 00000000 DevObjExt ffffe0007b71aab0 DevNode ffffe0007b71a630 
    ExtensionFlags (0x00000800)  DOE_DEFAULT_SD_PRESENT
    Characteristics (0x00000180)  FILE_AUTOGENERATED_DEVICE_NAME, FILE_DEVICE_SECURE_OPEN
    AttachedDevice (Upper) ffffe000801fee20 \Driver\ECHO
    Device queue is not busy.
    
  5. !devnode 0 1 komutunda görüntülenen çıktı, sürücünüzün çalışan örneğiyle ilişkilendirilmiş PDO adresini içerir; bu örnekte 0xffffe0007b71a960. Cihaz sürücüsüyle ilişkili Tak çalıştır bilgilerini görüntülemek için !devstack <PDO address> komutunu girin. !devnode bilgisayarınızda görüntülenen PDO adresini kullanın, bu örnekte gösterilen adresi kullanmayın.

    0: kd> !devstack 0xffffe0007b71a960
      !DevObj           !DrvObj            !DevExt           ObjectName
      ffffe000801fee20  \Driver\ECHO       ffffe0007f72eff0  
    > ffffe0007b71a960  \Driver\PnpManager 00000000  0000000e
    !DevNode ffffe0007b71a630 :
      DeviceInst is "ROOT\SAMPLE\0000"
      ServiceName is "ECHO"
    

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

\Driver\ECHO
\Driver\PnpManager

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ı gösteren diyagram.

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ı.

Kesme noktaları ve kaynak koduyla çalışmak

Bu bölümde, çekirdek modu kaynak kodunda kesme noktalarını belirleyin ve adım adım ilerleyin.

Kodda adım adım ilerleyebilmek ve değişkenlerin değerlerini gerçek zamanlı olarak denetleyebilmek için kesme noktalarını etkinleştirin ve kaynak kodun yolunu ayarlayın.

Kesme noktaları belirli bir kod satırında kod yürütmeyi durdurur. Kodun belirli bir bölümünde hata ayıklamak için bu noktadan kodda ileri doğru ilerleyin.

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

Komut Açıklama
bp içinde yer alan modül kaldırılana kadar etkin olan bir kesme noktası ayarlar.
bu Modül kaldırıldığında çözümlenemeyen ve modül yeniden yüklendiğinde yeniden etkinleşen bir kesme noktası ayarlar.
bm Simge için bir kesme noktası ayarlar. Bu komut bu veya bp uygun şekilde kullanır ve bir sınıftaki tüm yöntemler gibi eşleşen her simgede kesme noktaları ayarlamak için joker karakterlerin (*) kullanılmasına izin verir.

Daha fazla bilgi için bkz. WinDbgkaynak kodunda hata ayıklama.

  1. Konak sisteminde, geçerli WinDbg oturumunda Hata Ayıklama>Kaynak Modu etkinleştirildiğini onaylamak için WinDbg kullanıcı arabirimini kullanın.

  2. Yerel kod konumunuzu kaynak yola eklemek için aşağıdaki komutu girin:

    .srcpath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
    
  3. Simge yoluna yerel simge konumunuzu eklemek için aşağıdaki komutu girin:

    .sympath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
    
  4. Kesme noktası için kullanılacak işlev adını belirlemek üzere yankı sürücüsüyle ilişkili simgeleri incelemek için x komutunu kullanın. DeviceAdd işlev adını bulmak için joker karakter veya Ctrl+F kullanabilirsiniz.

    0: kd> x ECHO!EchoEvt*
    8b4c7490          ECHO!EchoEvtIoQueueContextDestroy (void *)
    8b4c7000          ECHO!EchoEvtDeviceSelfManagedIoStart (struct WDFDEVICE__ *)
    8b4c7820          ECHO!EchoEvtTimerFunc (struct WDFTIMER__ *)
    8b4cb0e0          ECHO!EchoEvtDeviceSelfManagedIoSuspend (struct WDFDEVICE__ *)
    8b4c75d0          ECHO!EchoEvtIoWrite (struct WDFQUEUE__ *, struct WDFREQUEST__ *, unsigned int)
    8b4cb170          ECHO!EchoEvtDeviceAdd (struct WDFDRIVER__ *, struct 
    …
    

    Çıkış, yankı sürücünüz için DeviceAdd yönteminin ECHO!EchoEvtDeviceAddolduğunu gösterir.

    Alternatif olarak, kesme noktanızın işlev adını bulmak için kaynak kodu gözden geçirin.

  5. Kesme noktasını bm komutuyla ayarlamak için sürücünün adını ve ardından işlev adını (örneğin, kesme noktasını ünlem işaretiyle ayırarak ayarlamak istediğiniz AddDevice) ayarlayın. Bu laboratuvar, yüklenen sürücüyü izlemek için AddDevice kullanır.

    0: kd> bm ECHO!EchoEvtDeviceAdd
      1: fffff801`0bf9b1c0 @!"ECHO!EchoEvtDeviceAdd"
    

    <module>!<symbol>, <class>::<method>,'<file.cpp>:<line number>'gibi değişkenleri ayarlamayla birlikte farklı söz dizimi kullanabilir veya <condition> <#>birkaç kez atlayabilirsiniz. Daha fazla bilgi için bkz. WinDbg'de koşullu kesme noktaları ve diğer Windows hata ayıklayıcıları.

  6. bl komutunu girerek kesme noktasının ayarlandığını onaylamak için geçerli kesme noktalarını listeleyin:

    0: kd> bl
    1 e fffff801`0bf9b1c0     0001 (0001) ECHO!EchoEvtDeviceAdd
    

    Burada gösterilen çıkıştaki "e", 1 numaralı kesme noktasının tetiklenmek üzere etkinleştirildiğini gösterir.

  7. g (go) komutunu girerek hedef sistemde kod yürütmeyi yeniden başlatın.

  8. Hedef sistemdeki Windows'ta, Cihaz Yöneticisi açmak için simgeyi kullanarak veya mmc devmgmt.mscyazarak işlemi gerçekleştirin. Cihaz Yöneticisi'nde Örnekler düğümünü genişletin.

  9. KMDF yankı sürücüsü girdisini seçip basılı tutun veya sağ tıklayın ve menüden devre dışı bırak'ı seçin.

  10. KMDF yankı 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.

  11. Konak sisteminde, sürücü etkinleştirildiğinde AddDevice hata ayıklama kesme noktası çalışmalıdır. Hedef sistemde sürücü kodunun yürütülmesi durdurulmalıdır. Kesme noktasına isabet edildiğinde yürütme, AddDevice yordamının başında durdurulmalıdır. Hata ayıklama komutu çıkışı Breakpoint 1 hit’i gösterir.

    WinDbg'in, örnek kodun yerel değişkenlerini ve komut pencerelerini gösteren ekran görüntüsü.

  12. p komutunu girerek veya AddDevice yordamının aşağıdaki sonuna ulaşana kadar F10 tuşuna basarak kod satırında adım adım ilerleyin. Ayraç karakteri (}) gösterildiği gibi vurgulanır.

    AddDevice yordamının başında ayraç karakterinin vurgulandığı kod penceresinin ekran görüntüsü.

Sonraki bölümde DeviceAdd kodu yürütüldükten sonra değişkenlerin durumunu inceleyin.

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

Komut Açıklama
bl Kesme noktalarını listeler.
bc 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.
be Kesme noktasını etkinleştirir. Tüm kesme noktalarını etkinleştirmek için be * kullanın.

Alternatif olarak, WinDbg kullanıcı arabirimindeki kesme noktalarını da değiştirebilirsiniz.

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

ba <access> <size> <address> {options}
Seçenek Açıklama
e CPU, adresten bir yönerge getirirken işleme koyar
r okuma/yazma: CPU adresi okuduğunda veya adrese yazdığında
w yazma: CPU adrese yazdığında

Herhangi bir zamanda yalnızca dört veri kesme noktası ayarlayabilirsiniz. Kesme noktasını tetikleme amacıyla verilerinizi doğru şekilde hizaladığınızdan emin olmak size bağlıdır. Sözcükler 2 ile bölünebilen adreslerle bitmelidir, dword'lar 4, dört sözcük 0 veya 8 ile bölünmelidir.

Örneğin, belirli bir bellek adresinde okuma/yazma kesme noktası ayarlamak için bu örneğe benzer bir komut kullanabilirsiniz.

ba r 4 0x0003f7bf0

Aşağıdaki komutları kullanarak, parantez içinde gösterilen ilişkili klavye kısa kesimleriyle kodunuzda adım adım ilerleyebilirsiniz.

  • Kes (Ctrl+Break). Bu komut, sistem çalıştığı ve WinDbg ile iletişimde olduğu sürece sistemi kesintiye uğratır. Çekirdek Hata Ayıklayıcısı'ndaki sıra Ctrl+C'dir.
  • İmlece kadar çalıştır (F7 veya Ctrl+F10). İmleci yürütmenin kesmesini istediğiniz bir kaynak veya ayrıştırma penceresine getirin ve F7 tuşuna basın. Kod yürütme bu noktaya kadar çalışır. Kod yürütme akışı imleç tarafından belirtilen noktaya ulaşmazsa WinDbg kırılmaz. If deyimi yürütülmezse bu durum oluşabilir.
  • (F5) komutunu çalıştırın. Bir kesme noktasıyla karşılaşılana veya hata denetimi gibi bir olay gerçekleşene kadar çalıştırın.
  • Üzerine adımla (F10). Bu komut, kod yürütmenin tek seferde bir deyim veya 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, kaynak modu Hata Ayıklama>Kaynak Modukullanılarak açılabilir veya kapatılabilir.
  • Adım atın (F11). Bu komut, adım atma gibidir; ancak bir çağrının yürütülmesi, çağrılan yordama girer.
  • Dışarı çıkın (Shift+F11). Bu komut, yürütmenin çağrı yığınındaki geçerli rutin veya geçerli yerde çalışmasına ve bu rutin veya yerden çıkmasına neden olur. Bu komut, rutinle yeterince haşır neşir olduysanız kullanışlıdır.

Daha fazla bilgi için bkz. WinDbgkaynak kodunda hata ayıklama.

Değişkenleri ve çağrı yığınlarını görüntüleme

Bu bölümde değişkenler ve çağrı yığınları hakkındaki bilgileri görüntüleyin.

Bu laboratuvarda, daha önce açıklanan işlemi kullanarak AddDevice rutininde durdurulduğunuz varsayılır. Burada gösterilen çıkışı görüntülemek için, gerekirse daha önce açıklanan adımları yineleyin.

Konak sisteminde değişkenleri görüntülemek için, yerel değişkenleri görüntülemek amacıyla görünüm>yerel menü öğesini kullanın.

Yerel değişkenler penceresini görüntüleyen WinDbg ekran görüntüsü.

Genel değişken adresinin konumunu bulmak için ? <variable name>girin.

  • 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.

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

Bölüm 8: Değişkenleri ve çağrı yığınlarını görüntüleme

Bölüm 8'de değişkenler ve çağrı yığınları hakkındaki bilgileri görüntüleyeceksiniz.

Bu laboratuvarda, daha önce açıklanan işlem kullanılarak AddDevice rutininde durdurulduğunuz varsayılır. Çıktıyı burada görüntülemek için, gerekirse daha önce açıklanan adımları yineleyin.

<- Konak sisteminde

Değişkenleri görüntüleme

Yerel değişkenleri görüntülemek için görünüm>yerel menü öğesini kullanın.

Yerel değişkenler penceresini görüntüleyen WinDbg ekran görüntüsü.

Genel değişkenler

yazarak, <değişken adını>, bir genel değişken adresinin konumunu bulabilirsiniz.

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. Belirli bir çerçevenin tüm yerel değişkenlerinin adlarını ve değerlerini görüntülemek için dv komutunu girin:

0: kd> dv
         Driver = 0x00001fff`7ff9c838
     DeviceInit = 0xffffd001`51978190
         status = 0n0

Ç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.

Komut Açıklama
kb Yığını ve ilk üç parametreyi görüntüler.
kp Yığınları ve parametrelerin tam listesini görüntüler.
kn Çerçeve bilgileriyle birlikte yığını görmenizi sağlar.
  1. Ana sistemde, çağrı yığınını kullanılabilir tutmak istiyorsanız, onu görüntülemek için görünüm>çağrı yığını'ü seçin. Ek bilgilerin görüntülenmesini değiştirmek için pencerenin üst kısmındaki sütunları seçin.

    Çağrı yığınları penceresini görüntüleyen WinDbg ekran görüntüsü.

  2. Örnek bağdaştırıcı kodunda hata ayıklarken, duraklama durumundayken çağrı yığınını göstermek için kn komutunu kullanın.

    3: kd> kn
    # Child-SP          RetAddr           Call Site
    00 ffffd001`51978110 fffff801`0942f55b ECHO!EchoEvtDeviceAdd+0x66 [c:\Samples\kmdf echo sample\c++\driver\autosync\driver.c @ 138]
    01 (Inline Function) --------`-------- Wdf01000!FxDriverDeviceAdd::Invoke+0x30 [d:\wbrtm\minkernel\wdf\framework\shared\inc\private\common\fxdrivercallbacks.hpp @ 61]
    02 ffffd001`51978150 fffff801`eed8097d Wdf01000!FxDriver::AddDevice+0xab [d:\wbrtm\minkernel\wdf\framework\shared\core\km\fxdriverkm.cpp @ 72]
    03 ffffd001`51978570 fffff801`ef129423 nt!PpvUtilCallAddDevice+0x35 [d:\9142\minkernel\ntos\io\pnpmgr\verifier.c @ 104]
    04 ffffd001`519785b0 fffff801`ef0c4112 nt!PnpCallAddDevice+0x63 [d:\9142\minkernel\ntos\io\pnpmgr\enum.c @ 7397]
    05 ffffd001`51978630 fffff801`ef0c344f nt!PipCallDriverAddDevice+0x6e2 [d:\9142\minkernel\ntos\io\pnpmgr\enum.c @ 3390]
    ...
    

Çekirdek (nt), Tak ve Kullan kodunu (PnP) çağırdı, PnP ise sürücü çerçeve kodunu (WDF) çağırdı, ve ardından WDF, echo sürücüsü DeviceAdd fonksiyonunu çağırdı.

İşlemleri ve iş parçacıklarını görüntüleme

Bu bölümde, çekirdek modunda çalışan işlemler ve iş parçacıkları hakkındaki bilgileri görüntüleyin.

Süreç

!process hata ayıklayıcısı uzantısını kullanarak işlem bilgilerini görüntüleyebilir veya ayarlayabilirsiniz. Bir ses çalındığında kullanılan işlemi incelemek için bir kesme noktası ayarlayın.

  1. Konak sisteminde, dv yordamıyla ilişkili yerel ayar değişkenlerini incelemek için EchoEvtIo komutunu girin:

    0: kd> dv ECHO!EchoEvtIo*
    ECHO!EchoEvtIoQueueContextDestroy
    ECHO!EchoEvtIoWrite
    ECHO!EchoEvtIoRead         
    
  2. bc *kullanarak önceki kesme noktalarını temizleyin:

    0: kd> bc *  
    
  3. Aşağıdaki komutu kullanarak EchoEvtIo yordamlarında bir sembol kesme noktası ayarlayın:

    0: kd> bm ECHO!EchoEvtIo*
      2: aade5490          @!”ECHO!EchoEvtIoQueueContextDestroy”
      3: aade55d0          @!”ECHO!EchoEvtIoWrite”
      4: aade54c0          @!”ECHO!EchoEvtIoRead”
    
  4. Kesme noktasının düzgün ayarlandığını onaylamak için kesme noktalarını listeleyin:

    0: kd> bl
    1 e aabf0490 [c:\Samples\kmdf echo sample\c++\driver\autosync\queue.c @ 197]    0001 (0001) ECHO!EchoEvtIoQueueContextDestroy
    ...
    
  5. Kod yürütmeyi yeniden başlatmak için g girin:

    0: kd> g
    
  6. Hedef sistemde, hedef sistemde EchoApp.exe sürücü test programını çalıştırın.

  7. Host sistemde, test uygulaması çalıştırıldığında, sürücüdeki G/Ç rutini çağrılır. Bu çağrı kesme noktasını tetikler ve hedef sistemdeki sürücü kodunun yürütülmesi durdurulur.

    Breakpoint 2 hit
    ECHO!EchoEvtIoWrite:
    fffff801`0bf95810 4c89442418      mov     qword ptr [rsp+18h],r8
    
  8. !processçalıştırmakla ilgili geçerli işlemi görüntülemek için komutunu kullanın:

    0: kd> !process
    PROCESS ffffe0007e6a7780
        SessionId: 1  Cid: 03c4    Peb: 7ff7cfec4000  ParentCid: 0f34
        DirBase: 1efd1b000  ObjectTable: ffffc001d77978c0  HandleCount:  34.
        Image: echoapp.exe
        VadRoot ffffe000802c79f0 Vads 30 Clone 0 Private 135. Modified 5. Locked 0.
        DeviceMap ffffc001d83c6e80
        Token                             ffffc001cf270050
        ElapsedTime                       00:00:00.052
        UserTime                          00:00:00.000
        KernelTime                        00:00:00.000
        QuotaPoolUsage[PagedPool]         33824
        QuotaPoolUsage[NonPagedPool]      4464
        Working Set Sizes (now,min,max)  (682, 50, 345) (2728KB, 200KB, 1380KB)
        PeakWorkingSetSize                652
        VirtualSize                       16 Mb
        PeakVirtualSize                   16 Mb
        PageFaultCount                    688
        MemoryPriority                    BACKGROUND
        BasePriority                      8
        CommitCharge                      138
    
            THREAD ffffe00080e32080  Cid 03c4.0ec0  Teb: 00007ff7cfece000 Win32Thread: 0000000000000000 RUNNING on processor 1
    

    Çıkış, işlemin sürücü yazma olayındaki kesme noktanıza isabet edildiğinde çalışan echoapp.exe iş parçacığıyla ilişkili olduğunu gösterir. Daha fazla bilgi için bkz. !process.

  9. Tüm işlemlerin özet bilgilerini görüntülemek için !process 0 0 kullanın. Çıktıda, echoapp.exe görüntüsüyle ilişkili işlemin aynı işlem adresini bulmak için Ctrl+F tuşlarını kullanın. Örnekte işlem adresi ffffe0007e6a7780.

    ...
    
    PROCESS ffffe0007e6a7780
        SessionId: 1  Cid: 0f68    Peb: 7ff7cfe7a000  ParentCid: 0f34
        DirBase: 1f7fb9000  ObjectTable: ffffc001cec82780  HandleCount:  34.
        Image: echoapp.exe
    
    ...
    
  10. Bu laboratuvarın ilerleyen bölümlerinde kullanmak üzere echoapp.exe ile ilişkili işlem kimliğini kaydedin. Adresi daha sonra kullanmak üzere kopyalama arabelleğine kopyalamak için Ctrl+C tuşlarını da kullanabilirsiniz.

    _____________________________________________________(echoapp.exe işlem adresi)

  11. Kodu ileri yürütebilmek için gerektiği gibi g'ı hata ayıklayıcıya girin ve echoapp.exe çalışana kadar ilerletin. Okuma ve yazma olayında kesme noktasına defalarca ulaşır. echoapp.exe tamamlandığında, Ctrl+ScrLk (Ctrl+Break) tuşlarına basarak hata ayıklayıcıya girin.

  12. Farklı bir işlem çalıştırdığınızı onaylamak için !process komutunu kullanın. Burada gösterilen çıktıda, System Görüntü değerine sahip işlem, Echo Görüntü değerinden farklıdır.

    1: kd> !process
    PROCESS ffffe0007b65d900
        SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
        DirBase: 001ab000  ObjectTable: ffffc001c9a03000  HandleCount: 786.
        Image: System
        VadRoot ffffe0007ce45930 Vads 14 Clone 0 Private 22. Modified 131605. Locked 64.
        DeviceMap ffffc001c9a0c220
        Token                             ffffc001c9a05530
        ElapsedTime                       21:31:02.516
    ...
    

    Çıkış, işletim sistemini durdurduğunuzda ffffe0007b65d900 sistem işleminin çalıştığını gösterir.

  13. Daha önce kaydettiğiniz !process ile ilişkili olan işlem kimliğine bakmayı denemek için komutunu kullanın. Bu örnekte gösterilen örnek işlem adresi yerine daha önce kaydettiğiniz echoapp.exe işlem adresinizi belirtin.

    0: kd> !process ffffe0007e6a7780
    TYPE mismatch for process object at 82a9acc0
    

    echoapp.exe işlemi artık çalışmadığından işlem nesnesi artık kullanılamaz.

Konular

İş parçacıklarını görüntüleme ve ayarlama komutları, işlemler için kullanılan komutlara 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 kullanın.

  1. Hedef sistemde kod yürütmeyi yeniden başlatmak için konak sisteminde hata ayıklayıcıya g girin.

  2. Hedef sistemde EchoApp.exe sürücü testi programını çalıştırın.

  3. Ana sistemde kesme noktasına gelinir ve kod yürütme durdurulur.

    Breakpoint 4 hit
    ECHO!EchoEvtIoRead:
    aade54c0 55              push    ebp
    
  4. Çalışan iş parçacıklarını görüntülemek için "!thread" komutunu girin. Aşağıdaki örneğe benzer bilgiler görüntülenmelidir:

    0: kd>  !thread
    THREAD ffffe000809a0880  Cid 0b28.1158  Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0
    IRP List:
        ffffe0007bc5be10: (0006,01f0) Flags: 00060a30  Mdl: 00000000
    Not impersonating
    DeviceMap                 ffffc001d83c6e80
    Owning Process            ffffe0008096c900       Image:         echoapp.exe
    ...
    

    echoapp.exeresim adını not edin. Test uygulamasıyla ilişkili konuya baktığınızı gösteriyor.

  5. bu iş parçacığının !processile ilişkili işlemde çalışan tek iş parçacığı olup olmadığını belirlemek için komutunu kullanın. İşlemde çalışan iş parçacığının numarası, !thread komutu tarafından gösterilen iş parçacığıyla aynıdır.

    0: kd> !process
    PROCESS ffffe0008096c900
        SessionId: 1  Cid: 0b28    Peb: 7ff7d00df000  ParentCid: 0f34
        DirBase: 1fb746000  ObjectTable: ffffc001db6b52c0  HandleCount:  34.
        Image: echoapp.exe
        VadRoot ffffe000800cf920 Vads 30 Clone 0 Private 135. Modified 8. Locked 0.
        DeviceMap ffffc001d83c6e80
        Token                             ffffc001cf5dc050
        ElapsedTime                       00:00:00.048
        UserTime                          00:00:00.000
        KernelTime                        00:00:00.000
        QuotaPoolUsage[PagedPool]         33824
        QuotaPoolUsage[NonPagedPool]      4464
        Working Set Sizes (now,min,max)  (681, 50, 345) (2724KB, 200KB, 1380KB)
        PeakWorkingSetSize                651
        VirtualSize                       16 Mb
        PeakVirtualSize                   16 Mb
        PageFaultCount                    686
        MemoryPriority                    BACKGROUND
        BasePriority                      8
        CommitCharge                      138
    
            THREAD ffffe000809a0880  Cid 0b28.1158  Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0
    
  6. İlgili iki işlemin işlem adresini bulmak ve bu işlem adresini buraya kaydetmek için !process 0 0 komutunu kullanın.

    Cmd.exe: ____________________________________________________________

    EchoApp.exe: _______________________________________________________

    0: kd> !process 0 0 
    
    …
    
    PROCESS ffffe0007bbde900
        SessionId: 1  Cid: 0f34    Peb: 7ff72dfa7000  ParentCid: 0c64
        DirBase: 19c5fa000  ObjectTable: ffffc001d8c2f300  HandleCount:  31.
        Image: cmd.exe
    …
    PROCESS ffffe0008096c900
        SessionId: 1  Cid: 0b28    Peb: 7ff7d00df000  ParentCid: 0f34
        DirBase: 1fb746000  ObjectTable: ffffc001db6b52c0  HandleCount:  34.
        Image: echoapp.exe
    …
    

    Alternatif olarak !process 0 17 kullanarak her işlem hakkında ayrıntılı bilgi görüntüleyebilirsiniz. Bu komuttan elde edilen çıktı uzun olabilir. Çıktı Ctrl+F kullanılarak aranabilir.

  7. bilgisayarınızı çalıştıran her iki işlemin işlem bilgilerini listelemek için !process komutunu kullanın. Bu örnekte gösterilen adres yerine, !process 0 0 çıkışınızdan işlem adresini sağlayın.

    Bu örnek çıktı, daha önce kaydedilmiş cmd.exe işlem kimliğine yöneliktir. Bu işlem kimliğinin imaj adı cmd.exe.

    0: kd>  !process ffffe0007bbde900
    PROCESS ffffe0007bbde900
        SessionId: 1  Cid: 0f34    Peb: 7ff72dfa7000  ParentCid: 0c64
        DirBase: 19c5fa000  ObjectTable: ffffc001d8c2f300  HandleCount:  31.
        Image: cmd.exe
        VadRoot ffffe0007bb8e7b0 Vads 25 Clone 0 Private 117. Modified 20. Locked 0.
        DeviceMap ffffc001d83c6e80
        Token                             ffffc001d8c48050
        ElapsedTime                       21:33:05.840
        UserTime                          00:00:00.000
        KernelTime                        00:00:00.000
        QuotaPoolUsage[PagedPool]         24656
        QuotaPoolUsage[NonPagedPool]      3184
        Working Set Sizes (now,min,max)  (261, 50, 345) (1044KB, 200KB, 1380KB)
        PeakWorkingSetSize                616
        VirtualSize                       2097164 Mb
        PeakVirtualSize                   2097165 Mb
        PageFaultCount                    823
        MemoryPriority                    FOREGROUND
        BasePriority                      8
        CommitCharge                      381
    
            THREAD ffffe0007cf34880  Cid 0f34.0f1c  Teb: 00007ff72dfae000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
                ffffe0008096c900  ProcessObject
            Not impersonating
    ...
    

    Bu örnek çıktı, daha önce kaydedilmiş echoapp.exe işlem kimliğine yöneliktir.

    0: kd>  !process ffffe0008096c900
    PROCESS ffffe0008096c900
        SessionId: 1  Cid: 0b28    Peb: 7ff7d00df000  ParentCid: 0f34
        DirBase: 1fb746000  ObjectTable: ffffc001db6b52c0  HandleCount:  34.
        Image: echoapp.exe
        VadRoot ffffe000800cf920 Vads 30 Clone 0 Private 135. Modified 8. Locked 0.
        DeviceMap ffffc001d83c6e80
        Token                             ffffc001cf5dc050
        ElapsedTime                       00:00:00.048
        UserTime                          00:00:00.000
        KernelTime                        00:00:00.000
        QuotaPoolUsage[PagedPool]         33824
        QuotaPoolUsage[NonPagedPool]      4464
        Working Set Sizes (now,min,max)  (681, 50, 345) (2724KB, 200KB, 1380KB)
        PeakWorkingSetSize                651
        VirtualSize                       16 Mb
        PeakVirtualSize                   16 Mb
        PageFaultCount                    686
        MemoryPriority                    BACKGROUND
        BasePriority                      8
        CommitCharge                      138
    
            THREAD ffffe000809a0880  Cid 0b28.1158  Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0
            IRP List:
                ffffe0007bc5be10: (0006,01f0) Flags: 00060a30  Mdl: 00000000
            Not impersonating
    ...
    
  8. İki işlemle ilişkili ilk iş parçacığı adresini buraya kaydedin.

    Cmd.exe: ____________________________________________________

    EchoApp.exe: _________________________________________________

  9. Geçerli iş parçacığı hakkındaki bilgileri görüntülemek için !Thread komutunu kullanın.

    0: kd>  !Thread
    THREAD ffffe000809a0880  Cid 0b28.1158  Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0
    IRP List:
        ffffe0007bc5be10: (0006,01f0) Flags: 00060a30  Mdl: 00000000
    Not impersonating
    DeviceMap                 ffffc001d83c6e80
    Owning Process            ffffe0008096c900       Image:         echoapp.exe
    Attached Process          N/A            Image:         N/A
    ...
    

    Beklendiği gibi, geçerli iş parçacığı echoapp.exe ile ilişkili iş parçacığıdır ve çalışmaktadır.

  10. !Thread işlemiyle ilişkili iş parçacığı hakkındaki bilgileri görüntülemek için komutunu kullanın. Daha önce kaydettiğiniz konu adresini belirtin.

    0: kd> !Thread ffffe0007cf34880
    THREAD ffffe0007cf34880  Cid 0f34.0f1c  Teb: 00007ff72dfae000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
        ffffe0008096c900  ProcessObject
    Not impersonating
    DeviceMap                 ffffc001d83c6e80
    Owning Process            ffffe0007bbde900       Image:         cmd.exe
    Attached Process          N/A            Image:         N/A
    Wait Start TickCount      4134621        Ticks: 0
    Context Switch Count      4056           IdealProcessor: 0             
    UserTime                  00:00:00.000
    KernelTime                00:00:01.421
    Win32 Start Address 0x00007ff72e9d6e20
    Stack Init ffffd0015551dc90 Current ffffd0015551d760
    Base ffffd0015551e000 Limit ffffd00155518000 Call 0
    Priority 14 BasePriority 8 UnusualBoost 3 ForegroundBoost 2 IoPriority 2 PagePriority 5
    Child-SP          RetAddr           : Args to Child                                                           : Call Site
    ffffd001`5551d7a0 fffff801`eed184fe : fffff801`eef81180 ffffe000`7cf34880 00000000`fffffffe 00000000`fffffffe : nt!KiSwapContext+0x76 [d:\9142\minkernel\ntos\ke\amd64\ctxswap.asm @ 109]
    ffffd001`5551d8e0 fffff801`eed17f79 : ffff03a5`ca56a3c8 000000de`b6a6e990 000000de`b6a6e990 00007ff7`d00df000 : nt!KiSwapThread+0x14e [d:\9142\minkernel\ntos\ke\thredsup.c @ 6347]
    ffffd001`5551d980 fffff801`eecea340 : ffffd001`5551da18 00000000`00000000 00000000`00000000 00000000`00000388 : nt!KiCommitThreadWait+0x129 [d:\9142\minkernel\ntos\ke\waitsup.c @ 619]
    ...
    

    Bu iş parçacığı cmd.exe ile ilişkilendirilmiştir ve bekleme durumundadır.

  11. Bağlamı bu bekleyen iş parçacığıyla değiştirmek için bekleyen CMD.exe iş parçacığının adresini sağlayın.

    0: kd> .Thread ffffe0007cf34880
    Implicit thread is now ffffe000`7cf34880
    
  12. Beklemede olan iş parçacığıyla ilişkili çağrı yığınını görüntülemek için k komutunu kullanın.

    0: kd> k
      *** Stack trace for last set context - .thread/.cxr resets it
    # Child-SP          RetAddr           Call Site
    00 ffffd001`5551d7a0 fffff801`eed184fe nt!KiSwapContext+0x76 [d:\9142\minkernel\ntos\ke\amd64\ctxswap.asm @ 109]
    01 ffffd001`5551d8e0 fffff801`eed17f79 nt!KiSwapThread+0x14e [d:\9142\minkernel\ntos\ke\thredsup.c @ 6347]
    02 ffffd001`5551d980 fffff801`eecea340 nt!KiCommitThreadWait+0x129 [d:\9142\minkernel\ntos\ke\waitsup.c @ 619]
    03 ffffd001`5551da00 fffff801`ef02e642 nt!KeWaitForSingleObject+0x2c0 [d:\9142\minkernel\ntos\ke\wait.c @ 683]
    ...
    

    KiCommitThreadWait gibi çağrı yığını öğeleri bu iş parçacığının beklendiği gibi çalışmadığını gösterir.

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

IRQL, WinDbg oturumunu kaydeder ve sonlandırma

Bu bölümde kesme isteği düzeyini (IRQL) ve yazmaçların içeriğini görüntüleyin.

Kaydedilen IRQL'i görüntüleme

IRQL, kesme hizmetlerinin ö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 oluşan kesintiler maskelenir ve mevcut işlemi kesintiye uğratmaz. İşlemcinin IRQL ayarının üzerinde gerçekleşen kesmeler mevcut işlemden önceliklidir.

Konak sisteminde, !irql uzantısı, hata ayıklayıcının kesmesi gerçekleşmeden önce hedef bilgisayarın geçerli işlemcisindeki IRQL'i görüntüler. 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 !irqltarafından görüntülenir.

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

Yazmaçları görüntüle

Host sisteminde, r (Yazmaçlar) komutunu kullanarak geçerli işlemcideki mevcut iş parçacığının yazmaçlarını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. Daha fazla bilgi için bkz. r (Yazmaçlar).

Makine dili kod yürütmesi ve diğer senaryolarda yazmaçların içeriğini görüntülemek yararlı olabilir. 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.

Kayıt içeriği hakkında bilgi için bakınız x86 mimarisi ve x64 mimarisi.

WinDbg oturumunu sonlandırma

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 bkz. WinDbg'de hata ayıklama oturumlarını sonlandırma.

Windows hata ayıklama kaynakları

Windows hata ayıklama hakkında daha fazla bilgi sağlanır. Bu kitaplardan bazıları örneklerinde Windows Vista gibi Windows'un önceki sürümlerini kullanır, ancak ele alınan kavramlar Windows'un çoğu sürümü için geçerlidir.

Ayrıca bkz.