Megosztás:


Illesztőprogramok hibakeresése – Lépésenkénti tesztkörnyezet (Sysvad Kernel Mód)

Ez a labor gyakorlati gyakorlatokat biztosít, amelyek bemutatják, hogyan lehet hibakeresést végezni a Sysvad audio kernel módú eszközillesztőjén.

A Microsoft Windows Hibakereső (WinDbg) egy hatékony Windows-alapú hibakeresési eszköz, amellyel felhasználói és kernel módú hibakeresést végezhet. A WinDbg forrásszintű hibakeresést biztosít a Windows-kernelhez, a kernelmódú illesztőprogramokhoz és a rendszerszolgáltatásokhoz, valamint a felhasználói módú alkalmazásokhoz és illesztőprogramokhoz.

A WinDbg végiglépkedhet a forráskódon, beállíthat töréspontokat, megtekintheti a változókat (beleértve a C++ objektumokat), a veremkövetéseket és a memóriát. A Hibakereső parancs ablaka lehetővé teszi, hogy a felhasználó számos parancsot adjon ki.

Tesztkörnyezet beállítása

A labor elvégzéséhez a következő hardverre lesz szüksége:

  • Windows 10 rendszerű laptop vagy asztali számítógép (gazdagép)
  • Windows 10 rendszerű laptop vagy asztali számítógép (cél)
  • Hálózati központ/útválasztó és hálózati kábelek a két számítógép csatlakoztatásához
  • Hozzáférés az internethez szimbólumfájlok letöltéséhez

A laborgyakorlat befejezéséhez a következő szoftverre lesz szüksége.

  • Microsoft Visual Studio 2017
  • Windows 10-hez készült Windows Software Development Kit (SDK)
  • Windows Driver Kit (WDK) a Windows 10-hez
  • A Minta Sysvad hangillesztő a Windows 10-hez

A WDK letöltéséről és telepítéséről további információt a A Windows Illesztőprogram-készlet (WDK)letöltése című témakörben talál.

A Sysvad hibakeresési útmutatója

Ez a labor végigvezeti a kernel módú illesztőprogramok hibakeresésének folyamatán. A gyakorlatok a Syvad virtuális hangillesztő mintáját használják. Mivel a Syvad hangillesztő nem kommunikál a tényleges hanghardverekkel, a legtöbb eszközön használható. A labor a következő feladatokat foglalja magában:

Echo-illesztőprogram tesztkörnyezete

Az Echo illesztőprogram egyszerűbb illesztőprogram, mint a Sysvad hangillesztő. Ha még csak most ismerkedik a WinDbg szolgáltatással, érdemes lehet először elvégeznie az Univerzális illesztőprogramok hibakeresése – Részletes tesztkörnyezet (Echo kernel mód) elvégzését. Ez a tesztkörnyezet újra felhasználja a tesztkörnyezet beállítási irányait, így ha befejezte a tesztkörnyezetet, itt kihagyhatja az 1. és a 2. szakaszt.

1. szakasz: Csatlakozás kernel módú WinDbg-munkamenethez

Az 1. szakaszban konfigurálja a hálózati hibakeresést a gazdagépen és a célrendszeren.

A laborban lévő számítógépeket úgy kell konfigurálni, hogy Ethernet-hálózati kapcsolatot használjanak a kernel hibakereséséhez.

Ez a labor két számítógépet használ. A WinDbg a gazdarendszeren fut, a Sysvad-illesztőprogram pedig a célrendszeren fut.

A két számítógép csatlakoztatásához használjon hálózati központot/útválasztót és hálózati kábeleket.

Két, hálózati hubon/útválasztón keresztül csatlakoztatott pc-t ábrázoló ábra.

A kernel módú alkalmazások használatához és a WinDbg használatához javasoljuk, hogy a KDNET-et Ethernet-átvitelen keresztül használja. Az Ethernet átviteli protokoll használatáról további információt a WinDbg (Kernel-Mode) használatának első lépéseit ismertető cikkben talál. A célszámítógép beállításával kapcsolatos további információkért lásd: Számítógép előkészítése manuális illesztőprogram-telepítéshez és A KDNET hálózati kernel hibakeresésének automatikus beállítása.

Kernel módú hibakeresés konfigurálása ethernet használatával

Ha engedélyezni szeretné a kernel módú hibakeresést a célrendszeren, hajtsa végre az alábbi lépéseket.

<– A gazdarendszeren

  1. Nyisson meg egy parancssort a gazdarendszeren, és írja be az ipconfig /all parancsot az IP-cím meghatározásához.
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. Rögzítse a gazdarendszer IP-címét: ______________________________________

  2. Rögzítse a gazdarendszer állomásnevét: ______________________________________

-> A célrendszeren

  1. Nyisson meg egy parancssort a célrendszeren, és a ping paranccsal erősítse meg a két rendszer közötti hálózati kapcsolatot. A mintakimenetben látható 169.182.1.1 helyett használja a gazdarendszer tényleges IP-címét.
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

Ha a KDNET segédprogrammal engedélyezni szeretné a kernel módú hibakeresést a célrendszeren, hajtsa végre az alábbi lépéseket.

  1. A gazdarendszerben keresse meg a WDK KDNET könyvtárat. Alapértelmezés szerint itt található.

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

Ez a labor feltételezi, hogy mind a célgépen, mind a gazdagépen egyaránt 64 bites Windows verzió fut. Ha ez nem így van, a legjobb módszer az, ha a gazdagépen ugyanazt a "bitmélységű" eszközkészletet futtatjuk, mint amit a célpont is használ. Ha például a cél 32 bites Windowst futtat, futtassa a hibakereső 32 bites verzióját a gazdagépen. További információ : A 32 bites vagy a 64 bites hibakeresési eszközök kiválasztása.

  1. Keresse meg ezt a két fájlt, és másolja őket egy hálózati megosztásra vagy egy ujjlenyomat-meghajtóra, hogy elérhetők legyenek a célszámítógépen.

    kdnet.exe

    VerifiedNICList.xml

  2. A célszámítógépen nyisson meg egy parancssori ablakot rendszergazdaként. Adja meg ezt a parancsot annak ellenőrzéséhez, hogy a célszámítógép hálózati adaptere támogatott-e.

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. Írja be ezt a parancsot a gazdarendszer IP-címének beállításához. A mintakimenetben látható 169.182.1.1 helyett használja a gazdarendszer tényleges IP-címét. Válasszon egyedi portcímet minden olyan cél-/gazdagéppárhoz, amellyel dolgozik, például az 50010-et.
C:\>kdnet 169.182.1.1 50010

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

Fontos

Mielőtt a BCDEdit használatával megváltoztatja a rendszerindítási információkat, előfordulhat, hogy ideiglenesen fel kell függesztenie a Windows biztonsági funkcióit, például a BitLockert és a biztonságos rendszerindítást a tesztszámítógépen. Ha a tesztelés befejeződött, és megfelelően kezeli a tesztszámítógépet, a biztonsági funkciók letiltásakor engedélyezze újra ezeket a biztonsági funkciókat. A biztonságos rendszerindítás általában le van tiltva az UEFI-ben. Az UEFI-beállítás eléréséhez használja a System, Recovery, Advanced start-up parancsot. Újraindításkor válassza a Hibaelhárítás, a Speciális beállítások és az UEFI belső vezérlőprogram beállításai lehetőséget. Óvatosan, mert az UEFI-beállítások helytelen beállítása vagy a BitLocker letiltása működésképtelené teheti a rendszert.

  1. Írja be ezt a parancsot annak ellenőrzéséhez, hogy a adatbázis-beállítások megfelelően vannak-e beállítva.
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.

Másolja az automatikusan létrehozott egyedi kulcsot egy szövegfájlba, hogy ne kelljen begépelnie a gazdaszámítógépre. Másolja a szövegfájlt a kulccsal együtt a gazdarendszerbe.

Megjegyzés:Tűzfalak és hibakeresők

Ha egy előugró üzenetet kap a tűzfalról, és használni szeretné a hibakeresőt, jelölje be mindhárom jelölőnégyzetet.

Képernyőkép a Windows biztonsági riasztásról, amely azt jelzi, hogy a Windows tűzfal letiltotta az alkalmazások bizonyos funkcióit.

<– A gazdarendszeren

  1. A gazdaszámítógépen nyisson meg egy parancssori ablakot rendszergazdaként. Váltson a WinDbg.exe könyvtárra. A Windows-készlet telepítésének részeként telepített Windows Driver Kitből (WDK) származó WinDbg.exe x64version-ját fogjuk használni.
C:\> Cd C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 
  1. Indítsa el a WinDbg-t távoli felhasználó hibakeresésével az alábbi paranccsal. A kulcs és a port értéke megegyezik a cél BCDEdit használatával korábban beállított értékével.
C:\> WinDbg –k net:port=50010,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p

->A célrendszeren

Indítsa újra a célrendszert.

<-A hosztrendszeren

Egy-két perc múlva a hibakeresési kimenetnek meg kell jelennie a gazdarendszerben.

Képernyőkép a Windows Hibakeresőről, amely egy élő kernelkapcsolat parancsablakának kimenetét jeleníti meg.

A Hibakereső parancs ablaka a WinDbg elsődleges hibakeresési információs ablaka. Megadhatja a hibakereső parancsokat, és megtekintheti a parancs kimenetét ebben az ablakban.

A Hibakereső parancs ablaka két panelre van felosztva. A parancsokat az ablak alján található kisebb ablaktáblába (a parancsbejegyzési panelre) írja be, és az ablak tetején lévő nagyobb panelen tekintheti meg a parancs kimenetét.

A parancsbejegyzési panelen a felfelé és lefelé mutató nyílbillentyűkkel görgessen végig a parancselőzményeken. Amikor megjelenik egy parancs, szerkesztheti, vagy az ENTER billentyűt lenyomva futtathatja a parancsot.

2. szakasz: kernel módú hibakeresési parancsok és technikák

A 2. szakaszban hibakeresési parancsokkal jelenítheti meg a célrendszer adatait.

<– A gazdarendszeren

Hibakereső korrektúranyelv (DML) engedélyezése .prefer_dml

Egyes hibakeresési parancsok szövegeket jelenítenek meg a Hibakereső korrektúranyelv használatával, amelyet kiválasztva gyorsan gyűjthet további információkat.

  1. A WinDBg-ben a Ctrl+Break (Scroll Lock) billentyűkombinációval törhet be a célrendszeren futó kódba. A célrendszer válasza eltarthat egy kis ideig.
  2. Írja be a következő parancsot a DML engedélyezéséhez a Hibakereső parancs ablakában.
0: kd> .prefer_dml 1
DML versions of commands on by default

Segítségkérés a .hh használatával

A referenciaparancs súgóját a .hh paranccsal érheti el.

  1. Írja be a következő parancsot a .prefer_dml parancshivatkozási súgójának megtekintéséhez.
    0: kd> .hh .prefer_dml
    

A hibakereső súgófájlja megjeleníti a .prefer_dml parancs súgóját.

Képernyőkép a Hibakereső súgóalkalmazásról, amely a .prefer-dml parancs súgóját jeleníti meg.

A Windows verziójának megjelenítése a célrendszeren

  1. A célrendszer részletes verzióadatainak megjelenítéséhez írja be a vertarget (Célszámítógép verziójának megjelenítése) parancsot a WinDbg ablakba.
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

A betöltött modulok listázása

  1. A betöltött modulok megjelenítésével ellenőrizheti, hogy a megfelelő kernel módú folyamattal dolgozik-e. Ehhez írja be az lm (List Loaded Modules) parancsot a WinDbg ablakba.
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
...

Jegyzet A kihagyott kimenet a következővel van megjelölve: "... " ebben a laborban.

Mivel még nem állítottuk be a szimbólum elérési útját és a betöltött szimbólumokat, korlátozott információ érhető el a hibakeresőben.

3. szakasz: A Sysvad hangillesztő letöltése és létrehozása

A 3. szakaszban letölti és összeállítja a Sysvad hangillesztőt.

Amikor WinDbg-et használ, általában a saját illesztőprogram-kódját dolgozza fel. A hangillesztők hibakeresésének megismeréséhez a rendszer a Sysvad virtuális hangminta-illesztőprogramot használja. Ez a minta azt szemlélteti, hogyan lehet egy lépést végigvezetni a natív kernel módú kódon. Ez a technika nagyon hasznos lehet összetett kernel módú kódhibák hibakereséséhez.

A Sysvad-minta hangillesztő letöltéséhez és létrehozásához hajtsa végre az alábbi lépéseket.

  1. A Sysvad hangmintájának letöltése és kinyerése a GitHubról

    Böngészőben megtekintheti a Sysvad-mintát és Readme.md fájlt itt:

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

    Képernyőkép a GitHub-adattárról, amely az általános mappát és a ZIP letöltése gombot jeleníti meg.

    Ez a labor bemutatja, hogyan töltheti le az univerzális illesztőprogram-mintákat egy zip-fájlban.

    a). Töltse le a master.zip fájlt a helyi merevlemezre.

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

    b. Kattintson és tartsa nyomva a Windows-driver-samples-master.zip elemet (vagy kattintson rá a jobb gombbal), majd válassza az Az összes kibontása lehetőséget. Adjon meg egy új mappát, vagy keresse meg a kibontott fájlokat tároló meglévőt. Megadhatja például a C:\WDK_Samples\ értéket az új mappaként, amelybe a fájlokat kinyeri.

    c) A fájlok kinyerése után lépjen a következő almappába.

    C:\WDK_Samples\Sysvad

  2. Az illesztőprogram-megoldás megnyitása a Visual Studióban

    A Visual Studióban válassza a Fájl>megnyitása>projekt/megoldás lehetőséget, és keresse meg a kibontott fájlokat tartalmazó mappát (például C:\WDK_Samples\Sysvad). Kattintson duplán a Syvad-megoldásfájlra .

    A Visual Studióban keresse meg a Megoldáskezelőt. (Ha még nincs megnyitva, válassza a Megoldáskezelőt a Nézet menüből.) A Megoldáskezelőben egy olyan megoldást láthat, amely több projektből áll.

    Képernyőkép a Visual Studióról a Sysvad-projektből betöltött adapter.cpp fájllal.

  3. A minta konfigurációjának és platformjának beállítása

    A Megoldáskezelőben válassza ki és tartsa lenyomva (vagy kattintson a jobb gombbal) a "sysvad" megoldásra (7/7 projektből), és válassza a Configuration Manager lehetőséget. Győződjön meg arról, hogy a konfiguráció és a platform beállításai megegyeznek a négy projekt esetében. Alapértelmezés szerint a konfiguráció "Win10 Hibakeresés" értékre van állítva, a platform pedig "Win64" értékre van állítva az összes projekt esetében. Ha egy projekt konfigurációját és/vagy platformját módosítja, a fennmaradó három projekt esetében is ugyanazokat a módosításokat kell végrehajtania.

    Jegyzet Ez a tesztkörnyezet feltételezi, hogy 64 bites Windows van használatban. Ha 32 bites Windowst használ, hozza létre az illesztőprogramot 32 bitesre.

  4. Illesztőprogram aláírásának ellenőrzése

    Keresse meg a TabletAudioSample fájlt. Nyissa meg a Sysvad-illesztőprogram tulajdonságlapját, és győződjön meg arról, hogy az illesztőprogram-aláírási>módtesztjelre van állítva.

  5. Az illesztőprogram-mintákat módosítani kell, hogy olyan értékeket használjon, amelyek nincsenek átfedésben a meglévő illesztőprogramokkal. Tekintse meg a Mintakódtól a termelési telepítésre kész illesztőprogramig – A mintákban, hogyan hozhat létre egy egyedi illesztőprogram-mintát, amely együtt fog létezni a Windowsban jelenleg telepített illesztőprogramokkal.

  6. A minta létrehozása a Visual Studióval

    A Visual Studióban válassza Build>Build Solutionlehetőséget.

    A buildablakoknak egy üzenetnek kell megjelennie, amely jelzi, hogy mind a hat projekt buildje sikeres volt.

Jótanács

Ha buildelési hibaüzenetet tapasztal, a buildelési hibaszámmal állapítsa meg a javítást. Például MSBuild hiba MSB8040 leírja, hogyan lehet a Spectre elleni védelemmel rendelkező könyvtárakkal dolgozni.

  1. A beépített illesztőprogram-fájlok megkeresése

    A Fájlkezelőben keresse meg azt a mappát, amely a minta kinyert fájljait tartalmazza. Például a C:\WDK_Samples\Sysvad mappába navigálhat, ha ez a korábban megadott mappa. Ebben a mappában a lefordított illesztőprogram-fájlok helye a Configuration Managerben kiválasztott konfigurációs és platformbeállításoktól függően változik. Ha például változatlanul hagyta az alapértelmezett beállításokat, a rendszer a lefordított illesztőprogram-fájlokat egy \x64\Hibakeresés nevű mappába menti egy 64 bites hibakeresési buildhez.

    Keresse meg a TabletAudioSample illesztőprogram beépített fájljait tartalmazó mappát:

    C:\WDK_Samples\Sysvad\TabletAudioSample\x64\Debug. A mappa tartalmazza a TabletAudioSample .SYS illesztőprogramot, a szimbólum pdp-fájlt és az inf fájlt. Meg kell keresnie a DelayAPO, a KWSApo és a KeywordDetectorContosoAdapter DLL-fájlokat és szimbólumfájlokat is.

    Az illesztőprogram telepítéséhez a következő fájlokra lesz szüksége.

    Fájlnév Leírás
    TabletAudioSample.sys Az illesztőprogram-fájl.
    TabletAudioSample.pdb Az illesztőprogram szimbólumfájlja.
    tabletaudiosample.inf Az illesztőprogram telepítéséhez szükséges információkat tartalmazó információs (INF) fájl.
    KeywordDetectorContosoAdapter.dll Mintául szolgáló kulcsszódetektor.
    KeywordDetectorContosoAdapter.pdb A minta kulcsszóérzékelő szimbólumfájlja.
    DelayAPO.dll Minta késleltetési APO.
    DelayAPO.pdb A késleltetett APO szimbólumfájl.
    KWSApo.dll Egy mintapéldány kulcsszók kereső APO.
    KWSApo.pdb A kulcsszóválasztó szimbólumfájl.
    TabletAudioSample.cer A TabletAudioSample tanúsítványfájlja.
  2. Keresse meg az USB-meghajtót, vagy állítson be egy hálózati megosztást a beépített illesztőprogram-fájlok gazdagépről a célrendszerbe való másolásához.

A következő szakaszban átmásolja a kódot a célrendszerbe, majd telepíti és teszteli az illesztőprogramot.

4. szakasz: A Sysvad hangillesztő minta telepítése a célrendszerre

A 4. szakaszban a Devcon használatával telepítheti a Sysvad hangillesztőt.

-> A célrendszeren

Az a számítógép, amelyre az illesztőprogramot telepítik, a célszámítógép vagy a tesztszámítógépnéven ismert. Ez általában egy külön számítógép attól a számítógéptől, amelyen az illesztőprogram-csomagot fejleszti és hozza létre. Az a számítógép, ahol az illesztőprogramot fejleszti és építi, a gazdaszámítógépnéven ismert.

Az illesztőprogram-csomag célszámítógépre való áthelyezésének és az illesztőprogram telepítésének folyamatát az illesztőprogram üzembe helyezésének nevezzük.

Az illesztőprogram üzembe helyezése előtt elő kell készítenie a célszámítógépet a tesztaláírás bekapcsolásával. Ezután készen áll a beépített illesztőprogram-minta futtatására a célrendszeren.

Ha telepíteni szeretné az illesztőprogramot a célrendszerre, hajtsa végre az alábbi lépéseket.

  1. Tesztelt aláírású illesztőprogramok engedélyezése

    Az aláírt tesztillesztők futtatásának engedélyezése:

    1. Nyissa meg a Windows-beállításokat.

    2. A Frissítés és biztonságterületen válassza a Recoverylehetőséget.

    3. A Speciális rendszerindításterületen válassza a Újraindítás mostlehetőséget.

    4. Amikor a számítógép újraindul, válassza a Hibaelhárítás lehetőséget.

    5. Ezután válassza a Speciális beállítások, az Indítási beállítások , majd az Újraindítás lehetőséget.

    6. Az F7 billentyű lenyomásával válassza az illesztőprogram-aláírás érvényesítésének letiltása lehetőséget.

    7. A számítógép az új értékekkel kezdődik.

  2. -> A célrendszeren

    Az illesztőprogram telepítése

    Az alábbi utasítások bemutatják, hogyan telepítheti és tesztelheti a mintaillesztőt.

    Az illesztőprogram telepítéséhez szükséges INF-fájl a TabletAudioSample.inf. A célszámítógépen nyisson meg egy parancssori ablakot rendszergazdaként. Lépjen az illesztőprogram-csomag mappájába, kattintson a jobb gombbal a TabletAudioSample.inf fájlra, majd válassza a Telepítés lehetőséget.

    Megjelenik egy párbeszédpanel, amely azt jelzi, hogy a tesztillesztő aláírás nélküli illesztőprogram. Válassza a Mégis telepítem ezt az illesztőprogramot a folytatáshoz.

    Képernyőkép a Windows biztonsági figyelmeztetéséről, amely szerint a Windows nem tudja ellenőrizni a közzétevőt.

    Jótanács

     Ha bármilyen probléma merül fel a telepítéssel kapcsolatban, további információt az alábbi fájlban talál. %windir%\inf\setupapi.dev.log

    Részletesebb útmutatásért lásd: Számítógép konfigurálása illesztőprogram-telepítéshez, teszteléshez és hibakereséshez.

    Az INF-fájl tartalmazza a tabletaudiosample.systelepítéséhez szükséges hardverazonosítót. A Syvad-minta hardverazonosítója a következő: root\sysvad_TabletAudioSample

  3. Az illesztőprogram vizsgálata az Eszközkezelőben

    A célszámítógép parancssori ablakában adja meg devmgmt az Eszközkezelő megnyitásához. Az Eszközkezelő Nézet menüjében válassza az Eszközök típus szerint lehetőséget.

    Az eszközfában keresse meg a virtuális hangeszközt (WDM) – Táblamintát a Hangeszköz csomópontban. Ez általában a Hang-, video- és játékvezérlők csomópont alatt található . Győződjön meg arról, hogy telepítve van és aktív.

    Jelölje ki az illesztőprogramot a pc-n lévő tényleges hardverhez a Device Managerben. Ezután jelölje ki és tartsa lenyomva az illesztőprogramot (vagy kattintson rá a jobb gombbal), és válassza a letiltás lehetőséget az illesztőprogram letiltásához.

    Ellenőrizze a Device Managerben, hogy a hanghardver-illesztőprogram egy lefelé mutató nyíllal jelzi, hogy le van tiltva.

    Képernyőkép az Eszközkezelő fájáról, amelyen a virtuális hangeszköz táblamintája ki van emelve.

    A mintaillesztő sikeres telepítése után készen áll a tesztelésre.

A Sysvad hangillesztő tesztelése

  1. A célszámítógép parancssori ablakában adja meg devmgmt az Eszközkezelő megnyitásához. Az Eszközkezelő Nézet menüjében válassza az Eszközök típus szerint lehetőséget. Az eszközfán keresse meg a virtuális hangeszközt (WDM) – Táblamintát.

  2. Nyissa meg a Vezérlőpultot, és keresse meg a Hardver- és hangkezelési>hangeszközöket. A Hang párbeszédpanelen válassza a Virtuális hangeszköz (WDM) – Táblaminta feliratú hangszóró ikont, majd válassza az Alapértelmezett beállítás lehetőséget, de ne válassza az OK gombot. Ezzel nyitva marad a Hang párbeszédpanel.

  3. Keresse meg az MP3 vagy más hangfájlt a célszámítógépen, és kattintson rá duplán a lejátszáshoz. Ezután a Hang párbeszédpanelen ellenőrizze, hogy van-e tevékenység a virtuális hangeszközhöz (WDM) – Táblagép mintaillesztőhöz társított hangerőjelzőben.

5. szakasz: Az illesztőprogram adatainak megjelenítése a WinDbg használatával

Az 5. szakaszban beállítja a szimbólum elérési útját, és kernel hibakereső parancsokkal jeleníti meg a Sysvad-mintaillesztő adatait.

A szimbólumok lehetővé teszik, hogy a WinDbg további információkat, például változóneveket jelenítsen meg, amelyek hibakereséskor felbecsülhetetlen értékűek lehetnek. A WinDbg a Microsoft Visual Studio hibakeresési szimbólumformátumát használja a forrásszintű hibakereséshez. Bármilyen szimbólumhoz vagy változóhoz hozzáférhet egy OLYAN modulból, amely PDB-szimbólumfájlokat tartalmaz.

A hibakereső betöltéséhez hajtsa végre a következő lépéseket.

<-A hosztrendszeren

  1. Ha bezárta a hibakeresőt, nyissa meg újra a következő paranccsal a rendszergazda parancssori ablakában. Cserélje le a kulcsot és a portot a korábban konfiguráltra.

    C:\> WinDbg –k net:port=50010,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
    
  2. A Ctrl+Break (Scroll Lock) billentyűkombinációval törhet be a célrendszeren futó kódba.

A szimbólum elérési útjának beállítása

  1. A . symfix paranccsal állíthatja be a Szimbólumok elérési útját a Microsoft szimbólumkiszolgálójához a WinDbg környezetben.

    0: kd> .symfix
    
  2. Ha a helyi szimbólumok használatához szeretné hozzáadni a helyi szimbólum helyét, adja hozzá az elérési utat a .sympath+ paranccsal, majd futtassa az .reload /f parancsot.

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

    Jegyzet A .reload parancs a /f force beállítással törli a megadott modul összes szimbóluminformációit, és újra betölti a szimbólumokat. Bizonyos esetekben ez a parancs újra betölti vagy kiüríti magát a modult.

Jegyzet A WinDbg által biztosított speciális funkciók használatához be kell töltenie a megfelelő szimbólumokat. Ha nincsenek megfelelően konfigurálva a szimbólumok, üzeneteket fog kapni, amelyek jelzik, hogy a szimbólumok nem érhetők el, amikor szimbólumoktól függő funkciókat próbál használni.

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

MegjegyzésSzimbólumkiszolgálók

A szimbólumok használatához számos megközelítés használható. A számítógép számos esetben konfigurálható úgy, hogy a szimbólumokat a Microsoft által biztosított szimbólumkiszolgálóról érje el, amikor szükség van rájuk. Ez az útmutató feltételezi, hogy ezt a megközelítést fogja használni. Ha a környezet szimbólumai más helyen találhatók, módosítsa a hely használatának lépéseit. További információ: Szimbólum elérési útja a Windows hibakeresőhöz.

Megjegyzés: A forráskód szimbólumkövetelményei

A forráskeresés végrehajtásához létre kell készítenie a bináris fájlok ellenőrzött (hibakeresési) verzióját. A fordító szimbólumfájlokat (.pdb fájlokat) hoz létre. Ezek a szimbólumfájlok megjelenítik a hibakeresőnek, hogy a bináris utasítások hogyan felelnek meg a forrásvonalaknak. Maguknak a tényleges forrásfájloknak is elérhetőnek kell lenniük a hibakereső számára.

A szimbólumfájlok nem tartalmazzák a forráskód szövegét. Hibakereséshez a legjobb, ha a linker nem optimalizálja a kódot. A forráskeresés és a helyi változókhoz való hozzáférés nehezebb, és néha szinte lehetetlen, ha a kód optimalizálva lett. Ha problémái vannak a helyi változók vagy forrásvonalak megtekintésével, adja meg az alábbi összeállítási beállításokat.

Állítsa be a COMPILE_DEBUG=1 értéket

Állítsa be ENABLE_OPTIMIZER=0 értékre

  1. Írja be a következőt a hibakereső parancsterületére a Sysvad-illesztőprogramra vonatkozó információk megjelenítéséhez.

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

    További információ: lm.

  2. A hibakeresési kimenetben válassza a Tallózás az összes globális szimbólum között hivatkozást az a betűvel kezdődő elemek szimbólumaival kapcsolatos információk megjelenítéséhez.

  3. Mivel a DML engedélyezve van, a kimenet egyes elemei választható gyakori elérésű hivatkozások. Válassza ki a hibakeresési kimenet adathivatkozását az a betűvel kezdődő elemek szimbólumaival kapcsolatos információk megjelenítéséhez.

    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 *)
    

    További információ: x (Szimbólumok vizsgálata).

  4. A !lmi bővítmény részletes információkat jelenít meg egy modulról. Írja be a !lmi tabletaudiosample parancsot. A kimenetnek az alábbihoz hasonlónak kell lennie.

    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 !dh kiterjesztéssel az alábbi módon jelenítheti meg a fejlécadatokat.

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

6. szakasz: A Plug and Play eszközfa adatainak megjelenítése

A 6. szakaszban információkat jelenít meg a Sysvad-mintaeszköz-illesztőprogramról, valamint arról, hogy hol található a Plug and Play eszközfa.

A Plug and Play eszközfában található eszközillesztővel kapcsolatos információk hasznosak lehetnek a hibaelhárításhoz. Ha például egy eszközillesztő nem az eszközfán található, az eszközillesztő telepítésével kapcsolatos probléma léphet fel.

További információ az eszközcsomópont hibakeresési bővítményéről: !devnode.

<-A hosztrendszeren

  1. A Plug and Play eszközfa összes eszközcsomópontjának megtekintéséhez írja be a !devnode 0 1 parancsot. A parancs futtatása eltarthat egy-két percig. Ez idő alatt a "*Foglalt" a WinDbg állapotterületén jelenik meg.

    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. A Ctrl+F billentyűkombinációval keresse meg az eszközillesztő ( sysvad) nevét a létrehozott kimenetben.

    Keresse meg azt a párbeszédpanelt, amelyben a keresőmezőbe beírva szerepel a

    A Syvad !devnode kimenetében megjelenik egy eszközcsomópont-bejegyzés, amelynek neve sysvad_TabletAudioSample szerepel.

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

    Vegye figyelembe, hogy megjelenik az OEM-cím és a DevNode-cím.

  3. A parancs használatával megjelenítheti a !devnode 0 1 sysvad_TabletAudioSample Sysvad-eszközillesztőhöz társított Plug and Play-információkat.

    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. Az előző parancsban megjelenített kimenet tartalmazza az illesztőprogram futó példányához társított oem-et, ebben a példában ez 0xffffe00089c575a0. Adja meg a !devobj<PDO cím parancsot> a Sysvad-eszközillesztőhöz társított Plug and Play-információk megjelenítéséhez. Használja a pc-n a !devnode által megjelenített oem-címet, és ne az itt látható címet.

    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. A !devobj parancsban megjelenített kimenet tartalmazza a csatlakoztatott eszköz nevét: \Driver\sysvad_tabletaudiosample. A !drvobj paranccsal 2 bites maszkkal jelenítheti meg a csatlakoztatott eszközhöz társított információkat.

    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. Adja meg a !devstack<PDO-címet> az eszközillesztőhöz kapcsolódó Plug and Play információk megjelenítéséhez. A !devnode 0 1 parancsban megjelenített kimenet tartalmazza az illesztőprogram futó példányához társított oem-címet. Ebben a példában ez 0xffffe00089c575a0. Használja a !devnode által a PC-jén megjelenített PDO-címet, ne az alább láthatót.

    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"
    

A kimenet azt mutatja, hogy egy nagyon egyszerű eszközillesztő-vermet használunk. A sysvad_TabletAudioSample illesztőprogram a PnPManager csomópont gyermeke. A PnPManager egy gyökércsomópont.

Ez az ábra egy összetettebb eszközcsomópontfát mutat be.

Körülbelül 20 csomópontból álló eszközcsomópontfa diagramja.

Jegyzet Az összetettebb illesztőprogram-veremekkel kapcsolatos további információkért lásd: Illesztőprogram-veremek , eszközcsomópontok és eszközveremek.

7. szakasz: Töréspontok használata

A 7. szakaszban töréspontokkal fogja leállítani a kódvégrehajtást adott pontokon.

Töréspontok beállítása parancsokkal

A töréspontok a kódvégrehajtás egy adott kódsoron történő leállítására szolgálnak. Ezután továbbléphet a kódban attól a ponttól kezdve, hogy hibakeresést végezzen a kód adott szakaszában.

Ha hibakeresési paranccsal szeretne töréspontot beállítani, használja az alábbi b parancsok egyikét.

Bp

Beállít egy töréspontot, amely addig aktív marad, amíg a modul betöltését meg nem szüntetik.

Bu

Beállít egy feloldatlan töréspontot, amikor a modul ki van töltve, és újra engedélyezi a modul újratöltését.

Bm

Töréspontot állít be egy szimbólumhoz. Ez a parancs a bu vagy a bp megfelelő használatát teszi lehetővé, és lehetővé teszi a helyettesítő karakterek * használatát az összes egyező szimbólum töréspontjainak beállításához (például az osztály összes metódusához).

  1. A WinDbg felhasználói felületén ellenőrizze, hogy a hibakeresési>forrás mód engedélyezve van-e az aktuális WinDbg-munkamenetben.

  2. Adja hozzá a helyi kód helyét a forrásútvonalhoz az alábbi parancs beírásával.

    .sympath+ C:\WDK_Samples\Sysvad
    
  3. Adja hozzá a helyi szimbólum helyét a szimbólum elérési útjához az alábbi parancs beírásával.

    .sympath+ C:\WDK_Samples\Sysvad
    
  4. A hibakeresési maszk beállítása

    Mivel egy illesztőprogrammal dolgozik, hasznos lehet látni az összes üzenetet, amelyet megjeleníthet. Írja be a következőt az alapértelmezett hibakeresési bitmaszk módosításához, hogy a célrendszer összes hibakeresési üzenete megjelenjen a hibakeresőben.

    0: kd> ed nt!Kd_DEFAULT_MASK 0xFFFFFFFF
    
  5. Állítsa be a töréspontot a bm paranccsal az illesztő nevével, majd a függvény nevével (AddDevice), ahol be szeretné állítani a töréspontot, felkiáltójellel elválasztva.

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

    Különböző szintaxist használhat olyan változók beállításával együtt, mint a <modul>!<szimbólum>, <osztály>::<metódus>, '<file.cpp>:<sorszám>', vagy hagyja ki a feltételt bizonyos számú alkalommal<#>. További információ: Töréspontok használata.

  6. Az aktuális töréspontok listázásával ellenőrizheti, hogy a töréspont be van-e állítva a bl parancs beírásával.

    0: kd> bl
    1 e fffff801`14b5f000     0001 (0001) tabletaudiosample!AddDevice
    
  7. Indítsa újra a kódvégrehajtást a célrendszeren a g parancs beírásával.

  8. ->A célrendszeren

    Windows rendszerben nyissa meg az Eszközkezelőt az ikonnal vagy az mmc devmgmt.msc beírásával. A Device Managerben bontsa ki a Hang-, video- és játékvezérlők csomópontot . Válassza ki és tartsa lenyomva a virtuális hangillesztő bejegyzését (vagy kattintson rá a jobb gombbal), majd válassza ki a Letiltás lehetőséget a menüből.

  9. Jelölje ki és tartsa lenyomva (vagy kattintson a jobb gombbal) a virtuális hangillesztő bejegyzését, majd válassza az Engedélyezés lehetőséget a menüből.

  10. <– A gazdarendszeren

    Ennek hatására a Windows újra betölti az illesztőprogramot, amely meghívja az AddDevice-t. Ez az AddDevice hibakeresési töréspont kigyulladását okozza, és a célrendszer illesztőprogram-kódjának végrehajtása leáll.

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

    Ha a forrásútvonal megfelelően van beállítva, akkor az AddDevice rutinnál meg kell állnia az adapter.cpp-ben.

    {
        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. A p parancs beírásával vagy az F10 billentyű lenyomásával lépésről lépésre haladhat végig a kódon. A sysvad AddDevice kódból továbbléphet a PpvUtilCall, a PnpCallAddDevice, majd a PipCallDriverAddDevice Windows-kódra. A p parancsnak megadhat egy számot, amely több sort is előreléptet, például p 5.

  12. Ha végzett a kód futtatásával, a g go paranccsal indítsa újra a végrehajtást a célrendszeren.

Memóriaelérési töréspontok beállítása

Olyan töréspontokat is beállíthat, amelyek memóriahely elérésekor aktiválhatók. Használja a ba (hozzáférés-megszakítás) parancsot az alábbi szintaxissal.

ba <access> <size> <address> {options}
Lehetőség Leírás

e

végrehajtás (amikor a CPU lekéri az utasítást a címről)

r

olvasás/írás (amikor a CPU beolvassa vagy a címre ír)

w

írás (amikor a CPU a címre ír)

Vegye figyelembe, hogy egy adott időpontban csak négy adattörési pontot állíthat be, és Önnek kell gondoskodnia arról, hogy helyesen igazítsa az adatokat, vagy hogy ne aktiválja a töréspontot (a szavaknak 2-gyel osztható címekben kell végződniük, a dwords-nek 4-gyel, a quadwordsnek pedig 0-tal vagy 8-tal kell oszthatónak lennie)

Ha például be szeretne állítani egy olvasási/írási töréspontot egy adott memóriacímre, használjon egy ehhez hasonló parancsot.

ba r 4 fffff800`7bc9eff0

Töréspont állapotának módosítása

A meglévő töréspontokat az alábbi parancsokkal módosíthatja.

Bl

A töréspontok listája.

Kr. e.

Törli a töréspontot a listából. Az összes töréspont törléséhez használja a bc * karaktert.

Bd

Letilt egy töréspontot. A bd * használatával tiltsa le az összes töréspontot.

lenni

Töréspont engedélyezése. Az összes töréspont engedélyezéséhez használja a Be * lehetőséget.

A töréspontokon a szerkesztés> menüpont kiválasztásával is módosíthat. Vegye figyelembe, hogy a töréspont párbeszédpanel csak a meglévő töréspontokkal működik. Az új töréspontokat a parancssorból kell beállítani.

Töréspont beállítása a MixerVolume-on

A rendszer meghívja a hangillesztő-kód különböző részeit, hogy reagáljanak a különböző eseményekre az eszközillesztő betöltése után. A következő szakaszban beállítunk egy töréspontot, amely akkor aktiválódik, amikor a felhasználó módosítja a virtuális hangillesztő hangerő-vezérlését.

Ha töréspontot szeretne beállítani a MixerVolume-on, hajtsa végre az alábbi lépéseket.

  1. <– A gazdarendszeren

    A hangerőt módosító metódus megkereséséhez használja az x parancsot, hogy listázza a CAdapterCommon szimbólumokat, amelyek tartalmazzák a 'volume' sztringet.

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

    A CTRL+F billentyűkombinációval kereshet felfelé a hangerő kimenetében, és megkeresheti a MixerVolumeWrite metódust.

  2. Törölje az előző töréspontokat a bc *használatával.

  3. Állítson be egy szimbólumtörési pontot a CAdapterCommon::MixerVolumeWrite rutinhoz az alábbi paranccsal.

    kd> bm tabletaudiosample!CAdapterCommon::MixerVolumeWrite
      1: fffff801`177b26a0 @!"tabletaudiosample!CAdapterCommon::MixerVolumeWrite"
    
  4. Sorolja fel a töréspontokat, hogy meggyőződjön arról, hogy a töréspont megfelelően van beállítva.

    kd> bl
    1 e fffff801`177b26a0 [c:\WDK_Samples\audio\sysvad\common.cpp @ 1668]    0001 (0001) tabletaudiosample!CAdapterCommon::MixerVolumeWrite
    
  5. Indítsa újra a kódvégrehajtást a célrendszeren a g parancs beírásával.

  6. A Vezérlőpulton válassza a Hardver és hang>hang lehetőséget. Válassza ki és tartsa lenyomva (vagy kattintson a jobb gombbal) a Sink Description Sample elemet, és válassza a Tulajdonságok lehetőséget. Válassza a Szintek lapot. Állítsa be a csúszka hangerőt.

  7. Ennek hatására a SetMixerVolume hibakeresési töréspont aktiválódik, és a célrendszer illesztőprogram-kódjának végrehajtása leáll.

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

    Álljon meg ennél a sornál a common.cpp fájlban.

    {
        if (m_pHW)
        {
            m_pHW->SetMixerVolume(Index, Channel, Value);
        }
    } // MixerVolumeWrite
    
  8. A dv paranccsal megjelenítheti az aktuális változókat és azok értékeit. A változókkal kapcsolatos további információk a labor következő szakaszában találhatók.

    2: kd> dv
               this = 0x00000000`00000010
             ulNode = 0x344
          ulChannel = 0x210a45f8
            lVolume = 0n24
    
  9. Nyomja le az F10 billentyűt a kód egy lépésben történő végiglépéséhez.

  10. Nyomja le az F5 billentyűt a MixerVolumeWrite kód végrehajtásának befejezéséhez.

Összegzés – A hibakereső parancsablakából lépegetve a kódban

A következő parancsokkal lépegethet a kódon (zárójelben a billentyűzethez tartozó rövid vágásokkal).

  • Betörés (Ctrl+Break) – Ez a parancs megszakítja a rendszer működését, amíg a rendszer fut és kapcsolatban van a WinDbg-gel (a Kernel Debuggerben a kombináció: Ctrl+C).

  • Átlépés (F10) – Ez a parancs a kód végrehajtását egyesével, egy utasításon vagy utasításonként eredményezi. Hívás esetén a kódvégrehajtás a hívott rutin megadása nélkül halad át a híváson. (Ha a programozási nyelv C vagy C++ és a WinDbg forrás módban van, a forrás mód a Hibakeresés> funkcióval be- vagy kikapcsolhatóForrás mód).

  • Step in (F11) – Ez a parancs hasonló a "lépés át" (step-over) utasításhoz, azzal a kivétellel, hogy a hívás végrehajtása belép a hívott rutinba.

  • Kilépés (Shift+F11) – Ez a parancs azt eredményezi, hogy a végrehajtás az aktuális rutinon fut keresztül, majd kilép a hívásverem aktuális helyéről. Ez akkor hasznos, ha már eleget látott a rutinból.

  • Futtatás a kurzorhoz (F7 vagy Ctrl+F10) – Helyezze a kurzort egy forrás- vagy szétszerelési ablakba, ahol a végrehajtást el szeretné törni, majd nyomja le az F7 billentyűt; a kódvégrehajtás erre a pontra fog futni. Vegye figyelembe, hogy ha a kódvégrehajtás folyamata nem éri el a kurzor által jelzett pontot (például ha nem hajtja végre a HA utasítást), a WinDbg nem törik meg, mert a kód végrehajtása nem érte el a megadott pontot.

  • Futtatás (F5) – Futtatás addig, amíg töréspont nem történik, vagy hibaellenőrzéshez hasonló esemény nem történik.

Speciális beállítások

  • Utasítás beállítása az aktuális sorra (Ctrl+Shift+I) – A forrásablakban elhelyezheti a kurzort egy vonalon, beírhatja ezt a billentyűparancsot, és a kódvégrehajtás attól a ponttól indul el, amint engedélyezi a folytatást (például F5 vagy F10 használatával). Ez akkor hasznos, ha újra meg szeretne próbálkozni egy sorozatgal, de némi odafigyelést igényel. A regiszterek és a változók például nem arra vannak beállítva, hogy milyenek lennének, ha a kódvégrehajtás természetesen elérte volna ezt a sort.

  • Az eip-nyilvántartás közvetlen beállítása – Az eip-nyilvántartásba beírhat egy értéket, és amint lenyomja az F5 billentyűt (vagy F10, F11 stb.), a végrehajtás ezen a címen kezdődik. Ez hasonló a kurzor által kijelölt aktuális sor utasításának beállításához, azzal a kivételsel, hogy megadja egy szerelvényutasítás címét.

A parancssor helyett egyszerűbb lehet a felhasználói felületen végiglépkedni, ezért ez a módszer ajánlott. Szükség esetén a következő parancsokkal lépkedhet át egy forrásfájlon a parancssorban:

  • .lines – Forrásvonal-információk engedélyezése.

  • bp main – Állítsa be a kezdő töréspontot a modul elején.

  • l+t – A léptetés a forrásvonalon történik.

  • Válassza a Hibakeresés>Forrás mód lehetőséget a forrás módba lépéshez; a L+t parancs nem elegendő.

  • l+s – A forrásvonalak azonnal megjelennek.

  • g – Futtassa a programot, amíg el nem éri a "main" állapotot.

  • p – Egy forrássor végrehajtása.

További információért lásd: Forráskód hibakeresése a klasszikus WinDbg az hibakeresési referenciadokumentációban.

Töréspontok beállítása kódban

A kódban töréspontot úgy állíthat be, hogy hozzáadja az DebugBreak() utasítást, újraépíti a projektet, majd újratelepíti az illesztőprogramot. Ez a töréspont minden alkalommal aktiválódik, amikor az illesztőprogram engedélyezve van, ezért a korai fejlesztési szakaszokban, nem pedig az éles kódban használandó technikák közé tartozik. Ez a technika nem olyan rugalmas, mint a töréspontok dinamikus beállítása a töréspontok parancsaival.

Tipp: Érdemes megtartani a Sysvad-illesztő egy példányát, amelyhez nincs hozzáadva töréspont, a további laboratóriumi munkákhoz.

  1. Állítson be törést az AddDevice metódus minden futtatásakor úgy, hogy hozzáadja az DebugBreak() utasítást a mintakódhoz.

    ...
        // 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. Kövesse a korábban ismertetett lépéseket az illesztőprogram Microsoft Visual Studióban való újraépítéséhez és a célgépre való újratelepítéséhez. A frissített illesztőprogram telepítése előtt mindenképpen távolítsa el a meglévő illesztőprogramot.

  3. Törölje a korábbi töréspontokat, és győződjön meg arról, hogy a hibakereső csatlakoztatva van a célszámítógéphez.

  4. Amikor a kód fut és eléri az utasítást, a DebugBreak végrehajtás leáll, és megjelenik egy üzenet.

    KERNELBASE!DebugBreak:
    77b3b770 defe     __debugbreak
    

8. szakasz: Változók megjelenítése

A 8. szakaszban hibakereső parancsokat fog használni a változók megjelenítéséhez.

Hasznos lehet a változók vizsgálata a kód végrehajtásakor annak ellenőrzéséhez, hogy a kód a várt módon működik-e. Ez a laboratórium a változókat vizsgálja, amikor a hangillesztő hangot állít elő.

  1. A dv paranccsal vizsgálja meg a tabletaudiosample-hez társított területi változókat! CMiniportWaveRT::Új*.

    kd> dv tabletaudiosample!CMiniportWaveRT::New*
    
  2. Az előző töréspontok törlése

    bc *
    
  3. Állítson be egy szimbólumtörési pontot a CMiniportWaveCyclicStreamMSVAD rutinokon az alábbi paranccsal.

    0: kd> bm tabletaudiosample!CMiniportWaveRT::NewStream
      1: fffff801`177dffc0 @!"tabletaudiosample!CMiniportWaveRT::NewStream"
    
  4. Indítsa újra a kódvégrehajtást a célrendszeren a g parancs beírásával.

  5. -> A célrendszeren

    Keresse meg a kis médiafájlt (például a Windows értesítési hangfájlját .wav kiterjesztéssel), és válassza ki a fájlt a lejátszáshoz. Használhatja például a Windows\Media könyvtárban található Ring05.wav.

  6. <– A gazdarendszeren

    A médiafájl lejátszásakor a töréspontnak ki kell égnie, és a célrendszer illesztőprogram-kódjának végrehajtása leáll.

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

    A forráskód ablakának ki kell emelnie a kapcsos zárójelet a NewStream függvény elején.

    /*++
    
    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. helyi változók

    Az adott kerethez tartozó összes helyi változó nevét és értékét megjelenítheti a dv parancs beírásával.

    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. Változók megjelenítése DML használatával

    Ha a DML használatával szeretne változókat felderíteni, jelölje ki az aláhúzott elemeket. A kiválasztási művelet létrehoz egy dx (NatVis-kifejezés megjelenítése) parancsot, amely lehetővé teszi a beágyazott adatstruktúrák részletezését.

    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. globális változók

    A globális változó memóriahelyének megkereséséhez írja be a következőt : <változó neve>.

    0: kd> ? signalProcessingMode
    Evaluate expression: -52768896396472 = ffffd001`c8acd348
    
  10. Ez a változó memóriahelyét adja vissza, ebben az esetben ffffd001'c8acd348. A memóriahely tartalmát úgy tekintheti meg, hogy az adott hely értékét az előző parancs által visszaadott memóriahely használatával írja be a dd parancsba.

    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. A dd paranccsal változóneveket is használhat.

    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. Változók megjelenítése

    AHelyiek> menüelem használatával megjelenítheti a helyi változókat. Ez az interfész lehetővé teszi az összetettebb adatstruktúrák részletezésének lehetőségét is.

    A WinDbg felület mintakód helyi kódját és parancsablakait jeleníti meg.

  13. P vagy F10 használatával léptessen körülbelül 10 sort a kódban, amíg az ntStatus = IsFormatSupported(Pin, Capture, DataFormat) kódsort nem emeli ki.

        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. A dv paranccsal megjelenítheti egy adott keret összes helyi változójának nevét és értékét. Vegye figyelembe, hogy a vártnak megfelelően az értékek eltérnek a parancs legutóbbi futtatásakor használt értékektől, mivel a rendszer további kódot futtatott, amelyek megváltoztatják a helyi változókat, és egyes változók már nem szerepelnek az aktuális keretben, vagy az értékek módosultak.

    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
    

9. szakasz: Hívásveremek megtekintése

A 9. szakaszban a hívásveremeket tekintheti meg a hívó/hívó kód vizsgálatához.

A hívásverem azoknak a függvényhívásoknak a láncolata, amelyek a programszámláló aktuális helyére vezettek. A hívásverem legfelső függvénye az aktuális függvény, a következő pedig az a függvény, amelyik az aktuális függvényt hívta, és így tovább.

A hívásverem megjelenítéséhez használja a k* parancsokat:

kB

Megjeleníti a verem tartalmát és az első három paramétert.

Kp

Megjeleníti a veremstruktúrákat és a paraméterek teljes listáját.

-kn-

Lehetővé teszi a verem megtekintését a keretinformációkkal együtt.

Ha elérhetővé szeretné tenni a hívásvermet, ahívásverem>válassza a Hívásverem megtekintése lehetőséget. Válassza ki az ablak tetején lévő oszlopokat a további információk megjelenítésének váltásához.

A hívásveremablakot megjelenítő WinDbg-felület.

Ez a kimenet a hívásvermet jeleníti meg a mintaadapter kódjának hibakeresése közben, amikor az megszakított állapotban van.

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

A kód további megismeréséhez használhatja a DML-t. Az első 00 bejegyzés kiválasztásakor a rendszer a .frame (Helyi környezet beállítása) paranccsal állítja be a környezetet, majd a dv (Helyi változók megjelenítése) parancs megjeleníti a helyi változókat.

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

10. szakasz: Folyamatok és szálak megjelenítése

A 10. szakaszban hibakereső parancsokkal jelenítheti meg a folyamatokat és a szálakat.

Folyamat

Az aktuális folyamatkörnyezet módosításához használja a .process <process> parancsot. Az alábbi példa bemutatja, hogyan azonosíthat egy folyamatot, és hogyan válthat környezetére.

  • !process A parancs használatával megjelenítheti a hang lejátszásában részt vevő aktuális folyamatot.

    További információ: !process

A kimenet azt mutatja, hogy a folyamat a(z) audiodg.exe-hoz kapcsolódik. Ha továbbra is a jelen témakör előző szakaszában leírt törésponton van, az aktuális folyamatot a audiodg.exe képhez kell társítani.

<– A gazdarendszeren

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

Megjegyzés: a folyamathoz társított szálak egyike FUT állapotban van. Ez a szál támogatta a médiaklip lejátszását a töréspont elérésekor.

A !process 0 0 paranccsal megjelenítheti az összes folyamat összefoglaló adatait. A parancskimenetben a CTRL+F billentyűkombinációval keresse meg a audiodg.exe lemezképhez társított folyamat folyamatazonosítóját. Az alábbi példában a folyamatazonosító ffffe001d147c840.

A számítógépén jegyezze fel a audiodg.exe társított folyamatazonosítót, hogy később felhasználhassa ebben a laborban. ________________________

...

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

Írja be a g billentyűt a hibakeresőbe a kód továbbfuttatásához, amíg a médiaklip le nem játszódik. Ezután lépjen be a hibakeresőbe a Ctrl+ScrLk (Ctrl+Break) billentyűkombináció lenyomásával. A !folyamat paranccsal erősítse meg, hogy egy másik folyamatot futtat.

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

A fenti kimenet azt mutatja, hogy egy másik rendszerfolyamat, az ffffe001cd0ad040, fut. A rendszerkép neve nem audiodg.exe, hanem a Rendszer nevet jeleníti meg.

A(z) !process paranccsal váltson arra a folyamatra, amely a(z) audiodg.exe-hoz volt társítva. A példában a folyamat azonosítója ffffe001d147c840. Cserélje le a példában szereplő folyamatazonosítót a korábban rögzített folyamatazonosítóra.

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.

Mivel ez a kód nem aktív, az összes szál várakozási állapotban van, a várt módon.

Témák

A szálak megtekintésére és beállítására szolgáló parancsok nagyon hasonlóak a folyamatok parancsaihoz. A !thread paranccsal megtekintheti a szálakat. A .thread használatával állítsa be az aktuális szálakat.

A médialejátszóhoz társított szálak felderítéséhez játssza le újra a médiaklipet. Ha az előző szakaszban leírt töréspont továbbra is érvényben van, a audiodg.exekontextusában fog leállni.

A !szál -1 0 használatával megjelenítheti az aktuális szál rövid adatait. Ez megjeleníti a szál címét, a szál- és folyamatazonosítókat, a szálkörnyezeti blokk (TEB) címét, a futtatáshoz létrehozott Win32 függvény címét (ha van ilyen), valamint a szál ütemezési állapotát.

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

A futó szálra vonatkozó további információk megtekintéséhez írja be a !thread parancsot. Az alábbiakhoz hasonló információkat kell megjeleníteni.

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

A k paranccsal megtekintheti a szálhoz társított hívásvermet.

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

Írja be a g billentyűt a hibakeresőbe a kód továbbfuttatásához, amíg a médiaklip le nem játszódik. Ezután lépjen be a hibakeresőbe a Ctrl - ScrLk (Ctrl-Break) billentyűkombináció lenyomásával. A !thread paranccsal erősítse meg, hogy most már egy másik szálat futtat.

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

A kép neve rundll32.exe, ami valójában nem a médiaklip lejátszásához társított képnév.

Jegyzet Az aktuális szál beállításához írja be a .thread <szál számát>.

További információ a szálakról és folyamatokról az alábbi hivatkozásokban található:

szálak és folyamatok

Környezetek módosítása

11. szakasz: IRQL, regiszterek és szétszerelés

A mentett IRQL megtekintése

A 11. szakaszban megjeleníti az IRQL-t és a regiszterek tartalmát.

<– A gazdarendszeren

A megszakításkérési szint (IRQL) a megszakítás-karbantartás prioritásának kezelésére szolgál. Minden processzor rendelkezik olyan IRQL-beállítással, amelyet a szálak emelhetnek vagy csökkenthetik. A processzor IRQL-beállításánál vagy alatt bekövetkező megszakítások maszkolva vannak, és nem zavarják az aktuális műveletet. A processzor IRQL-beállítása feletti megszakítások elsőbbséget élveznek az aktuális művelettel szemben. A !irql bővítmény megjeleníti a megszakításkérési szintet (IRQL) a célszámítógép aktuális processzorán a hibakeresési törés bekövetkezése előtt. Amikor a célszámítógép belép a hibakeresőbe, az IRQL megváltozik, de a hibakereső megszakítása előtt érvényes IRQL mentésre kerül, és a !irql megjeleníti.

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

< A nyilvántartások megtekintése és szétszerelése

A regiszterek megtekintése

Az r (Regisztrálások) paranccsal megjelenítheti az aktuális szálhoz tartozó regiszterek tartalmát az aktuális processzoron.

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

Másik lehetőségként megjelenítheti a regiszterek tartalmát a >Regiszterekmegtekintése lehetőség kiválasztásával.

Képernyőkép a WinDbg-regisztrációk ablakáról, amely körülbelül 12 regisztrációt jelenít meg.

A regiszterek tartalmának megtekintése hasznos lehet az assembly nyelvű kód végrehajtásának lépésenkénti követésében és más helyzetekben. További információ: r (Regiszterek).

A nyilvántartás tartalmával kapcsolatos információkért lásd: x86 Architektúra és x64 Architektúra.

Szétszerelés

A futtatás alatt álló kódot szétszerelheti, hogy megtekintse az aktuális szerelvénykódot a Megtekintés>Szétszerelés lehetőség kiválasztásával.

Képernyőkép a WinDbg szétszerelési ablakáról, amelyen a szerelvény nyelvi kódja látható.

A szerelvény nyelvének szétszereléséről további információt a Jegyzet x86 Szétszerelés és a Jegyzet x64 Szétszerelés című témakörben talál.

12. szakasz: Memóriahasználat

A 12. szakaszban hibakereső parancsokkal jeleníti meg a memória tartalmát.

Memória megtekintése

Előfordulhat, hogy a probléma azonosításához vagy a változók, mutatók stb. vizsgálatához meg kell vizsgálnia a memóriát. A memóriát az alábbi d* <címparancsok> egyikének beírásával jelenítheti meg.

Db

Bájtértékekben és ASCII-karakterekben jeleníti meg az adatokat.

Dd

Az adatokat dupla szélességű szavakként (4 bájt) jeleníti meg.

Du

Unicode-karakterekként jeleníti meg az adatokat.

Dw

Az adatokat szóértékként (2 bájt) és ASCII-karakterként jeleníti meg.

Jegyzet Ha érvénytelen címet próbál megjeleníteni, annak tartalma kérdőjelként (?) jelenik meg.

Másik lehetőségként a Memória megtekintése> lehetőséget választva tekintheti meg amemóriát. A megjelenítési formátum legördülő menüjét használva módosíthatja a memória megjelenítését.

Képernyőkép a WinDbg nézet memóriaablakáról különböző megjelenítési formátumokkal.

  1. A hangerőszabályzóhoz társított adatok megtekintéséhez állítson be egy töréspontot a PropertyHandlerAudioEngineVolumeLevel rutin során a bm paranccsal. Mielőtt beállítanánk az új töréspontot, töröljük az összes korábbi töréspontot a bc * használatával.

    kd> bc *
    
  2. Állítson be egy töréspontot a PropertyHandlerAudioEngineVolumeLevel rutinra a bm paranccsal.

    kd> bm tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume
      1: fffff80f`02c3a4b0 @!"tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume"
    
  3. Sorolja fel a töréspontokat, hogy meggyőződjön arról, hogy a töréspont megfelelően van beállítva.

    kd> bl
      1: fffff80f`02c3a4b0 @!"tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume"
    
  4. A g paranccsal indítsa újra a kódvégrehajtást.

    A célrendszeren állítsa be a hangerőt a rendszertálcán. Ez a töréspont kigyulladását okozza.

    Breakpoint 1 hit
    tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume:
    fffff80f`02c3a4b0 44894c2420      mov     dword ptr [rsp+20h],r9d
    
  5. AHelyi változók > menüelem használatával jelenítheti meg a helyi változókat. Figyelje meg az IVolume változó aktuális értékét.

  6. Az IVolume változó adattípusát és aktuális értékét a mintakódban a dt parancs és a változó nevének beírásával jelenítheti meg.

    kd> dt lVolume
    Local var @ 0xa011ea50 Type long
    0n-6291456
    
  7. A töréspont a SetDeviceChannelVolume beírásakor jön létre.

    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. Próbálja meg megjeleníteni az értéket az IVolume memóriahelyén a dt (Display Type) paranccsal.

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

    Mivel a változó még nincs definiálva, nem tartalmaz információt.

  9. Nyomja le az F10 billentyűt a SetDeviceChannelVolume utolsó kódsorának futtatásához.

        return ntStatus;
    
  10. Az érték megjelenítése az IVolume memóriahelyén a dt (Megjelenítés típusa) paranccsal.

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

    Most, hogy a változó aktív, megjelenik egy 6291456 érték ebben a példában.

  11. Az IVolume memóriahelyét is megjelenítheti a ? (Kifejezés kiértékelése) parancs.

    kd> ? lVolume
    Evaluate expression: -79711507126684 = ffffb780`b7eee664
    
  12. A megjelenített cím: ffffb780'b7eee664 az lVolume változó címe. A dd paranccsal megjelenítheti a memória tartalmát ezen a helyen.

    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. A cím első négy bájtját az L4 tartományparaméter megadásával jelenítheti meg.

    kd> dd ffffb780`b7eee664 l4
    ffffb780`b7eee664  ffa00000 00000018 00000000 c52d7008
    
  14. A különböző típusú memóriakimenet megjelenítéséhez írja be a du, da és db parancsokat.

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

    Az df lebegőpontos beállítással az adatokat egy pontosságú lebegőpontos számként (4 bájt) jelenítheti meg.

    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
    

Írás a memóriába

A memória olvasásához használt parancsokhoz hasonlóan az e* parancsokkal módosíthatja a memória tartalmát.

Parancs Leírás

darab

ASCII-sztring (nem NULL-végződésű)

Eu

Unicode-sztring (nem NULL-végződésű

Ew

Word-értékek (2 bájt)

eza

NULL-végződésű ASCII-sztring

ezu

NULL-végződésű Unicode-sztring

Eb

Bájtértékek

Ed

Kétszavas értékek (4 bájt)

Az alábbi példa bemutatja, hogyan írhatja felül a memóriát.

  1. Először keresse meg a mintakódban használt lVolume címét.

    kd> ? lVolume
    Evaluate expression: -79711507126684 = ffffb780`b7eee664
    
  2. Írja felül ezt a memóriacímet új karakterekkel az eb paranccsal.

    kd> eb 0xffffb780`b7eee664 11 11 11 11 11
    
  3. A memória helyének megjelenítésével ellenőrizheti, hogy a karakterek felülírva lettek-e a db-parancs beírásával.

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

Másik lehetőségként módosíthatja a memória tartalmát egy óra vagy helyi ablakban. Az óraablakban olyan változók jelenhetnek meg, amelyek nincsenek az aktuális keret kontextusában. A módosításuk nem releváns, ha nincsenek a kontextusban.

13. szakasz: A WinDbg-munkamenet befejezése

<-A hosztrendszeren

Ha szeretné csatlakoztatva hagyni a hibakeresőt, de a cél számítógépen kíván dolgozni, törölje a töréspontokat a bc *használatával, hogy a célszámítógép ne próbáljon csatlakozni a gazdagép hibakeresőjéhez. Ezután a g paranccsal hagyja újra futtatni a célszámítógépet.

A hibakeresési munkamenet befejezéséhez a gazdarendszeren szakítsa meg a hibakeresőt, és adja meg a qd (Kilépés és leválasztás) parancsot, vagy válassza a menüből a Hibakeresés leállítása lehetőséget.

0: kd> qd

További információ: Hibakeresési munkamenet befejezése a WinDbgben (klasszikus) a hibakeresési referenciadokumentációban.

14. szakasz: Windows hibakeresési erőforrások

További információk a Windows hibakereséséről érhetők el. Vegye figyelembe, hogy egyes könyvek a Windows régebbi verzióit, például a Windows Vista-t használják a példáikban, de a tárgyalt fogalmak a Windows legtöbb verziójára érvényesek.

Könyvek

  • Mario Hewardt és Daniel Pravat speciális Windows-hibakeresési

  • A Windowson belüli hibakeresés: Gyakorlati útmutató Tarik Soulami windowsos® hibakeresési és nyomkövetési stratégiáihoz

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

Videó

A töredezettségmentesítési eszközök Show WinDbg Episodes 13-29: </shows/defrag-tools/>

Betanítási szállítók:

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

Lásd még:

Első lépések a Windows hibakeresési