Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a labor bemutatja a WinDbg kernel hibakeresőt. A WinDbg használatával hibakeresést végez az echo kernel módú mintaillesztő kódban.
Laborcélok
Ez a tesztkörnyezet olyan gyakorlatokat tartalmaz, amelyek bemutatják a hibakeresési eszközöket, megtanítják a gyakori hibakeresési parancsokat, bemutatják a töréspontok használatát, és bemutatják a hibakeresési bővítmények használatát.
Ebben a laborban egy élő kernel hibakeresési kapcsolat használatával vizsgálja meg a következő műveleteket:
- A Windows hibakereső parancsainak használata
- Standard parancsok használata (hívásveremek, változók, szálak, IRQL)
- Speciális illesztőprogram-hibakeresési parancsok (!parancsok) használata
- Szimbólumok használata
- Töréspontok beállítása élő hibakeresésben
- Hívásveremek megtekintése
- A Plug and Play eszközfa megjelenítése
- Munka szál- és folyamatkörnyezetben
Felhasználói és kernel módú hibakeresés
A Windows hibakereső használatakor kétféle hibakeresést végezhet:
Felhasználói mód – Az alkalmazások és alrendszerek felhasználói módban futnak a számítógépen. A felhasználói módban futó folyamatok ezt a saját virtuális címterükön belül hajtják végre. A rendszer számos részéhez, például a rendszer hardveréhez, a nem a használatukhoz lefoglalt memóriához, valamint a rendszer más részeihez való közvetlen hozzáféréstől korlátozottak, amelyek veszélyeztethetik a rendszer integritását. Mivel a felhasználói módban futó folyamatok hatékonyan elkülönülnek a rendszertől és más felhasználói módú folyamatoktól, nem zavarhatják ezeket az erőforrásokat.
Kernel mód – Az operációs rendszer és a kiemelt programok kernel módban futnak. A kernel módú kód jogosult a rendszer bármely részének elérésére. Nincs korlátozva, mint a felhasználói mód kódja. Bármely más, felhasználói módban vagy kernel módban futó folyamat bármely részéhez hozzáférhet. Az operációs rendszer alapvető funkcióinak nagy része és számos hardvereszköz-illesztőprogram kernel módban fut.
Ez a gyakorlat a felhasználói és a kernel módú hibakeresés során gyakran használt hibakeresési parancsokat ismerteti. A gyakorlat a hibakeresési bővítményeket is lefedi, amelyeket "bang" !parancsoknakis neveznek, és amelyeket kernel-módú hibakereséshez használnak.
Tesztkörnyezet beállítása
A laboratóriumi gyakorlat elvégzéséhez a következő hardverre van szüksége:
- Windows 11 rendszerű laptop vagy asztali számítógép (gazdagép)
- Windows 11-et futtató második laptop vagy asztali számítógép (cél)
- Hálózati központ vagy ú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
Labor elvégzéséhez a következő szoftverre van szüksége:
- Visual Studio
- Windows 11-hez készült Windows Software Development Kit (SDK)
- Windows Driver Kit (WDK) a Windows 11-hez
- A Windows 11-hez készült echo-illesztő minta
A labor a következő szakaszokból áll:
- Csatlakozás kernel módú WinDbg-munkamenethez
- kernel módú hibakeresési parancsok és technikák
- A KMDF echoillesztőjének letöltése és létrehozása
- Telepítse az echo-illesztőprogram mintáját a célrendszerre
- A WinDbg segítségével megjelenítheti az illesztőprogram adatait
- Plug and Play eszközfa adatainak megjelenítése
- Töréspontok és forráskódok használata
- Változók és hívásveremek megtekintése
- Folyamatok és szálak megjelenítése
- IRQL, regiszterek, és a WinDbg munkamenet befejezése
- Windows hibakeresési erőforrások
Csatlakozás kernel módú WinDbg-munkamenethez
Ebben a 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 Windows-hibakereső a gazdagépen rendszeren fut, a Kernel Mode Driver Framework (KMDF) echo-illesztőprogram pedig a cél rendszeren fut.
A két számítógép csatlakoztatásához használjon hálózati központot vagy útválasztót és hálózati kábeleket.
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. További információ az Ethernet átviteli protokoll használatáról: A WinDbg (kernel mód) használatának első lépései. További információ a célszámítógép beállításáról: Számítógép előkészítése manuális illesztőprogram-telepítésre és A KDNET hálózati kernel hibakeresésének automatikus beállítása.
Kernel módú hibakeresés konfigurálása az Ethernet használatával
A gazdagép IP-címének rögzítése
Kernel módú hibakeresés engedélyezése a célrendszeren:
A gazdarendszerben nyisson meg egy parancssori ablakot, és adja meg ipconfig az IPv4-cím meghatározásához.
Windows IP Configuration Ethernet adapter Ethernet: Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::c8b6:db13:d1e8:b13b%3 Autoconfiguration IPv4 Address. . : 169.182.1.1 Subnet Mask . . . . . . . . . . . : 255.255.0.0 Default Gateway . . . . . . . . . :
Rögzítse a gazdarendszer IP-címét: ______________________________________
A rendszerindítási beállítások módosítása a hibakeresés engedélyezéséhez
Engedélyezze a kernel módú hibakeresést a célrendszeren az alábbi lépések végrehajtásával.
Fontos
Mielőtt a BCDEdit használatával módosíthatná a rendszerindítási adatokat, 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, engedélyezze újra ezeket a biztonsági funkciókat. A biztonsági funkciók letiltásakor megfelelően kezelje a tesztszámítógépet. 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.
Figyelmeztetés
A kapcsolat biztonságának növeléséhez és a véletlenszerű ügyfél hibakereső kapcsolatkéréseinek kockázatának csökkentéséhez használjon automatikusan generált véletlenszerű kulcsot. További információ: A KDNET hálózati kernel automatikus hibakeresésének beállítása.
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.
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 nem ez a helyzet, a legjobb megközelítés az, hogy a gazdagépen ugyanazt a "bitek számát" futtató eszközöket használjuk, amelyeket a célgép is futtat. 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.
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
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
- Í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
Adja meg ezt a parancsot annak ellenőrzéséhez, hogy a
dbgsettings
értékei megfelelően vannak-e beállítva:bcdedit /dbgsettings
key 2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p debugtype NET hostip 169.168.1.1 port 50000 dhcp Yes The operation completed successfully.
Jegyzet
Ha üzenetet kap a tűzfalról, és használni szeretné a hibakeresőt, jelölje ki mindhárom mezőt.
A gazdaszámítógépen nyisson meg egy parancssori ablakot rendszergazdaként. Ez a tesztkörnyezet a Windows-készlet telepítésének részeként telepített Windows Driver Kit (WDK) WinDbg.exe x64-es verzióját használja. Váltson az alapértelmezett WinDbg könyvtárra, az alapértelmezett hely alább látható.
cd C:\Program Files(x86)\Windows Kits\10\Debuggers\x64
Ez a tesztkörnyezet feltételezi, hogy mindkét számítógép a Windows 64 bites verzióját futtatja a célon és a gazdagépen egyaránt. Ha ez nem így van, a legjobb módszer az, ha ugyanolyan bitverziójú eszközöket futtat a gazdagépen, mint amilyen a céleszközön fut. 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ő eszközök kiválasztása.
Nyissa meg a WinDbg-et távoli felhasználói hibakereséssel az alábbi paranccsal. A kulcs és a port értékei megegyeznek a célszámítógépen a BCDEdit használatával korábban beállított értékekkel.
WinDbg –k net:port=50000,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
Indítsa újra a célrendszert.
Egy-két perc múlva a hibakeresési kimenetnek meg kell jelennie a gazdarendszerben.
Microsoft (R) Windows Debugger Version 10.0.17074.1002 AMD64 Copyright (c) Microsoft Corporation. All rights reserved. Using NET for debugging Opened WinSock 2.0 Waiting to reconnect... Connected to target 169.182.1.1 on port 50005 on local IP 169.182.1.2 You can get the target MAC address by running .kdtargetmac command. Connected to Windows 10 16299 x64 target at (Wed Feb 28 17:16:23.051 2018 (UTC - 8:00)), ptr64 TRUE Kernel Debugger connection established. (Initial Breakpoint requested) Symbol search path is: srv* Executable search path is: Windows 10 Kernel Version 16299 MP (4 procs) Free x64 Product: WinNt, suite: TerminalServer SingleUserTS Built by: 16299.15.amd64fre.rs3_release.170928-1534 Machine Name: Kernel base = 0xfffff800`9540d000 PsLoadedModuleList = 0xfffff800`95774110 Debug session time: Wed Feb 28 17:16:23.816 2018 (UTC - 8:00) System Uptime: 0 days 0:00:20.534
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. Adja meg a parancsokat a kisebb panelen, amely az ablak alján található parancsbejegyzési ablaktábla, és tekintse meg a parancs kimenetét az ablak tetején található nagyobb panelen.
A parancsbejegyzési panelen a Fel és a Le nyílbillentyűvel görgessen végig a parancselőzményeken. Amikor megjelenik egy parancs, szerkesztheti, vagy az Enter billentyűt lenyomva futtathatja a parancsot.
Kernel módú hibakeresési parancsok és technikák
Ebben a szakaszban hibakeresési parancsokkal jelenítheti meg a célrendszerre vonatkozó információkat.
Egyes hibakeresési parancsok szövegeket jelenítenek meg a Hibakereső korrektúranyelv (DML) használatával, amelyeket kiválasztva gyorsan gyűjthet további információkat.
A gazdarendszeren a Ctrl+Scroll Lock in WinDBg billentyűkombinációval törhet be a célrendszeren futó kódba. Eltarthat egy ideig, mire a célrendszer válaszol.
Í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
A hivatkozási parancs súgóját a
.hh
paranccsal érheti el. Adja meg 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.Ha részletes verzióinformációkat szeretne megjeleníteni a célrendszeren, írja be a vertarget (Célszámítógép verziójának megjelenítése) parancsot a WinDbg ablakban:
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
Annak ellenőrzéséhez, hogy a megfelelő kernelmódú folyamattal dolgozik-e, írja be a lm (List Loaded Modules) parancsot a WinDbg ablakban a betöltött modulok megjelenítéséhez:
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 ...
A kihagyott kimenet a következővel van megjelölve: "..." ebben a laborban.
Ha részletes információkat szeretne kérni egy adott modulról, használja a
v
(részletes) lehetőséget:0: Kd> lm v m tcpip Browse full module list start end module name fffff801`09eeb000 fffff801`0a157000 tcpip (no symbols) Loaded symbol image file: tcpip.sys Image path: \SystemRoot\System32\drivers\tcpip.sys Image name: tcpip.sys Browse all global symbols functions data Timestamp: Sun Nov 09 18:59:03 2014 (546029F7) CheckSum: 00263DB1 ImageSize: 0026C000 Translations: 0000.04b0 0000.04e4 0409.04b0 0409.04e4 Unable to enumerate user-mode unloaded modules, Win32 error 0n30
Nincs megadva szimbólumelérési út és nincsenek betöltött szimbólumok, ezért korlátozott információ érhető el a hibakeresőben.
A KMDF echo-illesztőprogram letöltése és létrehozása
Ebben a szakaszban töltse le és hozza létre a KMDF echo-illesztőprogramot.
Amikor WinDbg-et használ, általában a saját illesztőprogram-kódját dolgozza fel. A WinDbg-művelet megismeréséhez ez a tesztkörnyezet az "Echo" KMDF-sablon mintaillesztőt használja. A forráskód a WinDbg-ben megjelenő információk megértéséhez érhető el. Ez a minta azt is szemlélteti, hogyan lehet egy lépésben végigvezetni a natív kernel módú kódon. Ez a technika hasznos lehet összetett kernelmódú kódhibák hibakereséséhez.
Tekintse meg a visszhangmintát a GitHub.
Olvasson a mintáról.
Tallózd az összes Windows-illesztőmintát.
Az Echo-mintaillesztő letöltése és létrehozása:
Először töltse le és bontsa ki a KMDF Echo Sample a GitHubról.
A KMDF Echo-minta az általános mappában található.
Töltse le az illesztőprogram-mintákat egy zip-fájlban: Illesztőprogram-minták
Töltse le a zip-fájlt a helyi merevlemezre.
Jelölje ki és tartsa lenyomva a zip fájlt, vagy kattintson rá a jobb egérgombbal, majd válassza az Az összes kibontásalehetőséget. Adjon meg egy új mappát, vagy válassza ki tallózással a meglévőt a kinyert fájlok tárolására. Megadhat például új mappaként C:\DriverSamples\, ahová ki szeretné csomagolni a fájlokat.
A fájlok kinyerése után lépjen a következő almappába: C:\DriverSamples\general\echo\kmdf
A Microsoft Visual Studióban válassza a Fájl>>projekt/megoldás megnyitása... lehetőséget, és lépjen a kibontott fájlokat tartalmazó mappára, például C:\DriverSamples\general\echo\kmdf. A megnyitáshoz kattintson duplán a kmdfecho megoldásfájlra.
A Visual Studióban keresse meg a Megoldáskezelőt. Ha ez az ablak még nincs megnyitva, válassza Megoldáskezelő a Nézet menüből. A Megoldáskezelőben egy olyan megoldás látható, amelynek három projektje van.
Állítsa be a minta konfigurációját és platformját. A Megoldáskezelőben jelölje ki és tartsa lenyomva, vagy kattintson a jobb gombbal Megoldás "kmdfecho" (3 projekt), majd válassza Configuration Managerlehetőséget. Győződjön meg arról, hogy a konfiguráció és a platform beállításai megegyeznek a három projekt esetében. Alapértelmezés szerint a konfiguráció beállítása a Win10 Debug, a platform beállítása pedig a Win64 az összes projekthez. Ha egy projekthez bármilyen konfigurációt vagy platformmódosítást hajt végre, hajtsa végre ugyanazokat a módosításokat a többi három projekt esetében is.
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.
Állítsa be a futtatókörnyezeti kódtárat. Nyissa meg az echo-illesztőprogram tulajdonságlapját, és keresse meg C/C++>Kódgenerálás. Módosítsa a futtatókörnyezeti kódtárat többszálas hibakeresésre (/MTd). A buildelési lehetőségekről további információt a /MD, /MT és /LD (Run-Time könyvtár használata)című témakörben talál.
Az illesztőprogram tulajdonságai között győződjön meg arról, hogy a Illesztőprogram aláírás>Aláírás módTeszt aláírásvan beállítva.
A Visual Studióban válassza Build>Build Solutionlehetőséget.
A buildablakoknak egy üzenetnek kell megjelennie, amely jelzi, hogy mindhárom projekt buildje sikeres volt.
Borravaló
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.
A Fájlkezelőben nyissa meg azt a mappát, amely a minta kinyert fájljait tartalmazza. Például, lépjen be a következő útvonalat tartalmazó mappába: C:\DriverSamples\general\echo\kmdf, 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 változatlanul hagyta az alapértelmezett beállításokat, a rendszer a lefordított illesztőprogram-fájlokat egy \x64\Hibakeresési nevű mappába menti egy 64 bites hibakeresési buildhez.
Lépjen az Autosync-illesztőprogram beépített fájljait tartalmazó mappába: C:\DriverSamples\general\echo\kmdf\driver\AutoSync\x64\Debug.
A mappának tartalmaznia kell a következő fájlokat:
Fájl Leírás Echo.sys Az illesztőprogram-fájl. Echo.inf Az illesztőprogram telepítéséhez szükséges információkat tartalmazó információs (INF) fájl. Emellett a echoapp.exe fájl készült, és itt kell lennie: C:\DriverSamples\general\echo\kmdf\exe\x64\Debug.
Fájl Leírás EchoApp.exe Parancssori végrehajtható tesztfájl, amely kommunikál az echo.sys illesztőprogrammal. Keressen egy USB-meghajtót, vagy állítson be egy hálózati megosztást a kész illesztőprogram-fájlok és a teszt EchoApp gazdagépről a célrendszerbe történő másolásához.
A következő szakaszban másolja a kódot a célrendszerbe, majd telepítse és tesztelje az illesztőprogramot.
Telepítse a KMDF echo-illesztőprogram-mintát a célrendszerre
Ebben a szakaszban a DevCon eszközzel telepítse az echo mintaillesztőt.
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 a számítógép általában különbözik attól a számítógéptől, amelyen az illesztőprogram-csomagot fejleszti és létrehozza. 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.
Mielőtt üzembe helyez egy teszt-aláírt illesztőprogramot, készítse elő a célszámítógépet a tesztaláírás engedélyezésével. A DevCon eszközt a WDK-telepítésben is meg kell keresnie, és át kell másolnia a célrendszerbe.
Ha telepíteni szeretné az illesztőprogramot a célrendszerre, hajtsa végre az alábbi lépéseket.
Kapcsolja be a teszt üzemmódú aláírt illesztőprogramokat a célrendszeren:
Nyissa meg Windows-beállítások.
A Frissítés és biztonságterületen válassza a Recoverylehetőséget.
A Speciális rendszerindításterületen válassza a Újraindítás mostlehetőséget.
Amikor a számítógép újraindul, válassza Indítási beállításoklehetőséget. A Windows 11-ben válassza aSpeciális beállítások>hibaelhárítása>indítási beállítások, majd az Újraindítás lehetőséget.
Válassza a Illesztőprogram-aláírás érvényesítésének letiltása lehetőséget az F7 billentyű megnyomásával.
Indítsa újra a célszámítógépet.
A gazdarendszeren nyissa meg a WDK-telepítés Eszközök mappáját, és keresse meg a DevCon eszközt. Keresse meg például a következő mappát: C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe.
Hozzon létre egy mappát a célon a beépített illesztőprogram-csomaghoz, például C:\EchoDriver. Másolja devcon.exe a célrendszerbe. Keresse meg a .cer tanúsítványt a gazdarendszeren. A beépített illesztőprogram-fájlokat tartalmazó mappában található a gazdaszámítógép ugyanazon mappájában. Másolja ki az összes fájlt a gazdaszámítógépen korábban ismertetett beépített illesztőprogramból, és mentse azokat a célszámítógépen létrehozott mappába.
A célszámítógépen jelölje ki és tartsa lenyomva a tanúsítványfájlt, vagy kattintson a jobb gombbal a tanúsítványfájlra, majd válassza a Telepítéslehetőséget, majd kövesse az utasításokat a teszttanúsítvány telepítéséhez.
Ha részletesebb útmutatásra van szüksége a célszámítógép beállításához, olvassa el Számítógép előkészítése manuális illesztőprogram-üzembe helyezésicímű témakört.
Az alábbi utasítások bemutatják, hogyan telepítheti és tesztelheti a mintaillesztőt. Az illesztőprogram telepítéséhez használt devcon eszköz általános szintaxisa:
devcon install <INF file> <hardware ID>
Az illesztőprogram telepítéséhez szükséges INF-fájl echo.inf. Az inf fájl tartalmazza a echo.systelepítéséhez szükséges hardverazonosítót. Az "echo-minta" esetében a hardverazonosító a következő: root\ECHO.
A célszámítógépen nyisson meg egy parancssori ablakot rendszergazdaként. Lépjen az illesztőprogram-csomag mappájába, és írja be a következő parancsot:
devcon install echo.inf root\ECHO
Ha hibaüzenetet kap arról, hogy a devcon nem felismerhető, próbálja meg hozzáadni az elérési utat a devcon eszközhöz. Ha például egy C:\Toolsnevű mappába másolta, próbálkozzon a következő paranccsal:
c:\tools\devcon install echo.inf root\ECHO
Megjelenik egy párbeszédpanel, amely azt jelzi, hogy a tesztmeghajtó nem aláírt illesztőprogram. Válassza Az illesztőprogramot mégis telepíti a folytatáshoz.
Borravaló
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
A mintaillesztő sikeres telepítése után készen áll a tesztelésre.
A célszámítógép parancssori ablakában adja meg devmgmt az Eszközkezelő megnyitásához. Az Eszközkezelőben a Nézet menüben válassza Eszközök típus szerint lehetőséget. Az eszközfán keresse meg WDF-mintaillesztő a eszközminta csomópontban.
Az illesztőprogram működésének megerősítéséhez írja be a echoapp parancsot a teszt echoalkalmazás elindításához.
C:\Samples\KMDF_Echo_Sample> echoapp
DevicePath: \\?\root#sample#0005#{cdc35b6e-0be4-4936-bf5f-5537380a7c1a}
Opened device successfully
512 Pattern Bytes Written successfully
512 Pattern Bytes Read successfully
Pattern Verified successfully
30720 Pattern Bytes Written successfully
30720 Pattern Bytes Read successfully
Pattern Verified successfully
Az illesztőprogram adatainak megjelenítése a WinDbg használatával
Ebben a szakaszban állítsa be a szimbólum elérési útját, és használjon kernel hibakereső parancsokat a KMDF echo-mintaillesztővel kapcsolatos információk megjelenítéséhez.
A sofverinformációk megtekintéséhez:
A gazdarendszeren, ha bezárta a hibakeresőt, nyissa meg újra a következő paranccsal a rendszergazda parancssori ablakában.
WinDbg -k net:port=50000,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
A Ctrl+Break (Scroll Lock) billentyűkombinációval törhet be a célrendszeren futó kódba.
Ha a Microsoft szimbólumkiszolgálóhoz vezető szimbólumok elérési útját szeretné beállítani a WinDbg környezetben, használja a
.symfix
parancsot.0: kd> .symfix
Ha hozzá szeretné adni a helyi szimbólum helyét a helyi szimbólumok használatához, adja hozzá az elérési utat
.sympath+
, majd.reload /f
.0: kd> .sympath+ C:\DriverSamples\general\echo\kmdf 0: kd> .reload /f
A
.reload
parancs a/f
kényszerítési 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.
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, a szimbólumoktól függő funkciók használatakor olyan üzeneteket kap, amelyek jelzik, hogy a szimbólumok nem érhetők el.
0:000> dv
Unable to enumerate locals, HRESULT 0x80004005
Private symbols (symbols.pri) are required for locals.
Type “.hh dbgerr005” for details.
Számos módszer használható szimbólumok kezelésére. Számos esetben konfigurálhatja a számítógépet úgy, hogy a microsoft által biztosított szimbólumkiszolgálóról hozzáférjen a szimbólumokhoz, amikor szükség van rájuk. Ez a labor ezt a megközelítést használja. 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ó: Windows hibakeresőszimbólum elérési útja.
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ó létrehoz szimbólumfájlokat (.pdb fájlokat). Ezek a szimbólumfájlok azt mutatják meg 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és esetén 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 a következő összeállítási beállításokat:
set COMPILE_DEBUG=1
set ENABLE_OPTIMIZER=0
Adja meg a következő parancsot a hibakereső parancsterületén az echo-illesztőprogram információinak megjelenítéséhez:
0: kd> lm m echo* v Browse full module list start end module name fffff801`4ae80000 fffff801`4ae89000 ECHO (private pdb symbols) C:\Samples\KMDF_ECHO_SAMPLE\echo.pdb Loaded symbol image file: ECHO.sys Image path: \SystemRoot\system32\DRIVERS\ECHO.sys Image name: ECHO.sys ...
További információ: lm.
Mivel ezt a laborkészletet korábban
prefer_dml
-ra állították, a kimenet egyes elemei olyan élő hivatkozások, amelyeket kiválaszthat. Válassza a az összes globális szimbólum böngészése hivatkozást a hibakeresési kimenetben az "a" betűvel kezdődő elemek szimbólumaival kapcsolatos információk megjelenítéséhez.0: kd> x /D Echo!a*
A visszhangminta nem tartalmaz "a" betűvel kezdődő szimbólumokat, ezért írja be a
x ECHO!Echo*
, hogy megjelenítse az "Echo" betűvel kezdődő echo-illesztőprogramhoz társított összes szimbólum adatait.0: kd> x ECHO!Echo* fffff801`0bf95690 ECHO!EchoEvtIoQueueContextDestroy (void *) fffff801`0bf95000 ECHO!EchoEvtDeviceSelfManagedIoStart (struct WDFDEVICE__ *) fffff801`0bf95ac0 ECHO!EchoEvtTimerFunc (struct WDFTIMER__ *) fffff801`0bf9b120 ECHO!EchoEvtDeviceSelfManagedIoSuspend (struct WDFDEVICE__ *) ...
További információ: x (Szimbólumok vizsgálata).
A
!lmi
bővítmény részletes információkat jelenít meg egy modulról. Adja meg a!lmi echo
. A kimenetnek hasonlónak kell lennie a példában látható szöveghez:0: kd> !lmi echo Loaded Module Info: [echo] Module: ECHO Base Address: fffff8010bf94000 Image Name: ECHO.sys …
A
!dh
kiterjesztéssel megjelenítheti a fejlécadatokat az alábbi példában látható módon:0: kd> !dh echo File Type: EXECUTABLE IMAGE FILE HEADER VALUES 14C machine (i386) 6 number of sections 54AD8A42 time date stamp Wed Jan 07 11:34:26 2015 ...
Az alapértelmezett hibakeresési bitmaszk módosításához adja meg a következőket, hogy a célrendszer összes hibakeresési üzenete megjelenjen a hibakeresőben:
0: kd> ed nt!Kd_DEFAULT_MASK 0xFFFFFFFF
Egyes illesztőprogramok további információkat jelenítenek meg a 0xFFFFFFFF maszkjának használatakor. Állítsa a maszkot 0x00000000, ha csökkenteni szeretné a megjelenített információk mennyiségét.
0: kd> ed nt!Kd_DEFAULT_MASK 0x00000000
A
dd
paranccsal győződjön meg arról, hogy a maszk az összes hibakereső üzenet megjelenítésére van beállítva.0: kd> dd nt!kd_DEFAULT_MASK fffff802`bb4057c0 ffffffff 00000000 00000000 00000000 fffff802`bb4057d0 00000000 00000000 00000000 00000000 fffff802`bb4057e0 00000001 00000000 00000000 00000000 fffff802`bb4057f0 00000000 00000000 00000000 00000000 fffff802`bb405800 00000000 00000000 00000000 00000000 fffff802`bb405810 00000000 00000000 00000000 00000000 fffff802`bb405820 00000000 00000000 00000000 00000000 fffff802`bb405830 00000000 00000000 00000000 00000000
Plug and Play eszközfa adatainak megjelenítése
Ebben a szakaszban az echo-mintaeszköz illesztőprogramjáról és a Plug and Play eszközfájában található tartózkodási helyére vonatkozó információkat jelenítheti meg.
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 található az eszközfán, az eszközillesztő telepítésével kapcsolatos probléma merülhet fel.
További információ az eszközcsomópont hibakeresési bővítményéről: !devnode.
A gazdarendszeren a Plug and Play eszközfa összes eszközcsomópontjának megtekintéséhez írja be a
!devnode 0 1
parancsot.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… …
A Ctrl+F billentyűkombinációval keresse meg az eszközillesztő nevét a létrehozott kimenetben, echo.
Az echo-illesztőprogramot be kell tölteni. A
!devnode 0 1 echo
paranccsal megjelenítheti az echo-eszközillesztőhöz társított Plug and Play-információkat az alábbi példában látható módon:0: Kd> !devnode 0 1 echo Dumping IopRootDeviceNode (= 0xffffe0007b725d30) DevNode 0xffffe0007b71a630 for PDO 0xffffe0007b71a960 InstancePath is "ROOT\SAMPLE\0000" ServiceName is "ECHO" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) …
Az előző parancsban megjelenített kimenet tartalmazza az illesztőprogram futó példányához társított PDO-t, ebben a példában 0xffffe0007b71a960. Adja meg a
!devobj <PDO address>
parancsot az echo-eszközillesztőhöz társított Plug and Play-információk megjelenítéséhez. A számítógépén megjelenő!devnode
PDO címet használja, ne az itt láthatót.0: kd> !devobj 0xffffe0007b71a960 Device object (ffffe0007b71a960) is for: 0000000e \Driver\PnpManager DriverObject ffffe0007b727e60 Current Irp 00000000 RefCount 0 Type 00000004 Flags 00001040 Dacl ffffc102c9b36031 DevExt 00000000 DevObjExt ffffe0007b71aab0 DevNode ffffe0007b71a630 ExtensionFlags (0x00000800) DOE_DEFAULT_SD_PRESENT Characteristics (0x00000180) FILE_AUTOGENERATED_DEVICE_NAME, FILE_DEVICE_SECURE_OPEN AttachedDevice (Upper) ffffe000801fee20 \Driver\ECHO Device queue is not busy.
A
!devnode 0 1
parancsban megjelenített kimenet tartalmazza az illesztőprogramod futó példányához társított PDO-címet, ebben a példában ez 0xffffe0007b71a960. Adja meg a!devstack <PDO address>
parancsot az eszközillesztőhöz társított Plug and Play-információk megjelenítéséhez. A!devnode
által a számítógépén megjelenített PDO-címet használja, nem pedig az ebben a példában látható címet.0: kd> !devstack 0xffffe0007b71a960 !DevObj !DrvObj !DevExt ObjectName ffffe000801fee20 \Driver\ECHO ffffe0007f72eff0 > ffffe0007b71a960 \Driver\PnpManager 00000000 0000000e !DevNode ffffe0007b71a630 : DeviceInst is "ROOT\SAMPLE\0000" ServiceName is "ECHO"
A kimenet azt mutatja, hogy meglehetősen egyszerű eszközillesztővel rendelkezik. Az echo-illesztőprogram a PnPManager csomópont gyermeke. PnPManager egy gyökércsomópont.
\Driver\ECHO
\Driver\PnpManager
Ez az ábra egy összetettebb eszközcsomópontfát mutat be.
Az összetettebb illesztőprogram-veremekről további információt Illesztőprogram-veremek és Eszközcsomópontok és eszközveremekcímű témakörben talál.
Töréspontok és forráskód használata
Ebben a szakaszban állítsa be a töréspontokat, és egy lépésben halad végig a kernel módú forráskódon.
Ha valós időben szeretné ellenőrizni a változók értékeit, engedélyezze a töréspontokat, és állítsa be a forráskód elérési útját.
A töréspontok egy adott kódsoron leállítja a kódvégrehajtást. Lépjen tovább a kódban ettől a ponttól a kód adott szakaszának hibakereséséhez.
Ha hibakeresési paranccsal szeretne töréspontot beállítani, használja az alábbi b
parancsok egyikét.
Parancs | Leírás |
---|---|
bp |
Beállít egy aktív töréspontot, amíg a modul ki nem kerül a betöltésből. |
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 megfelelően használja bu vagy bp , és lehetővé teszi, hogy a helyettesítő karakterek (* ) segítségével töréspontokat állítson be minden olyan szimbólumra, amely megfelel, például az osztály összes metódusára. |
További információért lásd: A forráskód hibakeresése a WinDbgszoftverrel.
A gazdarendszeren a WinDbg felhasználói felületén győződjön meg arról, hogy Hibakeresési>Forrás mód engedélyezve van az aktuális WinDbg-munkamenetben.
Adja meg a következő parancsot a helyi kód helyének forrásútvonalhoz való hozzáadásához:
.srcpath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
Adja meg a következő parancsot a helyi szimbólum helyének a szimbólum elérési úthoz való hozzáadásához:
.sympath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
A
x
paranccsal vizsgálja meg az echo-illesztőhöz társított szimbólumokat a törésponthoz használandó függvénynév meghatározásához. ADeviceAdd
függvény nevét helyettesítő vagy Ctrl+F billentyűkombinációval is megkeresheti.0: kd> x ECHO!EchoEvt* 8b4c7490 ECHO!EchoEvtIoQueueContextDestroy (void *) 8b4c7000 ECHO!EchoEvtDeviceSelfManagedIoStart (struct WDFDEVICE__ *) 8b4c7820 ECHO!EchoEvtTimerFunc (struct WDFTIMER__ *) 8b4cb0e0 ECHO!EchoEvtDeviceSelfManagedIoSuspend (struct WDFDEVICE__ *) 8b4c75d0 ECHO!EchoEvtIoWrite (struct WDFQUEUE__ *, struct WDFREQUEST__ *, unsigned int) 8b4cb170 ECHO!EchoEvtDeviceAdd (struct WDFDRIVER__ *, struct …
A kimenet azt mutatja, hogy az echo-illesztőprogram
DeviceAdd
módszereECHO!EchoEvtDeviceAdd
.Másik lehetőségként tekintse át a forráskódot a töréspont függvénynevének megkereséséhez.
Állítsa be a töréspontot a
bm
paranccsal az illesztőprogram nevével, majd a függvény nevével, példáulAddDevice
, ahol be szeretné állítani a töréspontot, felkiáltójellel elválasztva. Ez a labor a(z)AddDevice
-t használja az illesztőprogram betöltésének figyelésére.0: kd> bm ECHO!EchoEvtDeviceAdd 1: fffff801`0bf9b1c0 @!"ECHO!EchoEvtDeviceAdd"
Különböző szintaxist használhat olyan változók beállításával együtt, mint a
<module>!<symbol>
,<class>::<method>
,'<file.cpp>:<line number>'
, vagy több alkalommal is kihagyhatja<condition> <#>
. További információ: WinDbg és más Windows hibakeresők feltételes töréspontjai.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`0bf9b1c0 0001 (0001) ECHO!EchoEvtDeviceAdd
Az itt megjelenített kimenetben az "e" azt jelzi, hogy az 1. számú töréspont engedélyezve van a működéshez.
Indítsa újra a kódvégrehajtást a célrendszeren a
g
(go) paranccsal.A célrendszeren, a Windows rendszerben nyissa meg a Device Manager-t az ikon használatával vagy a mmc devmgmt.mscbeírásával. Az Eszközkezelőben bontsa ki a Minták csomópontot.
Jelölje ki és tartsa lenyomva a KMDF echo driver bejegyzést, vagy kattintson rá jobb gombbal, majd válassza a Letiltás lehetőséget a menüből.
Jelölje ki és tartsa lenyomva, vagy kattintson a jobb gombbal a KMDF echoillesztő-bejegyzésre, majd válassza az engedélyezése lehetőséget a menüből.
A gazdarendszeren belül, amikor az illesztőprogram engedélyezve van, az AddDevice hibakeresési töréspontnak aktiválódnia kell. A célrendszer illesztőprogram-kódjának végrehajtása leáll. A töréspont elérésekor a végrehajtást le kell állítani az AddDevice rutin elején. A hibakeresési parancs kimenete
Breakpoint 1 hit
jelenik meg.Lépjen végig a kódsoron a
p
paranccsal, vagy nyomja le az F10 billentyűt, amíg el nem éri a AddDevice rutin következő végét. A zárójel karakter (}
) az ábrán látható módon ki van emelve.
A következő szakaszban vizsgálja meg a változók állapotát a DeviceAdd-kód végrehajtása után.
A meglévő töréspontok az alábbi parancsokkal módosíthatók:
Parancs | Leírás |
---|---|
bl |
A töréspontok listája. |
bc |
Törli a töréspontot a listából. Az bc * használatával törölje az összes töréspontot. |
bd |
Letilt egy töréspontot. Az bd * használatával tiltsa le az összes töréspontot. |
be |
Töréspont engedélyezése. Az összes töréspont engedélyezéséhez használja be * . |
A töréspontokat a WinDbg felhasználói felületén is módosíthatja.
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ása) parancsot a következő szintaxissal:
ba <access> <size> <address> {options}
Opció | 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 a címre olvas vagy ír |
w |
írás: amikor a CPU adatot ír a címre |
Egyszerre csak négy adattörési pontot állíthat be. Önön múlik, hogy megfelelően igazítja-e az adatokat a töréspont aktiválásához. A szavaknak 2-gyel osztható címekben, a dwords-nek 4-gyel, a quad szavaknak pedig 0-tal vagy 8-tal kell végződniük.
Ha például olvasási/írási töréspontot szeretne beállítani egy adott memóriacímre, használhat egy ilyen parancsot.
ba r 4 0x0003f7bf0
Az alábbi parancsokkal végiglépkedhet a kódon a zárójelekben látható rövid billentyűparancsokkal.
- Megszakítás (Ctrl+Break). Ez a parancs megszakítja a rendszert mindaddig, amíg a rendszer fut, és kommunikál a WinDbg-vel. A kernel hibakeresőjének sorrendje a Ctrl+C billentyűkombináció.
- Kurzorhoz futtatás (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 eljut erre a pontra. Ha a kódvégrehajtás folyamata nem éri el a kurzor által jelzett pontot, a WinDbg nem törne meg. Ez a helyzet akkor fordulhat elő, ha egy feltételes kifejezést nem hajtanak végre.
- Futtatás (F5). Futtassa addig, amíg töréspontot nem észlel, vagy hibaellenőrzéshez hasonló esemény nem történik.
- Lépjen át (F10). Ez a parancs azt eredményezi, hogy a kód végrehajtása lépésről lépésre halad, egyszerre egy utasítást vagy lépést hajtva végre. 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 be- vagy kikapcsolható Hibakeresés>Forrás módhasználatával.
- Belépés (F11). Ez a parancs olyan, mint a lépésenkénti végrehajtás, azzal a kivételrel, hogy a hívás végrehajtása a hívott rutinba kerül.
- Lépjen ki (Shift+F11). Ez a parancs azt eredményezi, hogy a végrehajtás elérje a hívásverem aktuális rutinját vagy helyét és onnan kilépjen. Ez a parancs akkor hasznos, ha már elég volt a rutinból.
További információért lásd: A forráskód hibakeresése a WinDbgszoftverrel.
Változók és hívásveremek megtekintése
Ebben a szakaszban megjelenítheti a változókkal és a hívásveremekkel kapcsolatos információkat.
Ez a labor feltételezi, hogy a korábban ismertetett eljárással megálltál az AddDevice rutinban. Az itt látható kimenet megtekintéséhez ismételje meg a korábban ismertetett lépéseket, ha szükséges.
A gazdarendszerben a változók megjelenítéséhez használja a nézetet>helyi menüpontot a helyi változók megjelenítéséhez.
A globális változócím helyének megkereséséhez írja be a ? <variable name>
.
- 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.
További információért lásd: Forráskód hibakeresése a klasszikus WinDbg az hibakeresési referenciadokumentációban.
8. szakasz: Változók és hívásveremek megtekintése
A 8. szakaszban a változókkal és a hívásveremekkel kapcsolatos információkat fogja megjeleníteni.
Ez a tesztkörnyezet feltételezi, hogy a korábban ismertetett eljárás során megállították az AddDevice rutinnál. A kimeneti megjelenítés itt való megtekintéséhez ismételje meg a korábban ismertetett lépéseket, ha szükséges.
<– A gazdarendszeren
Változók megjelenítése
A helyi változók megjelenítéséhez használja a nézet>menüpontját a helyi menüben.
globális változók
A globális változó címének helyét a beírásával találja meg? <változó neve>.
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.
Egy adott keret összes helyi változójának nevének és értékének megjelenítéséhez írja be a dv
parancsot:
0: kd> dv
Driver = 0x00001fff`7ff9c838
DeviceInit = 0xffffd001`51978190
status = 0n0
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.
Parancs | Leírás |
---|---|
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. |
A gazdarendszeren, ha elérhetővé szeretné tenni a hívásvermet, válassza nézetet>hívásverem megtekintéséhez. 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
kn
paranccsal megjelenítheti a hívásvermet a mintaadapter kódjának hibakeresése közben törésállapotban.3: kd> kn # Child-SP RetAddr Call Site 00 ffffd001`51978110 fffff801`0942f55b ECHO!EchoEvtDeviceAdd+0x66 [c:\Samples\kmdf echo sample\c++\driver\autosync\driver.c @ 138] 01 (Inline Function) --------`-------- Wdf01000!FxDriverDeviceAdd::Invoke+0x30 [d:\wbrtm\minkernel\wdf\framework\shared\inc\private\common\fxdrivercallbacks.hpp @ 61] 02 ffffd001`51978150 fffff801`eed8097d Wdf01000!FxDriver::AddDevice+0xab [d:\wbrtm\minkernel\wdf\framework\shared\core\km\fxdriverkm.cpp @ 72] 03 ffffd001`51978570 fffff801`ef129423 nt!PpvUtilCallAddDevice+0x35 [d:\9142\minkernel\ntos\io\pnpmgr\verifier.c @ 104] 04 ffffd001`519785b0 fffff801`ef0c4112 nt!PnpCallAddDevice+0x63 [d:\9142\minkernel\ntos\io\pnpmgr\enum.c @ 7397] 05 ffffd001`51978630 fffff801`ef0c344f nt!PipCallDriverAddDevice+0x6e2 [d:\9142\minkernel\ntos\io\pnpmgr\enum.c @ 3390] ...
A hívási verem azt mutatja, hogy a kernel (nt) belekódolt a Plug and Play kódba (PnP), amely aztán a meghajtó keretrendszer kódját (WDF) hívta meg, amely később az echo meghajtó DeviceAdd
függvényét hívta meg.
Folyamatok és szálak megjelenítése
Ebben a szakaszban a kernel módban futó folyamatokra és szálakra vonatkozó információkat jelenít meg.
Folyamatok
A folyamatinformációkat a !process hibakereső bővítmény használatával jelenítheti meg vagy állíthatja be. Állítson be egy töréspontot a hang lejátszásakor használt folyamat vizsgálatához.
A gazdarendszerben adja meg a
dv
parancsot aEchoEvtIo
rutinhoz társított területi változók vizsgálatához:0: kd> dv ECHO!EchoEvtIo* ECHO!EchoEvtIoQueueContextDestroy ECHO!EchoEvtIoWrite ECHO!EchoEvtIoRead
Törölje az előző töréspontokat a
bc *
használatával:0: kd> bc *
Állítson be egy szimbólumtörési pontot a
EchoEvtIo
rutinokra az alábbi paranccsal:0: kd> bm ECHO!EchoEvtIo* 2: aade5490 @!”ECHO!EchoEvtIoQueueContextDestroy” 3: aade55d0 @!”ECHO!EchoEvtIoWrite” 4: aade54c0 @!”ECHO!EchoEvtIoRead”
Sorolja fel a töréspontokat annak ellenőrzéséhez, hogy a töréspont megfelelően van-e beállítva:
0: kd> bl 1 e aabf0490 [c:\Samples\kmdf echo sample\c++\driver\autosync\queue.c @ 197] 0001 (0001) ECHO!EchoEvtIoQueueContextDestroy ...
Adja meg
g
a kódvégrehajtás újraindításához:0: kd> g
A célrendszeren futtassa a
EchoApp.exe
illesztőprogram-tesztprogramot.A gazdarendszeren a tesztalkalmazás futtatásakor a rendszer meghívja az illesztőprogram I/O-rutinját. Ez a hívás a töréspont kigyulladását okozza, és a célrendszer illesztőprogram-kódjának végrehajtása leáll.
Breakpoint 2 hit ECHO!EchoEvtIoWrite: fffff801`0bf95810 4c89442418 mov qword ptr [rsp+18h],r8
A
!process
paranccsal megjelenítheti a echoapp.exefuttatásához használt aktuális folyamatot:0: kd> !process PROCESS ffffe0007e6a7780 SessionId: 1 Cid: 03c4 Peb: 7ff7cfec4000 ParentCid: 0f34 DirBase: 1efd1b000 ObjectTable: ffffc001d77978c0 HandleCount: 34. Image: echoapp.exe VadRoot ffffe000802c79f0 Vads 30 Clone 0 Private 135. Modified 5. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001cf270050 ElapsedTime 00:00:00.052 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 33824 QuotaPoolUsage[NonPagedPool] 4464 Working Set Sizes (now,min,max) (682, 50, 345) (2728KB, 200KB, 1380KB) PeakWorkingSetSize 652 VirtualSize 16 Mb PeakVirtualSize 16 Mb PageFaultCount 688 MemoryPriority BACKGROUND BasePriority 8 CommitCharge 138 THREAD ffffe00080e32080 Cid 03c4.0ec0 Teb: 00007ff7cfece000 Win32Thread: 0000000000000000 RUNNING on processor 1
A kimenet azt mutatja, hogy a folyamat a echoapp.exe szálhoz van társítva, amely akkor futott, amikor az illesztőprogram írási eseményének töréspontját elérte. További információ: !process.
A
!process 0 0
az összes folyamat összesítő információinak megjelenítéséhez használható. A kimenetben a Ctrl+F billentyűkombinációval keresse meg a echoapp.exe képhez társított folyamat folyamatcímét. A példában a folyamat címeffffe0007e6a7780
.... PROCESS ffffe0007e6a7780 SessionId: 1 Cid: 0f68 Peb: 7ff7cfe7a000 ParentCid: 0f34 DirBase: 1f7fb9000 ObjectTable: ffffc001cec82780 HandleCount: 34. Image: echoapp.exe ...
Jegyezze fel a folyamatazonosítót, amely társul a ,echoapp.exe,-vel, hogy később felhasználhassa a laborban. A Ctrl+C billentyűkombinációval is másolhatja a címet a másolási pufferbe későbbi használatra.
_____________________________________________________(echoapp.exe folyamatcím)
A hibakeresőben szükség szerint adja meg
g
a kód továbbfuttatásához, amíg echoapp.exe nem fejeződik be. Többször eléri az olvasási és írási esemény töréspontját. Ha echoapp.exe befejeződik, lépjen be a hibakeresőbe a Ctrl+ScrLk (Ctrl+Break) billentyűkombináció lenyomásával.A
!process
paranccsal győződjön meg arról, hogy egy másik folyamatot futtat. Az itt látható kimenetben az Rendszer képértékével rendelkező folyamat eltér a Echo Kép értékétől.1: kd> !process PROCESS ffffe0007b65d900 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000 DirBase: 001ab000 ObjectTable: ffffc001c9a03000 HandleCount: 786. Image: System VadRoot ffffe0007ce45930 Vads 14 Clone 0 Private 22. Modified 131605. Locked 64. DeviceMap ffffc001c9a0c220 Token ffffc001c9a05530 ElapsedTime 21:31:02.516 ...
A kimenet azt mutatja, hogy az operációs rendszer leállításakor az ffffe0007b65d900 rendszerfolyamat futott.
Az
!process
parancs segítségével vizsgálja meg azokat a folyamatazonosítókat, amelyek korábban a echoapp.exe címkékkel voltak társítva, és amelyeket rögzített. Adja meg a korábban rögzített echoapp.exe folyamatcímet a példában látható példafolyamat-cím helyett.0: kd> !process ffffe0007e6a7780 TYPE mismatch for process object at 82a9acc0
A folyamatobjektum már nem érhető el, mert a echoapp.exe folyamat már nem fut.
Szálak
A szálak megtekintésére és beállítására szolgáló parancsok hasonlóak a folyamatok parancsaihoz. A szálak megtekintéséhez használja a !thread parancsot. Az aktuális szálak beállításához használja .thread.
A gazdarendszeren adja meg a "
g
" parancsot a hibakeresőben a kód futtatásának újraindításához a célrendszeren.A célrendszeren futtassa a EchoApp.exe illesztőprogram-tesztprogramot.
A gazdarendszerben a töréspontot eléri a rendszer, és a kódvégrehajtás leáll.
Breakpoint 4 hit ECHO!EchoEvtIoRead: aade54c0 55 push ebp
A futó szálak megtekintéséhez írja be !thread. Az alábbi példához hasonló információkat kell megjeleníteni:
0: kd> !thread THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0 IRP List: ffffe0007bc5be10: (0006,01f0) Flags: 00060a30 Mdl: 00000000 Not impersonating DeviceMap ffffc001d83c6e80 Owning Process ffffe0008096c900 Image: echoapp.exe ...
Jegyezze fel a echoapp.exeképnevét. Ez azt jelzi, hogy a tesztalkalmazáshoz társított szálat vizsgáljuk.
A
!process
paranccsal állapítsa meg, hogy ez a szál-e az egyetlen szál, amely fut az echoapp.exe-hoz társított folyamatban. A folyamatban lévő futó szál szálszáma ugyanaz, mint a!thread
parancs által megjelenített szál.0: kd> !process PROCESS ffffe0008096c900 SessionId: 1 Cid: 0b28 Peb: 7ff7d00df000 ParentCid: 0f34 DirBase: 1fb746000 ObjectTable: ffffc001db6b52c0 HandleCount: 34. Image: echoapp.exe VadRoot ffffe000800cf920 Vads 30 Clone 0 Private 135. Modified 8. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001cf5dc050 ElapsedTime 00:00:00.048 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 33824 QuotaPoolUsage[NonPagedPool] 4464 Working Set Sizes (now,min,max) (681, 50, 345) (2724KB, 200KB, 1380KB) PeakWorkingSetSize 651 VirtualSize 16 Mb PeakVirtualSize 16 Mb PageFaultCount 686 MemoryPriority BACKGROUND BasePriority 8 CommitCharge 138 THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0
A
!process 0 0
paranccsal keresse meg két kapcsolódó folyamat folyamatcímét, és jegyezze fel itt ezeket a folyamatcímeket.Cmd.exe: ____________________________________________________________
EchoApp.exe: _______________________________________________________
0: kd> !process 0 0 … PROCESS ffffe0007bbde900 SessionId: 1 Cid: 0f34 Peb: 7ff72dfa7000 ParentCid: 0c64 DirBase: 19c5fa000 ObjectTable: ffffc001d8c2f300 HandleCount: 31. Image: cmd.exe … PROCESS ffffe0008096c900 SessionId: 1 Cid: 0b28 Peb: 7ff7d00df000 ParentCid: 0f34 DirBase: 1fb746000 ObjectTable: ffffc001db6b52c0 HandleCount: 34. Image: echoapp.exe …
Alternatívaként használhatja a
!process 0 17
-t a folyamat részletes információinak megjelenítéséhez. A parancs kimenete hosszadalmas lehet. A kimenet a Ctrl+F billentyűkombinációval kereshető.A
!process
paranccsal listázhatja a számítógépet futtató mindkét folyamat folyamatadatait. Adja meg a folyamat címét a!process 0 0
kimenetéből, nem pedig az ebben a példában látható címből.Ez a példakimenet a korábban rögzített cmd.exe folyamatazonosítóra szolgál. A folyamatazonosító képének neve cmd.exe.
0: kd> !process ffffe0007bbde900 PROCESS ffffe0007bbde900 SessionId: 1 Cid: 0f34 Peb: 7ff72dfa7000 ParentCid: 0c64 DirBase: 19c5fa000 ObjectTable: ffffc001d8c2f300 HandleCount: 31. Image: cmd.exe VadRoot ffffe0007bb8e7b0 Vads 25 Clone 0 Private 117. Modified 20. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001d8c48050 ElapsedTime 21:33:05.840 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 24656 QuotaPoolUsage[NonPagedPool] 3184 Working Set Sizes (now,min,max) (261, 50, 345) (1044KB, 200KB, 1380KB) PeakWorkingSetSize 616 VirtualSize 2097164 Mb PeakVirtualSize 2097165 Mb PageFaultCount 823 MemoryPriority FOREGROUND BasePriority 8 CommitCharge 381 THREAD ffffe0007cf34880 Cid 0f34.0f1c Teb: 00007ff72dfae000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable ffffe0008096c900 ProcessObject Not impersonating ...
Ez a példakimenet a korábban rögzített echoapp.exe folyamatazonosítóra szolgál.
0: kd> !process ffffe0008096c900 PROCESS ffffe0008096c900 SessionId: 1 Cid: 0b28 Peb: 7ff7d00df000 ParentCid: 0f34 DirBase: 1fb746000 ObjectTable: ffffc001db6b52c0 HandleCount: 34. Image: echoapp.exe VadRoot ffffe000800cf920 Vads 30 Clone 0 Private 135. Modified 8. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001cf5dc050 ElapsedTime 00:00:00.048 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 33824 QuotaPoolUsage[NonPagedPool] 4464 Working Set Sizes (now,min,max) (681, 50, 345) (2724KB, 200KB, 1380KB) PeakWorkingSetSize 651 VirtualSize 16 Mb PeakVirtualSize 16 Mb PageFaultCount 686 MemoryPriority BACKGROUND BasePriority 8 CommitCharge 138 THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0 IRP List: ffffe0007bc5be10: (0006,01f0) Flags: 00060a30 Mdl: 00000000 Not impersonating ...
Jegyezze fel a két folyamathoz tartozó első szálcímeket itt.
Cmd.exe: ____________________________________________________
EchoApp.exe: _________________________________________________
A
!Thread
paranccsal megjelenítheti az aktuális szál adatait.0: kd> !Thread THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0 IRP List: ffffe0007bc5be10: (0006,01f0) Flags: 00060a30 Mdl: 00000000 Not impersonating DeviceMap ffffc001d83c6e80 Owning Process ffffe0008096c900 Image: echoapp.exe Attached Process N/A Image: N/A ...
A várakozásoknak megfelelően a jelenlegi szál az a szál, amelyik az echoapp.exe-hez van társítva, és futó állapotban van.
A
!Thread
paranccsal megjelenítheti az cmd.exe folyamathoz társított szál adatait. Adja meg a korábban rögzített szálcímet.0: kd> !Thread ffffe0007cf34880 THREAD ffffe0007cf34880 Cid 0f34.0f1c Teb: 00007ff72dfae000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable ffffe0008096c900 ProcessObject Not impersonating DeviceMap ffffc001d83c6e80 Owning Process ffffe0007bbde900 Image: cmd.exe Attached Process N/A Image: N/A Wait Start TickCount 4134621 Ticks: 0 Context Switch Count 4056 IdealProcessor: 0 UserTime 00:00:00.000 KernelTime 00:00:01.421 Win32 Start Address 0x00007ff72e9d6e20 Stack Init ffffd0015551dc90 Current ffffd0015551d760 Base ffffd0015551e000 Limit ffffd00155518000 Call 0 Priority 14 BasePriority 8 UnusualBoost 3 ForegroundBoost 2 IoPriority 2 PagePriority 5 Child-SP RetAddr : Args to Child : Call Site ffffd001`5551d7a0 fffff801`eed184fe : fffff801`eef81180 ffffe000`7cf34880 00000000`fffffffe 00000000`fffffffe : nt!KiSwapContext+0x76 [d:\9142\minkernel\ntos\ke\amd64\ctxswap.asm @ 109] ffffd001`5551d8e0 fffff801`eed17f79 : ffff03a5`ca56a3c8 000000de`b6a6e990 000000de`b6a6e990 00007ff7`d00df000 : nt!KiSwapThread+0x14e [d:\9142\minkernel\ntos\ke\thredsup.c @ 6347] ffffd001`5551d980 fffff801`eecea340 : ffffd001`5551da18 00000000`00000000 00000000`00000000 00000000`00000388 : nt!KiCommitThreadWait+0x129 [d:\9142\minkernel\ntos\ke\waitsup.c @ 619] ...
Ez a szál társítva van cmd.exe-vel, és várakozási állapotban van.
Adja meg a várakozó CMD.exe szál címét, hogy a környezetet az adott várakozó szálra módosítsa.
0: kd> .Thread ffffe0007cf34880 Implicit thread is now ffffe000`7cf34880
A
k
paranccsal megtekintheti a várakozási szálhoz társított hívásvermet.0: kd> k *** Stack trace for last set context - .thread/.cxr resets it # Child-SP RetAddr Call Site 00 ffffd001`5551d7a0 fffff801`eed184fe nt!KiSwapContext+0x76 [d:\9142\minkernel\ntos\ke\amd64\ctxswap.asm @ 109] 01 ffffd001`5551d8e0 fffff801`eed17f79 nt!KiSwapThread+0x14e [d:\9142\minkernel\ntos\ke\thredsup.c @ 6347] 02 ffffd001`5551d980 fffff801`eecea340 nt!KiCommitThreadWait+0x129 [d:\9142\minkernel\ntos\ke\waitsup.c @ 619] 03 ffffd001`5551da00 fffff801`ef02e642 nt!KeWaitForSingleObject+0x2c0 [d:\9142\minkernel\ntos\ke\wait.c @ 683] ...
Az olyan hívásveremelemek, mint például a
KiCommitThreadWait
azt jelzik, hogy ez a szál nem a várt módon fut.
További információ a szálakról és folyamatokról az alábbi hivatkozásokban található:
IRQL, regisztráció és a WinDbg-munkamenet befejezése
Ebben a szakaszban jelenítse meg a megszakításkérési szintet (IRQL) és a regiszterek tartalmát.
A mentett IRQL megtekintése
Az IRQL a megszakítási 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ási szintje alatti vagy azzal megegyező megszakítások le vannak tiltva, é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 gazdarendszeren a !irql bővítmény megjeleníti az IRQL-t a célszámítógép aktuális processzorán a hibakereső törése előtt. Amikor a célszámítógép belép a hibakeresési módba, az IRQL megváltozik, de az IRQL, amely a hibakeresési megszakítás előtt volt érvényes, a !irql
által kerül megjelenítésre.
0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)
A regiszterek megtekintése
A gazdarendszeren az aktuális processzor aktuális szálának regisztráinak tartalmát az r (Regisztrálások) paranccsal jelenítheti meg.
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. További információ: r (Regisztrálások).
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ó az assembly nyelv szétszereléséről: Jegyzetekkel ellátott x86 szétszerelés és Jegyzetekkel ellátott x64 szétszerelés.
A regiszter tartalmáról további információt x86 architektúra és x64 architektúracímű cikkben talál.
A WinDbg-munkamenet befejezése
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 WinDbg.
Windows hibakeresési erőforrások
További információ a Windows hibakereséséről. Néhány ilyen könyv a Windows korábbi verzióit, például a Windows Vista-t használja a példájukban, de a tárgyalt fogalmak a Windows legtöbb verziójára érvényesek.
Könyvek
- Speciális Windows-hibakeresés Mario Hewardt és Daniel Pravat által
- A Windowson belüli hibakeresés: Gyakorlati útmutató Tarik Soulami windowsos® hibakeresési és nyomkövetési stratégiáihoz
- Windows belső működése Pavel Yosifovich, Alex Ionescu, Mark Russinovich és David Solomon
Videó
Betanítási szállítók