Oktatás
Modul
Troubleshoot device driver failures - Training
This module focuses on the role of device drivers and troubleshooting problems that pertain to them.
Ezt a böngészőt már nem támogatjuk.
Frissítsen a Microsoft Edge-re, hogy kihasználhassa a legújabb funkciókat, a biztonsági frissítéseket és a technikai támogatást.
Ez a laboratórium bemutatja a WinDbg kernel hibakeresőt. A WinDbg használatával hibakeresést végezhet az echo kernel módú mintaillesztő-kódban.
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ő 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.
A laboratóriumi gyakorlat elvégzéséhez a következő hardverre van szüksége:
Labor elvégzéséhez a következő szoftverre van szüksége:
A labor a következő szakaszokból áll:
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 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 célrendszerben nyisson meg egy parancssori ablakot, és a ping
paranccsal erősítse meg a két rendszer közötti hálózati kapcsolatot.
ping 169.182.1.1
A mintakimenetben látható 169.182.1.1 helyett használja a gazdarendszer tényleges IP-címét.
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
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.
A célszámítógépen nyisson meg egy parancssori ablakot rendszergazdaként. A hibakeresés engedélyezéséhez adja meg ezt a parancsot:
bcdedit /set {default} DEBUG YES
Adja meg ezt a parancsot a tesztaláírás engedélyezéséhez:
bcdedit /set TESTSIGNING ON
Adja meg ezt a parancsot a gazdarendszer IP-címének beállításához. A korábban rögzített gazdarendszer IP-címét használja, nem pedig a megjelenítettt.
bcdedit /dbgsettings net hostip:192.168.1.1 port:50000 key:2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
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.
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.
Megjegyzés
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.
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.
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.
Olvassa el a mintáról.
Tallózás 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.
Tipp.
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. |
Keresse meg az USB-meghajtót, vagy állítson be egy hálózati megosztást a beépített illesztőprogram-fájlok és a teszt EchoApp a gazdagépről a célrendszerbe való másolásához.
A következő szakaszban másolja a kódot a célrendszerbe, majd telepítse és tesztelje az illesztőprogramot.
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. Windows 10 rendszerben válassza a Hibaelhárítás>Speciális beállítások>Indítási beállítások lehetőséget, majd válassza Újraindításlehető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.
Tipp.
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
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
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-eszközillesztőt 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.
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. A DeviceAdd
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ódszere ECHO!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ául AddDevice
, 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ésére, majd válassza 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 a címre ír |
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.
További információ: A forráskód hibakeresése a WinDbg-ben.
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>
.
További információért lásd: Forráskód hibakeresése a klasszikus WinDbg az hibakeresési referenciadokumentációban.
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.
Ebben a szakaszban a kernel módban futó folyamatokra és szálakra vonatkozó információkat jelenít meg.
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 a EchoEvtIo
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íme ffffe0007e6a7780
.
...
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.
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ási CMD.exe szál szálcímét a környezetnek az adott várakozási szálra való módosításához.
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ó:
Ebben a szakaszban jelenítse meg a megszakításkérési szintet (IRQL) és a regiszterek tartalmát.
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ásainál vagy alatt bekövetkező megszakítások maszkoltak, é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 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.
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.
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
Video
Betanítási szállítók
Oktatás
Modul
Troubleshoot device driver failures - Training
This module focuses on the role of device drivers and troubleshooting problems that pertain to them.
Dokumentáció
Get Started with WinDbg (Kernel-Mode) - Windows drivers
Learn how to set up and establish a WinDbg kernel-mode debugging session. The WinDbg kernel-mode debugger is included in Debugging Tools for Windows.
Debug Drivers - Step-by-Step Lab (Sysvad Kernel Mode) - Windows drivers
This lab provides hands-on exercises that demonstrate how to debug the Sysvad audio kernel-mode device driver.
Set Up KDNET Network Kernel Debugging Automatically - Windows drivers
Learn how to use KDNET to configure network kernel debugging automatically for the Windows debugging tools.