Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Ez a labor gyakorlati gyakorlatokat biztosít, amelyek bemutatják, hogyan lehet hibakeresést végezni a Sysvad audio kernel módú eszközillesztőjén.
A Microsoft Windows Hibakereső (WinDbg) egy hatékony Windows-alapú hibakeresési eszköz, amellyel felhasználói és kernel módú hibakeresést végezhet. A WinDbg forrásszintű hibakeresést biztosít a Windows-kernelhez, a kernelmódú illesztőprogramokhoz és a rendszerszolgáltatásokhoz, valamint a felhasználói módú alkalmazásokhoz és illesztőprogramokhoz.
A WinDbg végiglépkedhet a forráskódon, beállíthat töréspontokat, megtekintheti a változókat (beleértve a C++ objektumokat), a veremkövetéseket és a memóriát. A Hibakereső parancs ablaka lehetővé teszi, hogy a felhasználó számos parancsot adjon ki.
Tesztkörnyezet beállítása
A labor elvégzéséhez a következő hardverre lesz szüksége:
- Windows 10 rendszerű laptop vagy asztali számítógép (gazdagép)
- Windows 10 rendszerű laptop vagy asztali számítógép (cél)
- Hálózati központ/útválasztó és hálózati kábelek a két számítógép csatlakoztatásához
- Hozzáférés az internethez szimbólumfájlok letöltéséhez
A laborgyakorlat befejezéséhez a következő szoftverre lesz szüksége.
- Microsoft Visual Studio 2017
- Windows 10-hez készült Windows Software Development Kit (SDK)
- Windows Driver Kit (WDK) a Windows 10-hez
- A Minta Sysvad hangillesztő a Windows 10-hez
A WDK letöltéséről és telepítéséről további információt a A Windows Illesztőprogram-készlet (WDK)letöltése című témakörben talál.
A Sysvad hibakeresési útmutatója
Ez a labor végigvezeti a kernel módú illesztőprogramok hibakeresésének folyamatán. A gyakorlatok a Syvad virtuális hangillesztő mintáját használják. Mivel a Syvad hangillesztő nem kommunikál a tényleges hanghardverekkel, a legtöbb eszközön használható. A labor a következő feladatokat foglalja magában:
- 1. szakasz: Csatlakozás kernel módú WinDbg-munkamenethez
- 2. szakasz: kernel módú hibakeresési parancsok és technikák
- 3. szakasz: A Sysvad hangillesztő letöltése és létrehozása
- 4. szakasz: A Sysvad hangillesztő telepítése a célrendszerre
- 5. szakasz: Az illesztőprogram adatainak megjelenítése a WinDbg használatával
- 6. szakasz: A Plug and Play eszközfa adatainak megjelenítése
- 7. szakasz: Töréspontok és forráskód használata
- 8. szakasz: Változók keresése
- 9. szakasz: Hívásveremek megtekintése
- 10. szakasz: Folyamatok és szálak megjelenítése
- 11. szakasz: IRQL, regisztrálás és szétszerelés
- 12. szakasz: Memóriahasználat
- 13. szakasz: A WinDbg-munkamenet befejezése
- 14. szakasz: Windows hibakeresési erőforrások
Echo-illesztőprogram tesztkörnyezete
Az Echo illesztőprogram egyszerűbb illesztőprogram, mint a Sysvad hangillesztő. Ha még csak most ismerkedik a WinDbg szolgáltatással, érdemes lehet először elvégeznie az Univerzális illesztőprogramok hibakeresése – Részletes tesztkörnyezet (Echo kernel mód) elvégzését. Ez a tesztkörnyezet újra felhasználja a tesztkörnyezet beállítási irányait, így ha befejezte a tesztkörnyezetet, itt kihagyhatja az 1. és a 2. szakaszt.
1. szakasz: Csatlakozás kernel módú WinDbg-munkamenethez
Az 1. szakaszban konfigurálja a hálózati hibakeresést a gazdagépen és a célrendszeren.
A laborban lévő számítógépeket úgy kell konfigurálni, hogy Ethernet-hálózati kapcsolatot használjanak a kernel hibakereséséhez.
Ez a labor két számítógépet használ. A WinDbg a gazdarendszeren fut, a Sysvad-illesztőprogram pedig a célrendszeren fut.
A két számítógép csatlakoztatásához használjon hálózati központot/útválasztót és hálózati kábeleket.
A kernel módú alkalmazások használatához és a WinDbg használatához javasoljuk, hogy a KDNET-et Ethernet-átvitelen keresztül használja. Az Ethernet átviteli protokoll használatáról további információt a WinDbg (Kernel-Mode) használatának első lépéseit ismertető cikkben talál. A célszámítógép beállításával kapcsolatos további információkért lásd: Számítógép előkészítése manuális illesztőprogram-telepítéshez és A KDNET hálózati kernel hibakeresésének automatikus beállítása.
Kernel módú hibakeresés konfigurálása ethernet használatával
Ha engedélyezni szeretné a kernel módú hibakeresést a célrendszeren, hajtsa végre az alábbi lépéseket.
<– A gazdarendszeren
- Nyisson meg egy parancssort a gazdarendszeren, és írja be az ipconfig /all parancsot az IP-cím meghatározásához.
C:\>ipconfig /all
Windows IP Configuration
Host Name . . . . . . . . . . . . : TARGETPC
...
Ethernet adapter Ethernet:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::c8b6:db13:d1e8:b13b3
Autoconfiguration IPv4 Address. . : 169.182.1.1
Subnet Mask . . . . . . . . . . . : 255.255.0.0
Default Gateway . . . . . . . . . :
Rögzítse a gazdarendszer IP-címét: ______________________________________
Rögzítse a gazdarendszer állomásnevét: ______________________________________
-> A célrendszeren
- Nyisson meg egy parancssort a célrendszeren, és a ping paranccsal erősítse meg a két rendszer közötti hálózati kapcsolatot. A mintakimenetben látható 169.182.1.1 helyett használja a gazdarendszer tényleges IP-címét.
C:\> ping 169.182.1.1
Pinging 169.182.1.1 with 32 bytes of data:
Reply from 169.182.1.1: bytes=32 time=1ms TTL=255
Reply from 169.182.1.1: bytes=32 time<1ms TTL=255
Reply from 169.182.1.1: bytes=32 time<1ms TTL=255
Reply from 169.182.1.1: bytes=32 time<1ms TTL=255
Ping statistics for 169.182.1.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 1ms, Average = 0ms
Ha a KDNET segédprogrammal engedélyezni szeretné a kernel módú hibakeresést a célrendszeren, hajtsa végre az alábbi lépéseket.
A gazdarendszerben keresse meg a WDK KDNET könyvtárat. Alapértelmezés szerint itt található.
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
Ez a labor feltételezi, hogy mind a célgépen, mind a gazdagépen egyaránt 64 bites Windows verzió fut. Ha ez nem így van, a legjobb módszer az, ha a gazdagépen ugyanazt a "bitmélységű" eszközkészletet futtatjuk, mint amit a célpont is használ. Ha például a cél 32 bites Windowst futtat, futtassa a hibakereső 32 bites verzióját a gazdagépen. További információ : A 32 bites vagy a 64 bites hibakeresési eszközök kiválasztása.
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
Fontos
Mielőtt a BCDEdit használatával megváltoztatja a rendszerindítási információkat, előfordulhat, hogy ideiglenesen fel kell függesztenie a Windows biztonsági funkcióit, például a BitLockert és a biztonságos rendszerindítást a tesztszámítógépen. Ha a tesztelés befejeződött, és megfelelően kezeli a tesztszámítógépet, a biztonsági funkciók letiltásakor engedélyezze újra ezeket a biztonsági funkciókat. A biztonságos rendszerindítás általában le van tiltva az UEFI-ben. Az UEFI-beállítás eléréséhez használja a System, Recovery, Advanced start-up parancsot. Újraindításkor válassza a Hibaelhárítás, a Speciális beállítások és az UEFI belső vezérlőprogram beállításai lehetőséget. Óvatosan, mert az UEFI-beállítások helytelen beállítása vagy a BitLocker letiltása működésképtelené teheti a rendszert.
- Írja be ezt a parancsot annak ellenőrzéséhez, hogy a adatbázis-beállítások megfelelően vannak-e beállítva.
C:\> bcdedit /dbgsettings
busparams 0.25.0
key 2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
debugtype NET
hostip 169.182.1.1
port 50010
dhcp Yes
The operation completed successfully.
Másolja az automatikusan létrehozott egyedi kulcsot egy szövegfájlba, hogy ne kelljen begépelnie a gazdaszámítógépre. Másolja a szövegfájlt a kulccsal együtt a gazdarendszerbe.
Megjegyzés:Tűzfalak és hibakeresők
Ha egy előugró üzenetet kap a tűzfalról, és használni szeretné a hibakeresőt, jelölje be mindhárom jelölőnégyzetet.
<– A gazdarendszeren
- A gazdaszámítógépen nyisson meg egy parancssori ablakot rendszergazdaként. Váltson a WinDbg.exe könyvtárra. A Windows-készlet telepítésének részeként telepített Windows Driver Kitből (WDK) származó WinDbg.exe x64version-ját fogjuk használni.
C:\> Cd C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
- Indítsa el a WinDbg-t távoli felhasználó hibakeresésével az alábbi paranccsal. A kulcs és a port értéke megegyezik a cél BCDEdit használatával korábban beállított értékével.
C:\> WinDbg –k net:port=50010,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
->A célrendszeren
Indítsa újra a célrendszert.
<-A hosztrendszeren
Egy-két perc múlva a hibakeresési kimenetnek meg kell jelennie a gazdarendszerben.
A Hibakereső parancs ablaka a WinDbg elsődleges hibakeresési információs ablaka. Megadhatja a hibakereső parancsokat, és megtekintheti a parancs kimenetét ebben az ablakban.
A Hibakereső parancs ablaka két panelre van felosztva. A parancsokat az ablak alján található kisebb ablaktáblába (a parancsbejegyzési panelre) írja be, és az ablak tetején lévő nagyobb panelen tekintheti meg a parancs kimenetét.
A parancsbejegyzési panelen a felfelé és lefelé mutató nyílbillentyűkkel görgessen végig a parancselőzményeken. Amikor megjelenik egy parancs, szerkesztheti, vagy az ENTER billentyűt lenyomva futtathatja a parancsot.
2. szakasz: kernel módú hibakeresési parancsok és technikák
A 2. szakaszban hibakeresési parancsokkal jelenítheti meg a célrendszer adatait.
<– A gazdarendszeren
Hibakereső korrektúranyelv (DML) engedélyezése .prefer_dml
Egyes hibakeresési parancsok szövegeket jelenítenek meg a Hibakereső korrektúranyelv használatával, amelyet kiválasztva gyorsan gyűjthet további információkat.
- A WinDBg-ben a Ctrl+Break (Scroll Lock) billentyűkombinációval törhet be a célrendszeren futó kódba. A célrendszer válasza eltarthat egy kis ideig.
- Írja be a következő parancsot a DML engedélyezéséhez a Hibakereső parancs ablakában.
0: kd> .prefer_dml 1
DML versions of commands on by default
Segítségkérés a .hh használatával
A referenciaparancs súgóját a .hh paranccsal érheti el.
- Írja be a következő parancsot a .prefer_dml parancshivatkozási súgójának megtekintéséhez.
0: kd> .hh .prefer_dml
A hibakereső súgófájlja megjeleníti a .prefer_dml parancs súgóját.
A Windows verziójának megjelenítése a célrendszeren
- A célrendszer részletes verzióadatainak megjelenítéséhez írja be a vertarget (Célszámítógép verziójának megjelenítése) parancsot a WinDbg ablakba.
0: kd> vertarget
Windows 10 Kernel Version 9926 MP (4 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 9926.0.amd64fre.fbl_awesome1501.150119-1648
Machine Name: ""
Kernel base = 0xfffff801`8d283000 PsLoadedModuleList = 0xfffff801`8d58aef0
Debug session time: Fri Feb 20 10:15:17.807 2015 (UTC - 8:00)
System Uptime: 0 days 01:31:58.931
A betöltött modulok listázása
- A betöltött modulok megjelenítésével ellenőrizheti, hogy a megfelelő kernel módú folyamattal dolgozik-e. Ehhez írja be az lm (List Loaded Modules) parancsot a WinDbg ablakba.
0: Kd> lm
start end module name
fffff801`09200000 fffff801`0925f000 volmgrx (no symbols)
fffff801`09261000 fffff801`092de000 mcupdate_GenuineIntel (no symbols)
fffff801`092de000 fffff801`092ec000 werkernel (export symbols) werkernel.sys
fffff801`092ec000 fffff801`0934d000 CLFS (export symbols) CLFS.SYS
fffff801`0934d000 fffff801`0936f000 tm (export symbols) tm.sys
fffff801`0936f000 fffff801`09384000 PSHED (export symbols) PSHED.dll
fffff801`09384000 fffff801`0938e000 BOOTVID (export symbols) BOOTVID.dll
fffff801`0938e000 fffff801`093f7000 spaceport (no symbols)
fffff801`09400000 fffff801`094cf000 Wdf01000 (no symbols)
fffff801`094d9000 fffff801`09561000 CI (export symbols) CI.dll
...
Jegyzet A kihagyott kimenet a következővel van megjelölve: "... " ebben a laborban.
Mivel még nem állítottuk be a szimbólum elérési útját és a betöltött szimbólumokat, korlátozott információ érhető el a hibakeresőben.
3. szakasz: A Sysvad hangillesztő letöltése és létrehozása
A 3. szakaszban letölti és összeállítja a Sysvad hangillesztőt.
Amikor WinDbg-et használ, általában a saját illesztőprogram-kódját dolgozza fel. A hangillesztők hibakeresésének megismeréséhez a rendszer a Sysvad virtuális hangminta-illesztőprogramot használja. Ez a minta azt szemlélteti, hogyan lehet egy lépést végigvezetni a natív kernel módú kódon. Ez a technika nagyon hasznos lehet összetett kernel módú kódhibák hibakereséséhez.
A Sysvad-minta hangillesztő letöltéséhez és létrehozásához hajtsa végre az alábbi lépéseket.
A Sysvad hangmintájának letöltése és kinyerése a GitHubról
Böngészőben megtekintheti a Sysvad-mintát és Readme.md fájlt itt:
https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad
Ez a labor bemutatja, hogyan töltheti le az univerzális illesztőprogram-mintákat egy zip-fájlban.
a). Töltse le a master.zip fájlt a helyi merevlemezre.
https://github.com/Microsoft/Windows-driver-samples/archive/master.zip
b. Kattintson és tartsa nyomva a Windows-driver-samples-master.zip elemet (vagy kattintson rá a jobb gombbal), majd válassza az Az összes kibontása lehetőséget. Adjon meg egy új mappát, vagy keresse meg a kibontott fájlokat tároló meglévőt. Megadhatja például a C:\WDK_Samples\ értéket az új mappaként, amelybe a fájlokat kinyeri.
c) A fájlok kinyerése után lépjen a következő almappába.
C:\WDK_Samples\Sysvad
Az illesztőprogram-megoldás megnyitása a Visual Studióban
A Visual Studióban válassza a Fájl>megnyitása>projekt/megoldás lehetőséget, és keresse meg a kibontott fájlokat tartalmazó mappát (például C:\WDK_Samples\Sysvad). Kattintson duplán a Syvad-megoldásfájlra .
A Visual Studióban keresse meg a Megoldáskezelőt. (Ha még nincs megnyitva, válassza a Megoldáskezelőt a Nézet menüből.) A Megoldáskezelőben egy olyan megoldást láthat, amely több projektből áll.
A minta konfigurációjának és platformjának beállítása
A Megoldáskezelőben válassza ki és tartsa lenyomva (vagy kattintson a jobb gombbal) a "sysvad" megoldásra (7/7 projektből), és válassza a Configuration Manager lehetőséget. Győződjön meg arról, hogy a konfiguráció és a platform beállításai megegyeznek a négy projekt esetében. Alapértelmezés szerint a konfiguráció "Win10 Hibakeresés" értékre van állítva, a platform pedig "Win64" értékre van állítva az összes projekt esetében. Ha egy projekt konfigurációját és/vagy platformját módosítja, a fennmaradó három projekt esetében is ugyanazokat a módosításokat kell végrehajtania.
Jegyzet Ez a tesztkörnyezet feltételezi, hogy 64 bites Windows van használatban. Ha 32 bites Windowst használ, hozza létre az illesztőprogramot 32 bitesre.
Illesztőprogram aláírásának ellenőrzése
Keresse meg a TabletAudioSample fájlt. Nyissa meg a Sysvad-illesztőprogram tulajdonságlapját, és győződjön meg arról, hogy az illesztőprogram-aláírási>módtesztjelre van állítva.
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.
A minta létrehozása a Visual Studióval
A Visual Studióban válassza Build>Build Solutionlehetőséget.
A buildablakoknak egy üzenetnek kell megjelennie, amely jelzi, hogy mind a hat projekt buildje sikeres volt.
Jótanács
Ha buildelési hibaüzenetet tapasztal, a buildelési hibaszámmal állapítsa meg a javítást. Például MSBuild hiba MSB8040 leírja, hogyan lehet a Spectre elleni védelemmel rendelkező könyvtárakkal dolgozni.
A beépített illesztőprogram-fájlok megkeresése
A Fájlkezelőben keresse meg azt a mappát, amely a minta kinyert fájljait tartalmazza. Például a C:\WDK_Samples\Sysvad mappába navigálhat, ha ez a korábban megadott mappa. Ebben a mappában a lefordított illesztőprogram-fájlok helye a Configuration Managerben kiválasztott konfigurációs és platformbeállításoktól függően változik. Ha például változatlanul hagyta az alapértelmezett beállításokat, a rendszer a lefordított illesztőprogram-fájlokat egy \x64\Hibakeresés nevű mappába menti egy 64 bites hibakeresési buildhez.
Keresse meg a TabletAudioSample illesztőprogram beépített fájljait tartalmazó mappát:
C:\WDK_Samples\Sysvad\TabletAudioSample\x64\Debug. A mappa tartalmazza a TabletAudioSample .SYS illesztőprogramot, a szimbólum pdp-fájlt és az inf fájlt. Meg kell keresnie a DelayAPO, a KWSApo és a KeywordDetectorContosoAdapter DLL-fájlokat és szimbólumfájlokat is.
Az illesztőprogram telepítéséhez a következő fájlokra lesz szüksége.
Fájlnév Leírás TabletAudioSample.sys Az illesztőprogram-fájl. TabletAudioSample.pdb Az illesztőprogram szimbólumfájlja. tabletaudiosample.inf Az illesztőprogram telepítéséhez szükséges információkat tartalmazó információs (INF) fájl. KeywordDetectorContosoAdapter.dll Mintául szolgáló kulcsszódetektor. KeywordDetectorContosoAdapter.pdb A minta kulcsszóérzékelő szimbólumfájlja. DelayAPO.dll Minta késleltetési APO. DelayAPO.pdb A késleltetett APO szimbólumfájl. KWSApo.dll Egy mintapéldány kulcsszók kereső APO. KWSApo.pdb A kulcsszóválasztó szimbólumfájl. TabletAudioSample.cer A TabletAudioSample tanúsítványfájlja. Keresse meg az USB-meghajtót, vagy állítson be egy hálózati megosztást a beépített illesztőprogram-fájlok gazdagépről a célrendszerbe való másolásához.
A következő szakaszban átmásolja a kódot a célrendszerbe, majd telepíti és teszteli az illesztőprogramot.
4. szakasz: A Sysvad hangillesztő minta telepítése a célrendszerre
A 4. szakaszban a Devcon használatával telepítheti a Sysvad hangillesztőt.
-> A célrendszeren
Az a számítógép, amelyre az illesztőprogramot telepítik, a célszámítógép vagy a tesztszámítógépnéven ismert. Ez általában egy külön számítógép attól a számítógéptől, amelyen az illesztőprogram-csomagot fejleszti és hozza létre. Az a számítógép, ahol az illesztőprogramot fejleszti és építi, a gazdaszámítógépnéven ismert.
Az illesztőprogram-csomag célszámítógépre való áthelyezésének és az illesztőprogram telepítésének folyamatát az illesztőprogram üzembe helyezésének nevezzük.
Az illesztőprogram üzembe helyezése előtt elő kell készítenie a célszámítógépet a tesztaláírás bekapcsolásával. Ezután készen áll a beépített illesztőprogram-minta futtatására a célrendszeren.
Ha telepíteni szeretné az illesztőprogramot a célrendszerre, hajtsa végre az alábbi lépéseket.
Tesztelt aláírású illesztőprogramok engedélyezése
Az aláírt tesztillesztők futtatásának engedélyezése:
Nyissa meg a Windows-beállításokat.
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 a Hibaelhárítás lehetőséget.
Ezután válassza a Speciális beállítások, az Indítási beállítások , majd az Újraindítás lehetőséget.
Az F7 billentyű lenyomásával válassza az illesztőprogram-aláírás érvényesítésének letiltása lehetőséget.
A számítógép az új értékekkel kezdődik.
-> A célrendszeren
Az illesztőprogram telepítése
Az alábbi utasítások bemutatják, hogyan telepítheti és tesztelheti a mintaillesztőt.
Az illesztőprogram telepítéséhez szükséges INF-fájl a TabletAudioSample.inf. A célszámítógépen nyisson meg egy parancssori ablakot rendszergazdaként. Lépjen az illesztőprogram-csomag mappájába, kattintson a jobb gombbal a TabletAudioSample.inf fájlra, majd válassza a Telepítés lehetőséget.
Megjelenik egy párbeszédpanel, amely azt jelzi, hogy a tesztillesztő aláírás nélküli illesztőprogram. Válassza a Mégis telepítem ezt az illesztőprogramot a folytatáshoz.
Jótanács
Ha bármilyen probléma merül fel a telepítéssel kapcsolatban, további információt az alábbi fájlban talál.
%windir%\inf\setupapi.dev.logRészletesebb útmutatásért lásd: Számítógép konfigurálása illesztőprogram-telepítéshez, teszteléshez és hibakereséshez.
Az INF-fájl tartalmazza a tabletaudiosample.systelepítéséhez szükséges hardverazonosítót. A Syvad-minta hardverazonosítója a következő:
root\sysvad_TabletAudioSampleAz illesztőprogram vizsgálata az Eszközkezelőben
A célszámítógép parancssori ablakában adja meg devmgmt az Eszközkezelő megnyitásához. Az Eszközkezelő Nézet menüjében válassza az Eszközök típus szerint lehetőséget.
Az eszközfában keresse meg a virtuális hangeszközt (WDM) – Táblamintát a Hangeszköz csomópontban. Ez általában a Hang-, video- és játékvezérlők csomópont alatt található . Győződjön meg arról, hogy telepítve van és aktív.
Jelölje ki az illesztőprogramot a pc-n lévő tényleges hardverhez a Device Managerben. Ezután jelölje ki és tartsa lenyomva az illesztőprogramot (vagy kattintson rá a jobb gombbal), és válassza a letiltás lehetőséget az illesztőprogram letiltásához.
Ellenőrizze a Device Managerben, hogy a hanghardver-illesztőprogram egy lefelé mutató nyíllal jelzi, hogy le van tiltva.
A mintaillesztő sikeres telepítése után készen áll a tesztelésre.
A Sysvad hangillesztő tesztelése
A célszámítógép parancssori ablakában adja meg devmgmt az Eszközkezelő megnyitásához. Az Eszközkezelő Nézet menüjében válassza az Eszközök típus szerint lehetőséget. Az eszközfán keresse meg a virtuális hangeszközt (WDM) – Táblamintát.
Nyissa meg a Vezérlőpultot, és keresse meg a Hardver- és hangkezelési>hangeszközöket. A Hang párbeszédpanelen válassza a Virtuális hangeszköz (WDM) – Táblaminta feliratú hangszóró ikont, majd válassza az Alapértelmezett beállítás lehetőséget, de ne válassza az OK gombot. Ezzel nyitva marad a Hang párbeszédpanel.
Keresse meg az MP3 vagy más hangfájlt a célszámítógépen, és kattintson rá duplán a lejátszáshoz. Ezután a Hang párbeszédpanelen ellenőrizze, hogy van-e tevékenység a virtuális hangeszközhöz (WDM) – Táblagép mintaillesztőhöz társított hangerőjelzőben.
5. szakasz: Az illesztőprogram adatainak megjelenítése a WinDbg használatával
Az 5. szakaszban beállítja a szimbólum elérési útját, és kernel hibakereső parancsokkal jeleníti meg a Sysvad-mintaillesztő adatait.
A szimbólumok lehetővé teszik, hogy a WinDbg további információkat, például változóneveket jelenítsen meg, amelyek hibakereséskor felbecsülhetetlen értékűek lehetnek. A WinDbg a Microsoft Visual Studio hibakeresési szimbólumformátumát használja a forrásszintű hibakereséshez. Bármilyen szimbólumhoz vagy változóhoz hozzáférhet egy OLYAN modulból, amely PDB-szimbólumfájlokat tartalmaz.
A hibakereső betöltéséhez hajtsa végre a következő lépéseket.
<-A hosztrendszeren
Ha bezárta a hibakeresőt, nyissa meg újra a következő paranccsal a rendszergazda parancssori ablakában. Cserélje le a kulcsot és a portot a korábban konfiguráltra.
C:\> WinDbg –k net:port=50010,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874pA Ctrl+Break (Scroll Lock) billentyűkombinációval törhet be a célrendszeren futó kódba.
A szimbólum elérési útjának beállítása
A . symfix paranccsal állíthatja be a Szimbólumok elérési útját a Microsoft szimbólumkiszolgálójához a WinDbg környezetben.
0: kd> .symfixHa a helyi szimbólumok használatához szeretné hozzáadni a helyi szimbólum helyét, adja hozzá az elérési utat a .sympath+ paranccsal, majd futtassa az .reload /f parancsot.
0: kd> .sympath+ C:\WDK_Samples\Sysvad 0: kd> .reload /fJegyzet A .reload parancs a /f force beállítással törli a megadott modul összes szimbóluminformációit, és újra betölti a szimbólumokat. Bizonyos esetekben ez a parancs újra betölti vagy kiüríti magát a modult.
Jegyzet A WinDbg által biztosított speciális funkciók használatához be kell töltenie a megfelelő szimbólumokat. Ha nincsenek megfelelően konfigurálva a szimbólumok, üzeneteket fog kapni, amelyek jelzik, hogy a szimbólumok nem érhetők el, amikor szimbólumoktól függő funkciókat próbál használni.
0:000> dv
Unable to enumerate locals, HRESULT 0x80004005
Private symbols (symbols.pri) are required for locals.
Type “.hh dbgerr005” for details.
MegjegyzésSzimbólumkiszolgálók
A szimbólumok használatához számos megközelítés használható. A számítógép számos esetben konfigurálható úgy, hogy a szimbólumokat a Microsoft által biztosított szimbólumkiszolgálóról érje el, amikor szükség van rájuk. Ez az útmutató feltételezi, hogy ezt a megközelítést fogja használni. Ha a környezet szimbólumai más helyen találhatók, módosítsa a hely használatának lépéseit. További információ: Szimbólum elérési útja a Windows hibakeresőhöz.
Megjegyzés: A forráskód szimbólumkövetelményei
A forráskeresés végrehajtásához létre kell készítenie a bináris fájlok ellenőrzött (hibakeresési) verzióját. A fordító szimbólumfájlokat (.pdb fájlokat) hoz létre. Ezek a szimbólumfájlok megjelenítik a hibakeresőnek, hogy a bináris utasítások hogyan felelnek meg a forrásvonalaknak. Maguknak a tényleges forrásfájloknak is elérhetőnek kell lenniük a hibakereső számára.
A szimbólumfájlok nem tartalmazzák a forráskód szövegét. Hibakereséshez a legjobb, ha a linker nem optimalizálja a kódot. A forráskeresés és a helyi változókhoz való hozzáférés nehezebb, és néha szinte lehetetlen, ha a kód optimalizálva lett. Ha problémái vannak a helyi változók vagy forrásvonalak megtekintésével, adja meg az alábbi összeállítási beállításokat.
Állítsa be a COMPILE_DEBUG=1 értéket
Állítsa be ENABLE_OPTIMIZER=0 értékre
Írja be a következőt a hibakereső parancsterületére a Sysvad-illesztőprogramra vonatkozó információk megjelenítéséhez.
0: kd> lm m tabletaudiosample v Browse full module list start end module name fffff801`14b40000 fffff801`14b86000 tabletaudiosample (private pdb symbols) C:\Debuggers\sym\TabletAudioSample.pdb\E992C4803EBE48C7B23DC1596495CE181\TabletAudioSample.pdb Loaded symbol image file: tabletaudiosample.sys Image path: \SystemRoot\system32\drivers\tabletaudiosample.sys Image name: tabletaudiosample.sys Browse all global symbols functions data Timestamp: Thu Dec 10 12:20:26 2015 (5669DE8A) CheckSum: 0004891E ...További információ: lm.
A hibakeresési kimenetben válassza a Tallózás az összes globális szimbólum között hivatkozást az a betűvel kezdődő elemek szimbólumaival kapcsolatos információk megjelenítéséhez.
Mivel a DML engedélyezve van, a kimenet egyes elemei választható gyakori elérésű hivatkozások. Válassza ki a hibakeresési kimenet adathivatkozását az a betűvel kezdődő elemek szimbólumaival kapcsolatos információk megjelenítéséhez.
0: kd> x /D /f tabletaudiosample!a* A B C D E F G H I J K L M N O P Q R S T U V W X Y Z fffff806`9adb1000 tabletaudiosample!AddDevice (struct _DRIVER_OBJECT *, struct _DEVICE_OBJECT *)További információ: x (Szimbólumok vizsgálata).
A !lmi bővítmény részletes információkat jelenít meg egy modulról. Írja be a !lmi tabletaudiosample parancsot. A kimenetnek az alábbihoz hasonlónak kell lennie.
0: kd> !lmi tabletaudiosample Loaded Module Info: [tabletaudiosample] Module: tabletaudiosample Base Address: fffff8069ad90000 Image Name: tabletaudiosample.sys Machine Type: 34404 (X64) Time Stamp: 58ebe848 Mon Apr 10 13:17:12 2017 Size: 48000 CheckSum: 42df7 Characteristics: 22 Debug Data Dirs: Type Size VA Pointer CODEVIEW a7, e5f4, d1f4 RSDS - GUID: {5395F0C5-AE50-4C56-AD31-DD5473BD318F} Age: 1, Pdb: C:\Windows-driver-samples-master\audio\sysvad\TabletAudioSample\x64\Debug\TabletAudioSample.pdb ?? 250, e69c, d29c [Data not mapped] Image Type: MEMORY - Image read successfully from loaded memory. Symbol Type: PDB - Symbols loaded successfully from image header. C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\TabletAudioSample.pdb\5395F0C5AE504C56AD31DD5473BD318F1\TabletAudioSample.pdb Compiler: Resource - front end [0.0 bld 0] - back end [14.0 bld 24210] Load Report: private symbols & lines, not source indexed C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\TabletAudioSample.pdb\5395F0C5AE504C56AD31DD5473BD318F1\TabletAudioSample.pdbA !dh kiterjesztéssel az alábbi módon jelenítheti meg a fejlécadatokat.
0: kd> !dh tabletaudiosample File Type: EXECUTABLE IMAGE FILE HEADER VALUES 8664 machine (X64) 9 number of sections 5669DE8A time date stamp Thu Dec 10 12:20:26 2015 0 file pointer to symbol table 0 number of symbols F0 size of optional header 22 characteristics Executable App can handle >2gb addresses ...
6. szakasz: A Plug and Play eszközfa adatainak megjelenítése
A 6. szakaszban információkat jelenít meg a Sysvad-mintaeszköz-illesztőprogramról, valamint arról, hogy hol található a Plug and Play eszközfa.
A Plug and Play eszközfában található eszközillesztővel kapcsolatos információk hasznosak lehetnek a hibaelhárításhoz. Ha például egy eszközillesztő nem az eszközfán található, az eszközillesztő telepítésével kapcsolatos probléma léphet fel.
További információ az eszközcsomópont hibakeresési bővítményéről: !devnode.
<-A hosztrendszeren
A Plug and Play eszközfa összes eszközcsomópontjának megtekintéséhez írja be a !devnode 0 1 parancsot. A parancs futtatása eltarthat egy-két percig. Ez idő alatt a "*Foglalt" a WinDbg állapotterületén jelenik meg.
0: kd> !devnode 0 1 Dumping IopRootDeviceNode (= 0xffffe0005a3a8d30) DevNode 0xffffe0005a3a8d30 for PDO 0xffffe0005a3a9e50 InstancePath is "HTREE\ROOT\0" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffffe0005a3a3d30 for PDO 0xffffe0005a3a4e50 InstancePath is "ROOT\volmgr\0000" ServiceName is "volmgr" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffffe0005a324560 for PDO 0xffffe0005bd95ca0… ...A Ctrl+F billentyűkombinációval keresse meg az eszközillesztő ( sysvad) nevét a létrehozott kimenetben.
A Syvad !devnode kimenetében megjelenik egy eszközcsomópont-bejegyzés, amelynek neve
sysvad_TabletAudioSampleszerepel.DevNode 0xffffe00086e68190 for PDO 0xffffe00089c575a0 InstancePath is "ROOT\sysvad_TabletAudioSample\0000" ServiceName is "sysvad_tabletaudiosample" State = DeviceNodeStarted (0x308) ...Vegye figyelembe, hogy megjelenik az OEM-cím és a DevNode-cím.
A parancs használatával megjelenítheti a
!devnode 0 1 sysvad_TabletAudioSampleSysvad-eszközillesztőhöz társított Plug and Play-információkat.0: kd> !devnode 0 1 sysvad_TabletAudioSample Dumping IopRootDeviceNode (= 0xffffe00082df8d30) DevNode 0xffffe00086e68190 for PDO 0xffffe00089c575a0 InstancePath is "ROOT\sysvad_TabletAudioSample\0000" ServiceName is "sysvad_tabletaudiosample" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffffe000897fb650 for PDO 0xffffe00089927e30 InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{64097438-cdc0-4007-a19e-62e789062e20}" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeStartPostWork (0x307) DevNode 0xffffe00086d2f5f0 for PDO 0xffffe00089939ae0 InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{78880f4e-9571-44a4-a9df-960bde446487}" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeStartPostWork (0x307) DevNode 0xffffe00089759bb0 for PDO 0xffffe000875aa060 InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{7cad07f2-d0a0-4b9b-8100-8dc735e9c447}" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeStartPostWork (0x307) DevNode 0xffffe00087735010 for PDO 0xffffe000872068c0 InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{fc38551b-e69f-4b86-9661-ae6da78bc3c6}" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeStartPostWork (0x307) DevNode 0xffffe00088457670 for PDO 0xffffe0008562b830 InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{0894b831-c9fe-4c56-86a6-092380fc5628}" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeStartPostWork (0x307) DevNode 0xffffe000893dbb70 for PDO 0xffffe00089d68060 InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{15eb6b5c-aa54-47b8-959a-0cff2c1500db}" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeStartPostWork (0x307) DevNode 0xffffe00088e6f250 for PDO 0xffffe00089f6e990 InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{778c07f0-af9f-43f2-8b8d-490024f87239}" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeStartPostWork (0x307) DevNode 0xffffe000862eb4b0 for PDO 0xffffe000884443a0 InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{e4b72c7c-be50-45df-94f5-0f2922b85983}" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeStartPostWork (0x307)Az előző parancsban megjelenített kimenet tartalmazza az illesztőprogram futó példányához társított oem-et, ebben a példában ez 0xffffe00089c575a0. Adja meg a !devobj<PDO cím parancsot> a Sysvad-eszközillesztőhöz társított Plug and Play-információk megjelenítéséhez. Használja a pc-n a !devnode által megjelenített oem-címet, és ne az itt látható címet.
0: kd> !devobj 0xffffe00089c575a0 Device object (ffffe00089c575a0) is for: 0000004e \Driver\PnpManager DriverObject ffffe00082d47e60 Current Irp 00000000 RefCount 65 Type 0000001d Flags 00001040 SecurityDescriptor ffffc102b0f6d171 DevExt 00000000 DevObjExt ffffe00089c576f0 DevNode ffffe00086e68190 ExtensionFlags (0000000000) Characteristics (0x00000180) FILE_AUTOGENERATED_DEVICE_NAME, FILE_DEVICE_SECURE_OPEN AttachedDevice (Upper) ffffe00088386a50 \Driver\sysvad_tabletaudiosample Device queue is not busy.A !devobj parancsban megjelenített kimenet tartalmazza a csatlakoztatott eszköz nevét: \Driver\sysvad_tabletaudiosample. A !drvobj paranccsal 2 bites maszkkal jelenítheti meg a csatlakoztatott eszközhöz társított információkat.
0: kd> !drvobj \Driver\sysvad_tabletaudiosample 2 Driver object (ffffe0008834f670) is for: \Driver\sysvad_tabletaudiosample DriverEntry: fffff80114b45310 tabletaudiosample!FxDriverEntry DriverStartIo: 00000000 DriverUnload: fffff80114b5fea0 tabletaudiosample!DriverUnload AddDevice: fffff80114b5f000 tabletaudiosample!AddDevice Dispatch routines: [00] IRP_MJ_CREATE fffff80117b49a20 portcls!DispatchCreate [01] IRP_MJ_CREATE_NAMED_PIPE fffff8015a949a00 nt!IopInvalidDeviceRequest [02] IRP_MJ_CLOSE fffff80115e26f90 ks!DispatchCleanup [03] IRP_MJ_READ fffff80115e32710 ks!DispatchRead [04] IRP_MJ_WRITE fffff80115e327e0 ks!DispatchWrite [05] IRP_MJ_QUERY_INFORMATION fffff8015a949a00 nt!IopInvalidDeviceRequest [06] IRP_MJ_SET_INFORMATION fffff8015a949a00 nt!IopInvalidDeviceRequest [07] IRP_MJ_QUERY_EA fffff8015a949a00 nt!IopInvalidDeviceRequest [08] IRP_MJ_SET_EA fffff8015a949a00 nt!IopInvalidDeviceRequest [09] IRP_MJ_FLUSH_BUFFERS fffff80115e32640 ks!DispatchFlush [0a] IRP_MJ_QUERY_VOLUME_INFORMATION fffff8015a949a00 nt!IopInvalidDeviceRequest [0b] IRP_MJ_SET_VOLUME_INFORMATION fffff8015a949a00 nt!IopInvalidDeviceRequest [0c] IRP_MJ_DIRECTORY_CONTROL fffff8015a949a00 nt!IopInvalidDeviceRequest [0d] IRP_MJ_FILE_SYSTEM_CONTROL fffff8015a949a00 nt!IopInvalidDeviceRequest [0e] IRP_MJ_DEVICE_CONTROL fffff80115e27480 ks!DispatchDeviceIoControl [0f] IRP_MJ_INTERNAL_DEVICE_CONTROL fffff8015a949a00 nt!IopInvalidDeviceRequest [10] IRP_MJ_SHUTDOWN fffff8015a949a00 nt!IopInvalidDeviceRequest [11] IRP_MJ_LOCK_CONTROL fffff8015a949a00 nt!IopInvalidDeviceRequest [12] IRP_MJ_CLEANUP fffff8015a949a00 nt!IopInvalidDeviceRequest [13] IRP_MJ_CREATE_MAILSLOT fffff8015a949a00 nt!IopInvalidDeviceRequest [14] IRP_MJ_QUERY_SECURITY fffff80115e326a0 ks!DispatchQuerySecurity [15] IRP_MJ_SET_SECURITY fffff80115e32770 ks!DispatchSetSecurity [16] IRP_MJ_POWER fffff80117b3dce0 portcls!DispatchPower [17] IRP_MJ_SYSTEM_CONTROL fffff80117b13d30 portcls!PcWmiSystemControl [18] IRP_MJ_DEVICE_CHANGE fffff8015a949a00 nt!IopInvalidDeviceRequest [19] IRP_MJ_QUERY_QUOTA fffff8015a949a00 nt!IopInvalidDeviceRequest [1a] IRP_MJ_SET_QUOTA fffff8015a949a00 nt!IopInvalidDeviceRequest [1b] IRP_MJ_PNP fffff80114b5f7d0 tabletaudiosample!PnpHandlerAdja meg a !devstack<PDO-címet> az eszközillesztőhöz kapcsolódó Plug and Play információk megjelenítéséhez. A !devnode 0 1 parancsban megjelenített kimenet tartalmazza az illesztőprogram futó példányához társított oem-címet. Ebben a példában ez 0xffffe00089c575a0. Használja a !devnode által a PC-jén megjelenített PDO-címet, ne az alább láthatót.
0: kd> !devstack 0xffffe00089c575a0 !DevObj !DrvObj !DevExt ObjectName ffffe00088d212e0 \Driver\ksthunk ffffe00088d21430 0000007b ffffe00088386a50 \Driver\sysvad_tabletaudiosampleffffe00088386ba0 0000007a > ffffe00089c575a0 \Driver\PnpManager 00000000 0000004e !DevNode ffffe00086e68190 : DeviceInst is "ROOT\sysvad_TabletAudioSample\0000" ServiceName is "sysvad_tabletaudiosample"
A kimenet azt mutatja, hogy egy nagyon egyszerű eszközillesztő-vermet használunk. A sysvad_TabletAudioSample illesztőprogram a PnPManager csomópont gyermeke. A PnPManager egy gyökércsomópont.
Ez az ábra egy összetettebb eszközcsomópontfát mutat be.
Jegyzet Az összetettebb illesztőprogram-veremekkel kapcsolatos további információkért lásd: Illesztőprogram-veremek , eszközcsomópontok és eszközveremek.
7. szakasz: Töréspontok használata
A 7. szakaszban töréspontokkal fogja leállítani a kódvégrehajtást adott pontokon.
Töréspontok beállítása parancsokkal
A töréspontok a kódvégrehajtás egy adott kódsoron történő leállítására szolgálnak. Ezután továbbléphet a kódban attól a ponttól kezdve, hogy hibakeresést végezzen a kód adott szakaszában.
Ha hibakeresési paranccsal szeretne töréspontot beállítani, használja az alábbi b parancsok egyikét.
Bp |
Beállít egy töréspontot, amely addig aktív marad, amíg a modul betöltését meg nem szüntetik. |
Bu |
Beállít egy feloldatlan töréspontot, amikor a modul ki van töltve, és újra engedélyezi a modul újratöltését. |
Bm |
Töréspontot állít be egy szimbólumhoz. Ez a parancs a bu vagy a bp megfelelő használatát teszi lehetővé, és lehetővé teszi a helyettesítő karakterek * használatát az összes egyező szimbólum töréspontjainak beállításához (például az osztály összes metódusához). |
A WinDbg felhasználói felületén ellenőrizze, hogy a hibakeresési>forrás mód engedélyezve van-e az aktuális WinDbg-munkamenetben.
Adja hozzá a helyi kód helyét a forrásútvonalhoz az alábbi parancs beírásával.
.sympath+ C:\WDK_Samples\SysvadAdja hozzá a helyi szimbólum helyét a szimbólum elérési útjához az alábbi parancs beírásával.
.sympath+ C:\WDK_Samples\SysvadA hibakeresési maszk beállítása
Mivel egy illesztőprogrammal dolgozik, hasznos lehet látni az összes üzenetet, amelyet megjeleníthet. Írja be a következőt az alapértelmezett hibakeresési bitmaszk módosításához, hogy a célrendszer összes hibakeresési üzenete megjelenjen a hibakeresőben.
0: kd> ed nt!Kd_DEFAULT_MASK 0xFFFFFFFFÁllítsa be a töréspontot a bm paranccsal az illesztő nevével, majd a függvény nevével (AddDevice), ahol be szeretné állítani a töréspontot, felkiáltójellel elválasztva.
0: kd> bm tabletaudiosample!AddDevice breakpoint 1 redefined 1: fffff801`14b5f000 @!"tabletaudiosample!AddDevice"Különböző szintaxist használhat olyan változók beállításával együtt, mint a <modul>!<szimbólum>, <osztály>::<metódus>, '<file.cpp>:<sorszám>', vagy hagyja ki a feltételt bizonyos számú alkalommal<#>. További információ: Töréspontok használata.
Az aktuális töréspontok listázásával ellenőrizheti, hogy a töréspont be van-e állítva a bl parancs beírásával.
0: kd> bl 1 e fffff801`14b5f000 0001 (0001) tabletaudiosample!AddDeviceIndítsa újra a kódvégrehajtást a célrendszeren a g parancs beírásával.
->A célrendszeren
Windows rendszerben nyissa meg az Eszközkezelőt az ikonnal vagy az mmc devmgmt.msc beírásával. A Device Managerben bontsa ki a Hang-, video- és játékvezérlők csomópontot . Válassza ki és tartsa lenyomva a virtuális hangillesztő bejegyzését (vagy kattintson rá a jobb gombbal), majd válassza ki a Letiltás lehetőséget a menüből.
Jelölje ki és tartsa lenyomva (vagy kattintson a jobb gombbal) a virtuális hangillesztő bejegyzését, majd válassza az Engedélyezés lehetőséget a menüből.
<– A gazdarendszeren
Ennek hatására a Windows újra betölti az illesztőprogramot, amely meghívja az AddDevice-t. Ez az AddDevice hibakeresési töréspont kigyulladását okozza, és a célrendszer illesztőprogram-kódjának végrehajtása leáll.
Breakpoint 1 hit tabletaudiosample!AddDevice: fffff801`14baf000 4889542410 mov qword ptr [rsp+10h],rdxHa a forrásútvonal megfelelően van beállítva, akkor az AddDevice rutinnál meg kell állnia az adapter.cpp-ben.
{ PAGED_CODE(); NTSTATUS ntStatus; ULONG maxObjects; DPF(D_TERSE, ("[AddDevice]")); maxObjects = g_MaxMiniports; #ifdef SYSVAD_BTH_BYPASS // // Allow three (3) Bluetooth hands-free profile devices. // maxObjects += g_MaxBthHfpMiniports * 3; #endif // SYSVAD_BTH_BYPASS // Tell the class driver to add the device. // ntStatus = PcAddAdapterDevice ( DriverObject, PhysicalDeviceObject, PCPFNSTARTDEVICE(StartDevice), maxObjects, 0 ); return ntStatus; } // AddDeviceA p parancs beírásával vagy az F10 billentyű lenyomásával lépésről lépésre haladhat végig a kódon. A sysvad AddDevice kódból továbbléphet a PpvUtilCall, a PnpCallAddDevice, majd a PipCallDriverAddDevice Windows-kódra. A p parancsnak megadhat egy számot, amely több sort is előreléptet, például p 5.
Ha végzett a kód futtatásával, a g go paranccsal indítsa újra a végrehajtást a célrendszeren.
Memóriaelérési töréspontok beállítása
Olyan töréspontokat is beállíthat, amelyek memóriahely elérésekor aktiválhatók. Használja a ba (hozzáférés-megszakítás) parancsot az alábbi szintaxissal.
ba <access> <size> <address> {options}
| Lehetőség | Leírás |
|---|---|
e |
végrehajtás (amikor a CPU lekéri az utasítást a címről) |
r |
olvasás/írás (amikor a CPU beolvassa vagy a címre ír) |
w |
írás (amikor a CPU a címre ír) |
Vegye figyelembe, hogy egy adott időpontban csak négy adattörési pontot állíthat be, és Önnek kell gondoskodnia arról, hogy helyesen igazítsa az adatokat, vagy hogy ne aktiválja a töréspontot (a szavaknak 2-gyel osztható címekben kell végződniük, a dwords-nek 4-gyel, a quadwordsnek pedig 0-tal vagy 8-tal kell oszthatónak lennie)
Ha például be szeretne állítani egy olvasási/írási töréspontot egy adott memóriacímre, használjon egy ehhez hasonló parancsot.
ba r 4 fffff800`7bc9eff0
Töréspont állapotának módosítása
A meglévő töréspontokat az alábbi parancsokkal módosíthatja.
Bl |
A töréspontok listája. |
Kr. e. |
Törli a töréspontot a listából. Az összes töréspont törléséhez használja a bc * karaktert. |
Bd |
Letilt egy töréspontot. A bd * használatával tiltsa le az összes töréspontot. |
lenni |
Töréspont engedélyezése. Az összes töréspont engedélyezéséhez használja a Be * lehetőséget. |
A töréspontokon a szerkesztés> menüpont kiválasztásával is módosíthat. Vegye figyelembe, hogy a töréspont párbeszédpanel csak a meglévő töréspontokkal működik. Az új töréspontokat a parancssorból kell beállítani.
Töréspont beállítása a MixerVolume-on
A rendszer meghívja a hangillesztő-kód különböző részeit, hogy reagáljanak a különböző eseményekre az eszközillesztő betöltése után. A következő szakaszban beállítunk egy töréspontot, amely akkor aktiválódik, amikor a felhasználó módosítja a virtuális hangillesztő hangerő-vezérlését.
Ha töréspontot szeretne beállítani a MixerVolume-on, hajtsa végre az alábbi lépéseket.
<– A gazdarendszeren
A hangerőt módosító metódus megkereséséhez használja az x parancsot, hogy listázza a CAdapterCommon szimbólumokat, amelyek tartalmazzák a 'volume' sztringet.
kd> x tabletaudiosample!CAdapterCommon::* ... fffff800`7bce26a0 tabletaudiosample!CAdapterCommon::MixerVolumeWrite (unsigned long, unsigned long, long) …A CTRL+F billentyűkombinációval kereshet felfelé a hangerő kimenetében, és megkeresheti a MixerVolumeWrite metódust.
Törölje az előző töréspontokat a bc *használatával.
Állítson be egy szimbólumtörési pontot a CAdapterCommon::MixerVolumeWrite rutinhoz az alábbi paranccsal.
kd> bm tabletaudiosample!CAdapterCommon::MixerVolumeWrite 1: fffff801`177b26a0 @!"tabletaudiosample!CAdapterCommon::MixerVolumeWrite"Sorolja fel a töréspontokat, hogy meggyőződjön arról, hogy a töréspont megfelelően van beállítva.
kd> bl 1 e fffff801`177b26a0 [c:\WDK_Samples\audio\sysvad\common.cpp @ 1668] 0001 (0001) tabletaudiosample!CAdapterCommon::MixerVolumeWriteIndítsa újra a kódvégrehajtást a célrendszeren a g parancs beírásával.
A Vezérlőpulton válassza a Hardver és hang>hang lehetőséget. Válassza ki és tartsa lenyomva (vagy kattintson a jobb gombbal) a Sink Description Sample elemet, és válassza a Tulajdonságok lehetőséget. Válassza a Szintek lapot. Állítsa be a csúszka hangerőt.
Ennek hatására a SetMixerVolume hibakeresési töréspont aktiválódik, és a célrendszer illesztőprogram-kódjának végrehajtása leáll.
kd> g Breakpoint 1 hit tabletaudiosample!CAdapterCommon::MixerVolumeWrite: fffff801`177b26a0 44894c2420 mov dword ptr [rsp+20h],r9dÁlljon meg ennél a sornál a common.cpp fájlban.
{ if (m_pHW) { m_pHW->SetMixerVolume(Index, Channel, Value); } } // MixerVolumeWriteA dv paranccsal megjelenítheti az aktuális változókat és azok értékeit. A változókkal kapcsolatos további információk a labor következő szakaszában találhatók.
2: kd> dv this = 0x00000000`00000010 ulNode = 0x344 ulChannel = 0x210a45f8 lVolume = 0n24Nyomja le az F10 billentyűt a kód egy lépésben történő végiglépéséhez.
Nyomja le az F5 billentyűt a MixerVolumeWrite kód végrehajtásának befejezéséhez.
Összegzés – A hibakereső parancsablakából lépegetve a kódban
A következő parancsokkal lépegethet a kódon (zárójelben a billentyűzethez tartozó rövid vágásokkal).
Betörés (Ctrl+Break) – Ez a parancs megszakítja a rendszer működését, amíg a rendszer fut és kapcsolatban van a WinDbg-gel (a Kernel Debuggerben a kombináció: Ctrl+C).
Átlépés (F10) – Ez a parancs a kód végrehajtását egyesével, egy utasításon vagy utasításonként eredményezi. Hívás esetén a kódvégrehajtás a hívott rutin megadása nélkül halad át a híváson. (Ha a programozási nyelv C vagy C++ és a WinDbg forrás módban van, a forrás mód a Hibakeresés> funkcióval be- vagy kikapcsolhatóForrás mód).
Step in (F11) – Ez a parancs hasonló a "lépés át" (step-over) utasításhoz, azzal a kivétellel, hogy a hívás végrehajtása belép a hívott rutinba.
Kilépés (Shift+F11) – Ez a parancs azt eredményezi, hogy a végrehajtás az aktuális rutinon fut keresztül, majd kilép a hívásverem aktuális helyéről. Ez akkor hasznos, ha már eleget látott a rutinból.
Futtatás a kurzorhoz (F7 vagy Ctrl+F10) – Helyezze a kurzort egy forrás- vagy szétszerelési ablakba, ahol a végrehajtást el szeretné törni, majd nyomja le az F7 billentyűt; a kódvégrehajtás erre a pontra fog futni. Vegye figyelembe, hogy ha a kódvégrehajtás folyamata nem éri el a kurzor által jelzett pontot (például ha nem hajtja végre a HA utasítást), a WinDbg nem törik meg, mert a kód végrehajtása nem érte el a megadott pontot.
Futtatás (F5) – Futtatás addig, amíg töréspont nem történik, vagy hibaellenőrzéshez hasonló esemény nem történik.
Speciális beállítások
Utasítás beállítása az aktuális sorra (Ctrl+Shift+I) – A forrásablakban elhelyezheti a kurzort egy vonalon, beírhatja ezt a billentyűparancsot, és a kódvégrehajtás attól a ponttól indul el, amint engedélyezi a folytatást (például F5 vagy F10 használatával). Ez akkor hasznos, ha újra meg szeretne próbálkozni egy sorozatgal, de némi odafigyelést igényel. A regiszterek és a változók például nem arra vannak beállítva, hogy milyenek lennének, ha a kódvégrehajtás természetesen elérte volna ezt a sort.
Az eip-nyilvántartás közvetlen beállítása – Az eip-nyilvántartásba beírhat egy értéket, és amint lenyomja az F5 billentyűt (vagy F10, F11 stb.), a végrehajtás ezen a címen kezdődik. Ez hasonló a kurzor által kijelölt aktuális sor utasításának beállításához, azzal a kivételsel, hogy megadja egy szerelvényutasítás címét.
A parancssor helyett egyszerűbb lehet a felhasználói felületen végiglépkedni, ezért ez a módszer ajánlott. Szükség esetén a következő parancsokkal lépkedhet át egy forrásfájlon a parancssorban:
.lines – Forrásvonal-információk engedélyezése.
bp main – Állítsa be a kezdő töréspontot a modul elején.
l+t – A léptetés a forrásvonalon történik.
Válassza a Hibakeresés>Forrás mód lehetőséget a forrás módba lépéshez; a
L+tparancs nem elegendő.l+s – A forrásvonalak azonnal megjelennek.
g – Futtassa a programot, amíg el nem éri a "main" állapotot.
p – Egy forrássor végrehajtása.
További információért lásd: Forráskód hibakeresése a klasszikus WinDbg az hibakeresési referenciadokumentációban.
Töréspontok beállítása kódban
A kódban töréspontot úgy állíthat be, hogy hozzáadja az DebugBreak() utasítást, újraépíti a projektet, majd újratelepíti az illesztőprogramot. Ez a töréspont minden alkalommal aktiválódik, amikor az illesztőprogram engedélyezve van, ezért a korai fejlesztési szakaszokban, nem pedig az éles kódban használandó technikák közé tartozik. Ez a technika nem olyan rugalmas, mint a töréspontok dinamikus beállítása a töréspontok parancsaival.
Tipp: Érdemes megtartani a Sysvad-illesztő egy példányát, amelyhez nincs hozzáadva töréspont, a további laboratóriumi munkákhoz.
Állítson be törést az AddDevice metódus minden futtatásakor úgy, hogy hozzáadja az
DebugBreak()utasítást a mintakódhoz.... // Insert the DebugBreak() statment before the PcAddAdapterDevice is called. // DebugBreak() // Tell the class driver to add the device. // ntStatus = PcAddAdapterDevice ( DriverObject, PhysicalDeviceObject, PCPFNSTARTDEVICE(StartDevice), maxObjects, 0 ); return ntStatus; } // AddDeviceKövesse a korábban ismertetett lépéseket az illesztőprogram Microsoft Visual Studióban való újraépítéséhez és a célgépre való újratelepítéséhez. A frissített illesztőprogram telepítése előtt mindenképpen távolítsa el a meglévő illesztőprogramot.
Törölje a korábbi töréspontokat, és győződjön meg arról, hogy a hibakereső csatlakoztatva van a célszámítógéphez.
Amikor a kód fut és eléri az utasítást, a
DebugBreakvégrehajtás leáll, és megjelenik egy üzenet.KERNELBASE!DebugBreak: 77b3b770 defe __debugbreak
8. szakasz: Változók megjelenítése
A 8. szakaszban hibakereső parancsokat fog használni a változók megjelenítéséhez.
Hasznos lehet a változók vizsgálata a kód végrehajtásakor annak ellenőrzéséhez, hogy a kód a várt módon működik-e. Ez a laboratórium a változókat vizsgálja, amikor a hangillesztő hangot állít elő.
A dv paranccsal vizsgálja meg a tabletaudiosample-hez társított területi változókat! CMiniportWaveRT::Új*.
kd> dv tabletaudiosample!CMiniportWaveRT::New*Az előző töréspontok törlése
bc *Állítson be egy szimbólumtörési pontot a CMiniportWaveCyclicStreamMSVAD rutinokon az alábbi paranccsal.
0: kd> bm tabletaudiosample!CMiniportWaveRT::NewStream 1: fffff801`177dffc0 @!"tabletaudiosample!CMiniportWaveRT::NewStream"Indítsa újra a kódvégrehajtást a célrendszeren a g parancs beírásával.
-> A célrendszeren
Keresse meg a kis médiafájlt (például a Windows értesítési hangfájlját .wav kiterjesztéssel), és válassza ki a fájlt a lejátszáshoz. Használhatja például a Windows\Media könyvtárban található Ring05.wav.
<– A gazdarendszeren
A médiafájl lejátszásakor a töréspontnak ki kell égnie, és a célrendszer illesztőprogram-kódjának végrehajtása leáll.
Breakpoint 1 hit tabletaudiosample!CMiniportWaveRT::NewStream: fffff801`177dffc0 44894c2420 mov dword ptr [rsp+20h],r9dA forráskód ablakának ki kell emelnie a kapcsos zárójelet a NewStream függvény elején.
/*++ Routine Description: The NewStream function creates a new instance of a logical stream associated with a specified physical channel. Callers of NewStream should run at IRQL PASSIVE_LEVEL. Arguments: OutStream - OuterUnknown - Pin - Capture - DataFormat - Return Value: NT status code. --*/ { ...helyi változók
Az adott kerethez tartozó összes helyi változó nevét és értékét megjelenítheti a dv parancs beírásával.
0: kd> dv this = 0xffffe000`4436f8e0 OutStream = 0xffffe000`49d2f130 OuterUnknown = 0xffffe000`4436fa30 Pin = 0 Capture = 0x01 ' DataFormat = 0xffffe000`44227790 signalProcessingMode = {487E9220-E000-FFFF-30F1-D24900E0FFFF} ntStatus = 0n1055 stream = 0x00000000`00000200Változók megjelenítése DML használatával
Ha a DML használatával szeretne változókat felderíteni, jelölje ki az aláhúzott elemeket. A kiválasztási művelet létrehoz egy dx (NatVis-kifejezés megjelenítése) parancsot, amely lehetővé teszi a beágyazott adatstruktúrák részletezését.
0: kd> dx -r1 (*((tabletaudiosample!CMiniportWaveRT *)0xffffe001d10b8380)) (*((tabletaudiosample!CMiniportWaveRT *)0xffffe001d10b8380)) : [Type: CMiniportWaveRT] [+0x020] m_lRefCount : 0 [+0x028] m_pUnknownOuter : 0xffffe001d1477e50 : [Type: IUnknown *] [+0x030] m_ulLoopbackAllocated : 0x2050 [+0x034] m_ulSystemAllocated : 0x180 [+0x038] m_ulOffloadAllocated : 0x0 [+0x03c] m_dwCaptureAllocatedModes : 0x0 0: kd> dx -r1 (*((tabletaudiosample!_GUID *)0xffffd001c8acd348)) (*((tabletaudiosample!_GUID *)0xffffd001c8acd348)) : {487E9220-E000-FFFF-30F1-D24900E0FFFF} [Type: _GUID] [<Raw View>] 0: kd> dx -r1 -n (*((tabletaudiosample!_GUID *)0xffffd001c8acd348)) (*((tabletaudiosample!_GUID *)0xffffd001c8acd348)) : [Type: _GUID] [+0x000] Data1 : 0x487e9220 [+0x004] Data2 : 0xe000 [+0x006] Data3 : 0xffff [+0x008] Data4 : [Type: unsigned char [8]] 0: kd> dx -r1 -n (*((tabletaudiosample!unsigned char (*)[8])0xffffd001c8acd350)) (*((tabletaudiosample!unsigned char (*)[8])0xffffd001c8acd350)) : [Type: unsigned char [8]] [0] : 0x30 [1] : 0xf1 [2] : 0xd2 [3] : 0x49 [4] : 0x0 [5] : 0xe0 [6] : 0xff [7] : 0xffglobális változók
A globális változó memóriahelyének megkereséséhez írja be a következőt : <változó neve>.
0: kd> ? signalProcessingMode Evaluate expression: -52768896396472 = ffffd001`c8acd348Ez a változó memóriahelyét adja vissza, ebben az esetben ffffd001'c8acd348. A memóriahely tartalmát úgy tekintheti meg, hogy az adott hely értékét az előző parancs által visszaadott memóriahely használatával írja be a dd parancsba.
0: kd> dd ffffd001`c8acd348 ffffd001`c8acd348 487e9220 ffffe000 49d2f130 ffffe000 ffffd001`c8acd358 4837c468 ffffe000 18221570 ffffc000 ffffd001`c8acd368 4436f8e0 ffffe000 487e9220 ffffe000 ffffd001`c8acd378 18ab145b fffff801 4837c420 ffffe000 ffffd001`c8acd388 4436f8e0 ffffe000 49d2f130 ffffe000 ffffd001`c8acd398 4436fa30 ffffe000 00000000 00000000 ffffd001`c8acd3a8 00000001 00000000 44227790 ffffe000 ffffd001`c8acd3b8 18adc7f9 fffff801 495972a0 ffffe000A dd paranccsal változóneveket is használhat.
0: kd> dd signalProcessingMode ffffd001`c8acd348 487e9220 ffffe000 49d2f130 ffffe000 ffffd001`c8acd358 4837c468 ffffe000 18221570 ffffc000 ffffd001`c8acd368 4436f8e0 ffffe000 487e9220 ffffe000 ffffd001`c8acd378 18ab145b fffff801 4837c420 ffffe000 ffffd001`c8acd388 4436f8e0 ffffe000 49d2f130 ffffe000 ffffd001`c8acd398 4436fa30 ffffe000 00000000 00000000 ffffd001`c8acd3a8 00000001 00000000 44227790 ffffe000 ffffd001`c8acd3b8 18adc7f9 fffff801 495972a0 ffffe000Változók megjelenítése
AHelyiek> menüelem használatával megjelenítheti a helyi változókat. Ez az interfész lehetővé teszi az összetettebb adatstruktúrák részletezésének lehetőségét is.
P vagy F10 használatával léptessen körülbelül 10 sort a kódban, amíg az ntStatus = IsFormatSupported(Pin, Capture, DataFormat) kódsort nem emeli ki.
PAGED_CODE(); ASSERT(OutStream); ASSERT(DataFormat); DPF_ENTER(("[CMiniportWaveRT::NewStream]")); NTSTATUS ntStatus = STATUS_SUCCESS; PCMiniportWaveRTStream stream = NULL; GUID signalProcessingMode = AUDIO_SIGNALPROCESSINGMODE_DEFAULT; *OutStream = NULL; // // If the data format attributes were specified, extract them. // if ( DataFormat->Flags & KSDATAFORMAT_ATTRIBUTES ) { // The attributes are aligned (QWORD alignment) after the data format PKSMULTIPLE_ITEM attributes = (PKSMULTIPLE_ITEM) (((PBYTE)DataFormat) + ((DataFormat->FormatSize + FILE_QUAD_ALIGNMENT) & ~FILE_QUAD_ALIGNMENT)); ntStatus = GetAttributesFromAttributeList(attributes, attributes->Size, &signalProcessingMode); } // Check if we have enough streams. // if (NT_SUCCESS(ntStatus)) { ntStatus = ValidateStreamCreate(Pin, Capture, signalProcessingMode); } // Determine if the format is valid. // if (NT_SUCCESS(ntStatus)) { ntStatus = IsFormatSupported(Pin, Capture, DataFormat); } ...A dv paranccsal megjelenítheti egy adott keret összes helyi változójának nevét és értékét. Vegye figyelembe, hogy a vártnak megfelelően az értékek eltérnek a parancs legutóbbi futtatásakor használt értékektől, mivel a rendszer további kódot futtatott, amelyek megváltoztatják a helyi változókat, és egyes változók már nem szerepelnek az aktuális keretben, vagy az értékek módosultak.
2: kd> dv this = 0xffffe001`d1182000 OutStream = 0xffffe001`d4776d20 OuterUnknown = 0xffffe001`d4776bc8 Pin = 0 Capture = 0x00 ' DataFormat = 0xffffe001`cd7609b0 signalProcessingMode = {4780004E-7133-41D8-8C74-660DADD2C0EE} ntStatus = 0n0 stream = 0x00000000`00000000
9. szakasz: Hívásveremek megtekintése
A 9. szakaszban a hívásveremeket tekintheti meg a hívó/hívó kód vizsgálatához.
A hívásverem azoknak a függvényhívásoknak a láncolata, amelyek a programszámláló aktuális helyére vezettek. A hívásverem legfelső függvénye az aktuális függvény, a következő pedig az a függvény, amelyik az aktuális függvényt hívta, és így tovább.
A hívásverem megjelenítéséhez használja a k* parancsokat:
kB |
Megjeleníti a verem tartalmát és az első három paramétert. |
Kp |
Megjeleníti a veremstruktúrákat és a paraméterek teljes listáját. |
-kn- |
Lehetővé teszi a verem megtekintését a keretinformációkkal együtt. |
Ha elérhetővé szeretné tenni a hívásvermet, ahívásverem>válassza a Hívásverem megtekintése lehetőséget. Válassza ki az ablak tetején lévő oszlopokat a további információk megjelenítésének váltásához.
Ez a kimenet a hívásvermet jeleníti meg a mintaadapter kódjának hibakeresése közben, amikor az megszakított állapotban van.
0: kd> kb
# RetAddr : Args to Child : Call Site
00 fffff800`7a0fa607 : ffffe001`d1182000 ffffe001`d4776d20 ffffe001`d4776bc8 ffffe001`00000000 : tabletaudiosample!CMiniportWaveRT::NewStream+0x1dc [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 597]
01 fffff800`7a0fb2c3 : 00000000`00000000 ffffe001`d122bb10 ffffe001`ceb81750 ffffe001`d173f058 : portcls!CPortPinWaveRT::Init+0x2e7
02 fffff800`7a0fc7f9 : ffffe001`d4776bc0 00000000`00000000 ffffe001`d10b8380 ffffe001`d122bb10 : portcls!CPortFilterWaveRT::NewIrpTarget+0x193
03 fffff800`7a180552 : 00000000`00000000 ffffe001`d10b8380 ffffe001`d122bb10 ffffe001`d4565600 : portcls!xDispatchCreate+0xd9
04 fffff800`7a109a9a : ffffe001`d10b84d0 ffffe001`d10b8380 00000000`00000000 ffffe001`00000000 : ks!KsDispatchIrp+0x272
05 fffff800`7bd314b1 : ffffe001`d122bb10 ffffd001`c3098590 ffffe001`d122bd90 ffffe001`ce80da70 : portcls!DispatchCreate+0x7a
06 fffff803`cda1bfa8 : 00000000`00000024 00000000`00000000 00000000`00000000 ffffe001`d122bb10 : ksthunk!CKernelFilterDevice::DispatchIrp+0xf9
07 fffff803`cda7b306 : 00000000`000001f0 ffffe001`d48ce690 ffffe001`d13d6400 ffffe001`d13d64c0 : nt!IopParseDevice+0x7c8
08 fffff803`cda12916 : 00000000`000001f0 ffffd001`c30988d0 ffffe001`d13d6490 fffff803`cda7b250 : nt!IopParseFile+0xb6
09 fffff803`cda1131c : ffffe001`d2ccb001 ffffd001`c30989e0 00ffffe0`00000040 ffffe001`cd127dc0 : nt!ObpLookupObjectName+0x776
0a fffff803`cd9fedb8 : ffffe001`00000001 ffffe001`d48ce690 00000000`00000000 00000000`00000000 : nt!ObOpenObjectByNameEx+0x1ec
0b fffff803`cd9fe919 : 000000ee`6d1fc8d8 000000ee`6d1fc788 000000ee`6d1fc7e0 000000ee`6d1fc7d0 : nt!IopCreateFile+0x3d8
0c fffff803`cd752fa3 : ffffc000`1f296870 fffff803`cd9d9fbd ffffd001`c3098be8 00000000`00000000 : nt!NtCreateFile+0x79
0d 00007fff`69805b74 : 00007fff`487484e6 0000029b`00000003 00000000`0000012e 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x13
0e 00007fff`487484e6 : 0000029b`00000003 00000000`0000012e 00000000`00000000 00000000`00000000 : 0x00007fff`69805b74
0f 0000029b`00000003 : 00000000`0000012e 00000000`00000000 00000000`00000000 00000000`00000000 : 0x00007fff`487484e6
10 00000000`0000012e : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000080 : 0x0000029b`00000003
11 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000080 00000000`00000000 : 0x12e
A kód további megismeréséhez használhatja a DML-t. Az első 00 bejegyzés kiválasztásakor a rendszer a .frame (Helyi környezet beállítása) paranccsal állítja be a környezetet, majd a dv (Helyi változók megjelenítése) parancs megjeleníti a helyi változókat.
0: kd> .frame 0n0;dv /t /v
00 ffffd001`c30981d0 fffff800`7a0fa607 tabletaudiosample!CMiniportWaveRT::NewStream+0x1dc [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 597]
ffffd001`c30982b0 class CMiniportWaveRT * this = 0xffffe001`d1182000
ffffd001`c30982b8 struct IMiniportWaveRTStream ** OutStream = 0xffffe001`d4776d20
ffffd001`c30982c0 struct IPortWaveRTStream * OuterUnknown = 0xffffe001`d4776bc8
ffffd001`c30982c8 unsigned long Pin = 0
ffffd001`c30982d0 unsigned char Capture = 0x00 '
ffffd001`c30982d8 union KSDATAFORMAT * DataFormat = 0xffffe001`cd7609b0
ffffd001`c3098270 struct _GUID signalProcessingMode = {4780004E-7133-41D8-8C74-660DADD2C0EE}
ffffd001`c3098210 long ntStatus = 0n0
ffffd001`c3098218 class CMiniportWaveRTStream * stream = 0x00000000`00000000
10. szakasz: Folyamatok és szálak megjelenítése
A 10. szakaszban hibakereső parancsokkal jelenítheti meg a folyamatokat és a szálakat.
Folyamat
Az aktuális folyamatkörnyezet módosításához használja a .process <process> parancsot. Az alábbi példa bemutatja, hogyan azonosíthat egy folyamatot, és hogyan válthat környezetére.
!processA parancs használatával megjelenítheti a hang lejátszásában részt vevő aktuális folyamatot.További információ: !process
A kimenet azt mutatja, hogy a folyamat a(z) audiodg.exe-hoz kapcsolódik. Ha továbbra is a jelen témakör előző szakaszában leírt törésponton van, az aktuális folyamatot a audiodg.exe képhez kell társítani.
<– A gazdarendszeren
0: kd> !process
PROCESS ffffe001d147c840
SessionId: 0 Cid: 10f0 Peb: ee6cf8a000 ParentCid: 0434
DirBase: d2122000 ObjectTable: ffffc0001f191ac0 HandleCount: <Data Not Accessible>
Image: audiodg.exe
VadRoot ffffe001d4222f70 Vads 70 Clone 0 Private 504. Modified 16. Locked 0.
DeviceMap ffffc00019113080
Token ffffc0001f1d4060
ElapsedTime <Invalid>
UserTime 00:00:00.000
KernelTime 00:00:00.000
QuotaPoolUsage[PagedPool] 81632
QuotaPoolUsage[NonPagedPool] 9704
Working Set Sizes (now,min,max) (2154, 1814, 2109) (8616KB, 7256KB, 8436KB)
PeakWorkingSetSize 2101
VirtualSize 2097192 Mb
PeakVirtualSize 2097192 Mb
PageFaultCount 2336
MemoryPriority BACKGROUND
BasePriority 8
CommitCharge 1573
THREAD ffffe001d173e840 Cid 10f0.1dac Teb: 000000ee6cf8b000 Win32Thread: ffffe001d1118cf0 WAIT: (UserRequest) UserMode Non-Alertable
ffffe001d16c4dd0 NotificationEvent
ffffe001d08b0840 ProcessObject
THREAD ffffe001ceb77080 Cid 10f0.16dc Teb: 000000ee6cf8d000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
ffffe001cf2d1840 QueueObject
THREAD ffffe001d112c840 Cid 10f0.0a4c Teb: 000000ee6cf8f000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
ffffe001cf2d1840 QueueObject
THREAD ffffe001d16c7840 Cid 10f0.13c4 Teb: 000000ee6cf91000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
ffffe001cf2d1840 QueueObject
THREAD ffffe001cec67840 Cid 10f0.0dbc Teb: 000000ee6cf93000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
ffffe001d173e5c0 QueueObject
THREAD ffffe001d1117840 Cid 10f0.1d6c Teb: 000000ee6cf95000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
ffffe001d173e5c0 QueueObject
THREAD ffffe001cdeae840 Cid 10f0.0298 Teb: 000000ee6cf97000 Win32Thread: 0000000000000000 RUNNING on processor 2
Megjegyzés: a folyamathoz társított szálak egyike FUT állapotban van. Ez a szál támogatta a médiaklip lejátszását a töréspont elérésekor.
A !process 0 0 paranccsal megjelenítheti az összes folyamat összefoglaló adatait. A parancskimenetben a CTRL+F billentyűkombinációval keresse meg a audiodg.exe lemezképhez társított folyamat folyamatazonosítóját. Az alábbi példában a folyamatazonosító ffffe001d147c840.
A számítógépén jegyezze fel a audiodg.exe társított folyamatazonosítót, hogy később felhasználhassa ebben a laborban. ________________________
...
PROCESS ffffe001d147c840
SessionId: 0 Cid: 10f0 Peb: ee6cf8a000 ParentCid: 0434
DirBase: d2122000 ObjectTable: ffffc0001f191ac0 HandleCount: <Data Not Accessible>
Image: audiodg.exe
...
Írja be a g billentyűt a hibakeresőbe a kód továbbfuttatásához, amíg a médiaklip le nem játszódik. Ezután lépjen be a hibakeresőbe a Ctrl+ScrLk (Ctrl+Break) billentyűkombináció lenyomásával. A !folyamat paranccsal erősítse meg, hogy egy másik folyamatot futtat.
!process
PROCESS ffffe001cd0ad040
SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000
DirBase: 001aa000 ObjectTable: ffffc00017214000 HandleCount: <Data Not Accessible>
Image: System
VadRoot ffffe001d402b820 Vads 438 Clone 0 Private 13417. Modified 87866. Locked 64.
DeviceMap ffffc0001721a070
Token ffffc00017216a60
ElapsedTime 05:04:54.716
UserTime 00:00:00.000
KernelTime 00:00:20.531
QuotaPoolUsage[PagedPool] 0
QuotaPoolUsage[NonPagedPool] 0
Working Set Sizes (now,min,max) (1720, 50, 450) (6880KB, 200KB, 1800KB)
PeakWorkingSetSize 15853
VirtualSize 58 Mb
PeakVirtualSize 74 Mb
PageFaultCount 46128
MemoryPriority BACKGROUND
BasePriority 8
CommitCharge 66
THREAD ffffe001cd0295c0 Cid 0004.000c Teb: 0000000000000000 Win32Thread: 0000000000000000 WAIT: (Executive) KernelMode Non-Alertable
fffff803cd8e0120 SynchronizationEvent
THREAD ffffe001cd02a6c0 Cid 0004.0010 Teb: 0000000000000000 Win32Thread: 0000000000000000 WAIT: (Executive) KernelMode Non-Alertable
fffff803cd8e0ba0 Semaphore Limit 0x7fffffff
...
A fenti kimenet azt mutatja, hogy egy másik rendszerfolyamat, az ffffe001cd0ad040, fut. A rendszerkép neve nem audiodg.exe, hanem a Rendszer nevet jeleníti meg.
A(z) !process paranccsal váltson arra a folyamatra, amely a(z) audiodg.exe-hoz volt társítva. A példában a folyamat azonosítója ffffe001d147c840. Cserélje le a példában szereplő folyamatazonosítót a korábban rögzített folyamatazonosítóra.
0: kd> !process ffffe001d147c840
PROCESS ffffe001d147c840
SessionId: 0 Cid: 10f0 Peb: ee6cf8a000 ParentCid: 0434
DirBase: d2122000 ObjectTable: ffffc0001f191ac0 HandleCount: <Data Not Accessible>
Image: audiodg.exe
VadRoot ffffe001d4222f70 Vads 60 Clone 0 Private 299. Modified 152. Locked 0.
DeviceMap ffffc00019113080
Token ffffc0001f1d4060
ElapsedTime 1 Day 01:53:14.490
UserTime 00:00:00.031
KernelTime 00:00:00.031
QuotaPoolUsage[PagedPool] 81552
QuotaPoolUsage[NonPagedPool] 8344
Working Set Sizes (now,min,max) (1915, 1814, 2109) (7660KB, 7256KB, 8436KB)
PeakWorkingSetSize 2116
VirtualSize 2097189 Mb
PeakVirtualSize 2097192 Mb
PageFaultCount 2464
MemoryPriority BACKGROUND
BasePriority 8
CommitCharge 1418
THREAD ffffe001d173e840 Cid 10f0.1dac Teb: 000000ee6cf8b000 Win32Thread: ffffe001d1118cf0 WAIT: (UserRequest) UserMode Non-Alertable
ffffe001d16c4dd0 NotificationEvent
ffffe001d08b0840 ProcessObject
Not impersonating
DeviceMap ffffc00019113080
Owning Process ffffe001d147c840 Image: audiodg.exe
Attached Process N/A Image: N/A
Wait Start TickCount 338852 Ticks: 197682 (0:00:51:28.781)
Context Switch Count 36 IdealProcessor: 0
UserTime 00:00:00.015
KernelTime 00:00:00.000
Win32 Start Address 0x00007ff7fb928de0
Stack Init ffffd001c2ec6dd0 Current ffffd001c2ec60c0
Base ffffd001c2ec7000 Limit ffffd001c2ec1000 Call 0
Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
Kernel stack not resident.
THREAD ffffe001d115c080 Cid 10f0.15b4 Teb: 000000ee6cf9b000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
ffffe001d0bf0640 QueueObject
Not impersonating
DeviceMap ffffc00019113080
Owning Process ffffe001d147c840 Image: audiodg.exe
Attached Process N/A Image: N/A
Wait Start TickCount 338852 Ticks: 197682 (0:00:51:28.781)
Context Switch Count 1 IdealProcessor: 0
UserTime 00:00:00.000
KernelTime 00:00:00.000
Win32 Start Address 0x00007fff6978b350
Stack Init ffffd001c3143dd0 Current ffffd001c3143520
Base ffffd001c3144000 Limit ffffd001c313e000 Call 0
Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
Kernel stack not resident.
THREAD ffffe001d3a27040 Cid 10f0.17f4 Teb: 000000ee6cf9d000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
ffffe001d173e5c0 QueueObject
Not impersonating
DeviceMap ffffc00019113080
Owning Process ffffe001d147c840 Image: audiodg.exe
Attached Process N/A Image: N/A
Wait Start TickCount 518918 Ticks: 17616 (0:00:04:35.250)
Context Switch Count 9 IdealProcessor: 1
UserTime 00:00:00.000
KernelTime 00:00:00.000
Win32 Start Address 0x00007fff6978b350
Stack Init ffffd001c70c6dd0 Current ffffd001c70c6520
Base ffffd001c70c7000 Limit ffffd001c70c1000 Call 0
Priority 9 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
Kernel stack not resident.
Mivel ez a kód nem aktív, az összes szál várakozási állapotban van, a várt módon.
Témák
A szálak megtekintésére és beállítására szolgáló parancsok nagyon hasonlóak a folyamatok parancsaihoz. A !thread paranccsal megtekintheti a szálakat. A .thread használatával állítsa be az aktuális szálakat.
A médialejátszóhoz társított szálak felderítéséhez játssza le újra a médiaklipet. Ha az előző szakaszban leírt töréspont továbbra is érvényben van, a audiodg.exekontextusában fog leállni.
A !szál -1 0 használatával megjelenítheti az aktuális szál rövid adatait. Ez megjeleníti a szál címét, a szál- és folyamatazonosítókat, a szálkörnyezeti blokk (TEB) címét, a futtatáshoz létrehozott Win32 függvény címét (ha van ilyen), valamint a szál ütemezési állapotát.
0: kd> !thread -1 0
THREAD ffffe001d3a27040 Cid 10f0.17f4 Teb: 000000ee6cf9d000 Win32Thread: 0000000000000000 RUNNING on processor 0
A futó szálra vonatkozó további információk megtekintéséhez írja be a !thread parancsot. Az alábbiakhoz hasonló információkat kell megjeleníteni.
0: kd> !thread
THREAD ffffe001d3a27040 Cid 10f0.17f4 Teb: 000000ee6cf9d000 Win32Thread: 0000000000000000 RUNNING on processor 0
IRP List:
ffffe001d429e580: (0006,02c8) Flags: 000008b4 Mdl: 00000000
Not impersonating
DeviceMap ffffc00019113080
Owning Process ffffe001d147c840 Image: audiodg.exe
Attached Process N/A Image: N/A
Wait Start TickCount 537630 Ticks: 0
Context Switch Count 63 IdealProcessor: 1
UserTime 00:00:00.000
KernelTime 00:00:00.015
Win32 Start Address 0x00007fff6978b350
Stack Init ffffd001c70c6dd0 Current ffffd001c70c6520
Base ffffd001c70c7000 Limit ffffd001c70c1000 Call 0
Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
Child-SP RetAddr : Args to Child : Call Site
ffffd001`c70c62a8 fffff800`7a0fa607 : ffffe001`d4aec5c0 ffffe001`cdefd3d8 ffffe001`d4aec5c0 ffffe001`cdefd390 : tabletaudiosample!CMiniportWaveRT::NewStream [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 562]
ffffd001`c70c62b0 fffff800`7a0fb2c3 : 00000000`00000000 ffffe001`d429e580 ffffe001`d4ea47b0 ffffe001`cdefd3d8 : portcls!CPortPinWaveRT::Init+0x2e7
ffffd001`c70c6340 fffff800`7a0fc7f9 : ffffe001`d4aec430 00000000`00000000 ffffe001`d10b8380 ffffe001`d429e580 : portcls!CPortFilterWaveRT::NewIrpTarget+0x193
ffffd001`c70c63c0 fffff800`7a180552 : 00000000`00000000 ffffe001`d10b8380 ffffe001`d429e580 ffffe001`d4565600 : portcls!xDispatchCreate+0xd9
ffffd001`c70c6450 fffff800`7a109a9a : ffffe001`d10b84d0 ffffe001`d10b8380 00000000`00000000 ffffe001`00000000 : ks!KsDispatchIrp+0x272
ffffd001`c70c6510 fffff800`7bd314b1 : ffffe001`d429e580 ffffd001`c70c6590 ffffe001`d429e800 ffffe001`ce80da70 : portcls!DispatchCreate+0x7a
ffffd001`c70c6540 fffff803`cda1bfa8 : 00000000`00000025 00000000`00000000 00000000`00000000 ffffe001`d429e580 : ksthunk!CKernelFilterDevice::DispatchIrp+0xf9
ffffd001`c70c65a0 fffff803`cda7b306 : 00000000`000002fc ffffe001`d5e0d510 00000000`00000000 ffffe001`d3341bd0 : nt!IopParseDevice+0x7c8
ffffd001`c70c6770 fffff803`cda12916 : 00000000`000002fc ffffd001`c70c68d0 ffffe001`d3341ba0 fffff803`cda7b250 : nt!IopParseFile+0xb6
ffffd001`c70c67d0 fffff803`cda1131c : ffffe001`ceb6c601 ffffd001`c70c69e0 00000000`00000040 ffffe001`cd127dc0 : nt!ObpLookupObjectName+0x776
ffffd001`c70c6970 fffff803`cd9fedb8 : ffff8ab8`00000001 ffffe001`d5e0d510 00000000`00000000 00000000`00000000 : nt!ObOpenObjectByNameEx+0x1ec
ffffd001`c70c6a90 fffff803`cd9fe919 : 000000ee`6d37c6e8 00000004`6d37c500 000000ee`6d37c5f0 000000ee`6d37c5e0 : nt!IopCreateFile+0x3d8
ffffd001`c70c6b40 fffff803`cd752fa3 : fffff6fb`7da05360 fffff6fb`40a6c0a8 fffff681`4d815760 ffff8ab8`92895e23 : nt!NtCreateFile+0x79
ffffd001`c70c6bd0 00007fff`69805b74 : 00007fff`487484e6 0000029b`00000003 00000000`0000012e 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ ffffd001`c70c6c40)
000000ee`6d37c568 00007fff`487484e6 : 0000029b`00000003 00000000`0000012e 00000000`00000000 00000000`00000000 : 0x00007fff`69805b74
000000ee`6d37c570 0000029b`00000003 : 00000000`0000012e 00000000`00000000 00000000`00000000 00000000`00000000 : 0x00007fff`487484e6
000000ee`6d37c578 00000000`0000012e : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000080 : 0x0000029b`00000003
000000ee`6d37c580 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000080 00000000`00000000 : 0x12e
A k paranccsal megtekintheti a szálhoz társított hívásvermet.
0: kd> k
# Child-SP RetAddr Call Site
00 ffffd001`c70c62a8 fffff800`7a0fa607 tabletaudiosample!CMiniportWaveRT::NewStream [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 562]
01 ffffd001`c70c62b0 fffff800`7a0fb2c3 portcls!CPortPinWaveRT::Init+0x2e7
02 ffffd001`c70c6340 fffff800`7a0fc7f9 portcls!CPortFilterWaveRT::NewIrpTarget+0x193
03 ffffd001`c70c63c0 fffff800`7a180552 portcls!xDispatchCreate+0xd9
04 ffffd001`c70c6450 fffff800`7a109a9a ks!KsDispatchIrp+0x272
05 ffffd001`c70c6510 fffff800`7bd314b1 portcls!DispatchCreate+0x7a
06 ffffd001`c70c6540 fffff803`cda1bfa8 ksthunk!CKernelFilterDevice::DispatchIrp+0xf9
07 ffffd001`c70c65a0 fffff803`cda7b306 nt!IopParseDevice+0x7c8
08 ffffd001`c70c6770 fffff803`cda12916 nt!IopParseFile+0xb6
09 ffffd001`c70c67d0 fffff803`cda1131c nt!ObpLookupObjectName+0x776
0a ffffd001`c70c6970 fffff803`cd9fedb8 nt!ObOpenObjectByNameEx+0x1ec
0b ffffd001`c70c6a90 fffff803`cd9fe919 nt!IopCreateFile+0x3d8
0c ffffd001`c70c6b40 fffff803`cd752fa3 nt!NtCreateFile+0x79
0d ffffd001`c70c6bd0 00007fff`69805b74 nt!KiSystemServiceCopyEnd+0x13
0e 000000ee`6d37c568 00007fff`487484e6 0x00007fff`69805b74
0f 000000ee`6d37c570 0000029b`00000003 0x00007fff`487484e6
10 000000ee`6d37c578 00000000`0000012e 0x0000029b`00000003
11 000000ee`6d37c580 00000000`00000000 0x12e
Írja be a g billentyűt a hibakeresőbe a kód továbbfuttatásához, amíg a médiaklip le nem játszódik. Ezután lépjen be a hibakeresőbe a Ctrl - ScrLk (Ctrl-Break) billentyűkombináció lenyomásával. A !thread paranccsal erősítse meg, hogy most már egy másik szálat futtat.
0: kd> !thread
THREAD ffffe001ce80b840 Cid 17e4.01ec Teb: 00000071fa9b9000 Win32Thread: ffffe001d41690d0 RUNNING on processor 0
Not impersonating
DeviceMap ffffc0001974e2c0
Owning Process ffffe001d1760840 Image: rundll32.exe
Attached Process N/A Image: N/A
Wait Start TickCount 538040 Ticks: 0
Context Switch Count 3181840 IdealProcessor: 0
UserTime 00:00:08.250
KernelTime 00:00:10.796
Win32 Start Address 0x00007ff6d2f24270
Stack Init ffffd001cd16afd0 Current ffffd001cd16a730
Base ffffd001cd16b000 Limit ffffd001cd165000 Call 0
Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
Child-SP RetAddr : Args to Child : Call Site
fffff803`cf373d18 fffff800`7a202852 : fffff803`cf373e60 00000000`00000001 ffffe001`cf4ed330 00000000`0000ffff : nt!DbgBreakPointWithStatus
fffff803`cf373d20 fffff803`cd6742c6 : ffffe001`cf4ed2f0 fffff803`cf373e60 00000000`00000001 00000000`0004e4b8 : kdnic!TXSendCompleteDpc+0x142
fffff803`cf373d60 fffff803`cd74d495 : 00000000`00000000 fffff803`cd923180 fffff803`cde1f4b0 fffff901`40669010 : nt!KiRetireDpcList+0x5f6
fffff803`cf373fb0 fffff803`cd74d2a0 : 00000000`00000090 0000000e`0000006a 00000000`00000092 00000000`00000000 : nt!KxRetireDpcList+0x5 (TrapFrame @ fffff803`cf373e70)
ffffd001`cd16a6c0 fffff803`cd74bd75 : 00000000`00000000 fffff803`cd74a031 00000000`00000000 00000000`00000000 : nt!KiDispatchInterruptContinue
ffffd001`cd16a6f0 fffff803`cd74a031 : 00000000`00000000 00000000`00000000 ffffe001`cff4d2a0 fffff803`cd67738e : nt!KiDpcInterruptBypass+0x25
ffffd001`cd16a700 fffff960`50cdb5a4 : fffff901`400006d0 00000000`00000001 fffff901`40000d60 ffffd001`cd16a9f0 : nt!KiInterruptDispatchNoLockNoEtw+0xb1 (TrapFrame @ ffffd001`cd16a700)
ffffd001`cd16a890 fffff960`50c66b2f : 00000000`00000000 fffff901`40669010 fffff901`42358580 fffff901`40000d60 : win32kfull!Win32FreePoolImpl+0x34
ffffd001`cd16a8c0 fffff960`50c68cd6 : 00000000`00000000 ffffd001`cd16a9f0 fffff901`400006d0 fffff901`400c0460 : win32kfull!EXLATEOBJ::vAltUnlock+0x1f
ffffd001`cd16a8f0 fffff803`cd752fa3 : 00000000`00000000 00000000`00000000 ffffe001`ce80b840 00000000`00000000 : win32kfull!NtGdiAlphaBlend+0x1d16
ffffd001`cd16add0 00007fff`674c1494 : 00007fff`674b1e97 0000a7c6`daee0559 00000000`00000001 0000020b`741f3c50 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ ffffd001`cd16ae40)
00000071`fa74c9a8 00007fff`674b1e97 : 0000a7c6`daee0559 00000000`00000001 0000020b`741f3c50 00000000`00ffffff : 0x00007fff`674c1494
00000071`fa74c9b0 0000a7c6`daee0559 : 00000000`00000001 0000020b`741f3c50 00000000`00ffffff 00000000`00000030 : 0x00007fff`674b1e97
00000071`fa74c9b8 00000000`00000001 : 0000020b`741f3c50 00000000`00ffffff 00000000`00000030 00000000`01010bff : 0x0000a7c6`daee0559
00000071`fa74c9c0 0000020b`741f3c50 : 00000000`00ffffff 00000000`00000030 00000000`01010bff 00000000`00000000 : 0x1
00000071`fa74c9c8 00000000`00ffffff : 00000000`00000030 00000000`01010bff 00000000`00000000 00000000`000000c0 : 0x0000020b`741f3c50
00000071`fa74c9d0 00000000`00000030 : 00000000`01010bff 00000000`00000000 00000000`000000c0 00000000`00000030 : 0xffffff
00000071`fa74c9d8 00000000`01010bff : 00000000`00000000 00000000`000000c0 00000000`00000030 00000071`00000030 : 0x30
00000071`fa74c9e0 00000000`00000000 : 00000000`000000c0 00000000`00000030 00000071`00000030 00000071`01ff8000 : 0x1010bff
A kép neve rundll32.exe, ami valójában nem a médiaklip lejátszásához társított képnév.
Jegyzet Az aktuális szál beállításához írja be a .thread <szál számát>.
További információ a szálakról és folyamatokról az alábbi hivatkozásokban található:
11. szakasz: IRQL, regiszterek és szétszerelés
A mentett IRQL megtekintése
A 11. szakaszban megjeleníti az IRQL-t és a regiszterek tartalmát.
<– A gazdarendszeren
A megszakításkérési szint (IRQL) a megszakítás-karbantartás prioritásának kezelésére szolgál. Minden processzor rendelkezik olyan IRQL-beállítással, amelyet a szálak emelhetnek vagy csökkenthetik. A processzor IRQL-beállításánál vagy alatt bekövetkező megszakítások maszkolva vannak, és nem zavarják az aktuális műveletet. A processzor IRQL-beállítása feletti megszakítások elsőbbséget élveznek az aktuális művelettel szemben. A !irql bővítmény megjeleníti a megszakításkérési szintet (IRQL) a célszámítógép aktuális processzorán a hibakeresési törés bekövetkezése előtt. Amikor a célszámítógép belép a hibakeresőbe, az IRQL megváltozik, de a hibakereső megszakítása előtt érvényes IRQL mentésre kerül, és a !irql megjeleníti.
0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)
< A nyilvántartások megtekintése és szétszerelése
A regiszterek megtekintése
Az r (Regisztrálások) paranccsal megjelenítheti az aktuális szálhoz tartozó regiszterek tartalmát az aktuális processzoron.
0: kd> r
rax=000000000000c301 rbx=ffffe00173eed880 rcx=0000000000000001
rdx=000000d800000000 rsi=ffffe00173eed8e0 rdi=ffffe00173eed8f0
rip=fffff803bb757020 rsp=ffffd001f01f8988 rbp=ffffe00173f0b620
r8=000000000000003e r9=ffffe00167a4a000 r10=000000000000001e
r11=ffffd001f01f88f8 r12=0000000000000000 r13=ffffd001f01efdc0
r14=0000000000000001 r15=0000000000000000
iopl=0 nv up ei pl nz na pe nc
cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00000202
nt!DbgBreakPointWithStatus:
fffff803`bb757020 cc int 3
Másik lehetőségként megjelenítheti a regiszterek tartalmát a >Regiszterekmegtekintése lehetőség kiválasztásával.
A regiszterek tartalmának megtekintése hasznos lehet az assembly nyelvű kód végrehajtásának lépésenkénti követésében és más helyzetekben. További információ: r (Regiszterek).
A nyilvántartás tartalmával kapcsolatos információkért lásd: x86 Architektúra és x64 Architektúra.
Szétszerelés
A futtatás alatt álló kódot szétszerelheti, hogy megtekintse az aktuális szerelvénykódot a Megtekintés>Szétszerelés lehetőség kiválasztásával.
A szerelvény nyelvének szétszereléséről további információt a Jegyzet x86 Szétszerelés és a Jegyzet x64 Szétszerelés című témakörben talál.
12. szakasz: Memóriahasználat
A 12. szakaszban hibakereső parancsokkal jeleníti meg a memória tartalmát.
Memória megtekintése
Előfordulhat, hogy a probléma azonosításához vagy a változók, mutatók stb. vizsgálatához meg kell vizsgálnia a memóriát. A memóriát az alábbi d* <címparancsok> egyikének beírásával jelenítheti meg.
Db |
Bájtértékekben és ASCII-karakterekben jeleníti meg az adatokat. |
Dd |
Az adatokat dupla szélességű szavakként (4 bájt) jeleníti meg. |
Du |
Unicode-karakterekként jeleníti meg az adatokat. |
Dw |
Az adatokat szóértékként (2 bájt) és ASCII-karakterként jeleníti meg. |
Jegyzet Ha érvénytelen címet próbál megjeleníteni, annak tartalma kérdőjelként (?) jelenik meg.
Másik lehetőségként a Memória megtekintése> lehetőséget választva tekintheti meg amemóriát. A megjelenítési formátum legördülő menüjét használva módosíthatja a memória megjelenítését.
A hangerőszabályzóhoz társított adatok megtekintéséhez állítson be egy töréspontot a PropertyHandlerAudioEngineVolumeLevel rutin során a bm paranccsal. Mielőtt beállítanánk az új töréspontot, töröljük az összes korábbi töréspontot a bc * használatával.
kd> bc *Állítson be egy töréspontot a PropertyHandlerAudioEngineVolumeLevel rutinra a bm paranccsal.
kd> bm tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume 1: fffff80f`02c3a4b0 @!"tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume"Sorolja fel a töréspontokat, hogy meggyőződjön arról, hogy a töréspont megfelelően van beállítva.
kd> bl 1: fffff80f`02c3a4b0 @!"tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume"A g paranccsal indítsa újra a kódvégrehajtást.
A célrendszeren állítsa be a hangerőt a rendszertálcán. Ez a töréspont kigyulladását okozza.
Breakpoint 1 hit tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume: fffff80f`02c3a4b0 44894c2420 mov dword ptr [rsp+20h],r9dAHelyi változók > menüelem használatával jelenítheti meg a helyi változókat. Figyelje meg az IVolume változó aktuális értékét.
Az IVolume változó adattípusát és aktuális értékét a mintakódban a dt parancs és a változó nevének beírásával jelenítheti meg.
kd> dt lVolume Local var @ 0xa011ea50 Type long 0n-6291456A töréspont a SetDeviceChannelVolume beírásakor jön létre.
STDMETHODIMP_(NTSTATUS) CMiniportWaveRT::SetDeviceChannelVolume(_In_ ULONG _ulNodeId, _In_ UINT32 _uiChannel, _In_ LONG _Volume) { NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST; PAGED_CODE (); DPF_ENTER(("[CMiniportWaveRT::SetEndpointChannelVolume]")); IF_TRUE_ACTION_JUMP(_ulNodeId != KSNODE_WAVE_AUDIO_ENGINE, ntStatus = STATUS_INVALID_DEVICE_REQUEST, Exit); // Snap the volume level to our range of steppings. LONG lVolume = VOLUME_NORMALIZE_IN_RANGE(_Volume); ntStatus = SetChannelVolume(_uiChannel, lVolume); Exit: return ntStatus; }Próbálja meg megjeleníteni az értéket az IVolume memóriahelyén a dt (Display Type) paranccsal.
kd> dt dt lVolume Local var @ 0xffffb780b7eee664 Type long 0n0Mivel a változó még nincs definiálva, nem tartalmaz információt.
Nyomja le az F10 billentyűt a SetDeviceChannelVolume utolsó kódsorának futtatásához.
return ntStatus;Az érték megjelenítése az IVolume memóriahelyén a dt (Megjelenítés típusa) paranccsal.
kd> dt lVolume Local var @ 0xffffb780b7eee664 Type long 0n-6291456Most, hogy a változó aktív, megjelenik egy 6291456 érték ebben a példában.
Az IVolume memóriahelyét is megjelenítheti a ? (Kifejezés kiértékelése) parancs.
kd> ? lVolume Evaluate expression: -79711507126684 = ffffb780`b7eee664A megjelenített cím: ffffb780'b7eee664 az lVolume változó címe. A dd paranccsal megjelenítheti a memória tartalmát ezen a helyen.
kd> dd ffffb780`b7eee664 ffffb780`b7eee664 ffa00000 00000018 00000000 c52d7008 ffffb780`b7eee674 ffffc98e e0495756 fffff80e c52d7008 ffffb780`b7eee684 ffffc98e 00000000 fffff80e 00000000 ffffb780`b7eee694 ffffc98e ffa00000 ffffb780 b7eee710 ffffb780`b7eee6a4 ffffb780 00000000 00000000 c7477260 ffffb780`b7eee6b4 ffffc98e b7eee7a0 ffffb780 b7eee6f0 ffffb780`b7eee6c4 ffffb780 e04959ca fffff80e 00000000 ffffb780`b7eee6d4 00000000 00000028 00000000 00000002A cím első négy bájtját az L4 tartományparaméter megadásával jelenítheti meg.
kd> dd ffffb780`b7eee664 l4 ffffb780`b7eee664 ffa00000 00000018 00000000 c52d7008A különböző típusú memóriakimenet megjelenítéséhez írja be a du, da és db parancsokat.
kd> du ffffb780`b7eee664 ffffb780`b7eee664 "" kd> a ffffb780`b7eee664 ffffb780`b7eee664 "" kd> db 0xffffae015ff97664 ffffae01`5ff97664 00 80 bc ff 18 00 00 00-00 00 00 00 08 50 e0 51 .............P.Q ffffae01`5ff97674 00 c0 ff ff 56 57 da 56-0e f8 ff ff 08 50 e0 51 ....VW.V.....P.Q ffffae01`5ff97684 00 c0 ff ff 00 00 00 00-0e f8 ff ff 00 00 00 00 ................ ffffae01`5ff97694 00 c0 ff ff aa 80 bc ff-01 ae ff ff 10 77 f9 5f .............w._ ffffae01`5ff976a4 01 ae ff ff 40 00 00 00-00 e6 ff ff 10 dc 30 55 ....@.........0U ffffae01`5ff976b4 00 c0 ff ff a0 77 f9 5f-01 ae ff ff f0 76 f9 5f .....w._.....v._ ffffae01`5ff976c4 01 ae ff ff ca 59 da 56-0e f8 ff ff 00 00 00 00 .....Y.V........ ffffae01`5ff976d4 00 00 00 00 28 00 00 00-00 00 00 00 02 00 00 00 ....(...........Az df lebegőpontos beállítással az adatokat egy pontosságú lebegőpontos számként (4 bájt) jelenítheti meg.
df ffffb780`b7eee664 ffffb780`b7eee664 -1.#QNAN 3.3631163e-044 0 -2775.002 ffffb780`b7eee674 -1.#QNAN -5.8032637e+019 -1.#QNAN -2775.002 ffffb780`b7eee684 -1.#QNAN 0 -1.#QNAN 0 ffffb780`b7eee694 -1.#QNAN -1.#QNAN -1.#QNAN -2.8479408e-005
Írás a memóriába
A memória olvasásához használt parancsokhoz hasonlóan az e* parancsokkal módosíthatja a memória tartalmát.
| Parancs | Leírás |
|---|---|
darab |
ASCII-sztring (nem NULL-végződésű) |
Eu |
Unicode-sztring (nem NULL-végződésű |
Ew |
Word-értékek (2 bájt) |
eza |
NULL-végződésű ASCII-sztring |
ezu |
NULL-végződésű Unicode-sztring |
Eb |
Bájtértékek |
Ed |
Kétszavas értékek (4 bájt) |
Az alábbi példa bemutatja, hogyan írhatja felül a memóriát.
Először keresse meg a mintakódban használt lVolume címét.
kd> ? lVolume Evaluate expression: -79711507126684 = ffffb780`b7eee664Írja felül ezt a memóriacímet új karakterekkel az eb paranccsal.
kd> eb 0xffffb780`b7eee664 11 11 11 11 11A memória helyének megjelenítésével ellenőrizheti, hogy a karakterek felülírva lettek-e a db-parancs beírásával.
kd> db 0xffffb780`b7eee664 ffffb780`b7eee664 11 11 11 11 11 00 00 00-00 00 00 00 08 70 2d c5 .............p-. ffffb780`b7eee674 8e c9 ff ff 56 57 49 e0-0e f8 ff ff 08 70 2d c5 ....VWI......p-. ffffb780`b7eee684 8e c9 ff ff 00 00 00 00-0e f8 ff ff 00 00 00 00 ................ ffffb780`b7eee694 8e c9 ff ff 00 00 a0 ff-80 b7 ff ff 10 e7 ee b7 ................ ffffb780`b7eee6a4 80 b7 ff ff 00 00 00 00-00 00 00 00 60 72 47 c7 ............`rG. ffffb780`b7eee6b4 8e c9 ff ff a0 e7 ee b7-80 b7 ff ff f0 e6 ee b7 ................ ffffb780`b7eee6c4 80 b7 ff ff ca 59 49 e0-0e f8 ff ff 00 00 00 00 .....YI......... ffffb780`b7eee6d4 00 00 00 00 28 00 00 00-00 00 00 00 02 00 00 00 ....(...........
Másik lehetőségként módosíthatja a memória tartalmát egy óra vagy helyi ablakban. Az óraablakban olyan változók jelenhetnek meg, amelyek nincsenek az aktuális keret kontextusában. A módosításuk nem releváns, ha nincsenek a kontextusban.
13. szakasz: A WinDbg-munkamenet befejezése
<-A hosztrendszeren
Ha szeretné csatlakoztatva hagyni a hibakeresőt, de a cél számítógépen kíván dolgozni, törölje a töréspontokat a bc *használatával, hogy a célszámítógép ne próbáljon csatlakozni a gazdagép hibakeresőjéhez. Ezután a g paranccsal hagyja újra futtatni a célszámítógépet.
A hibakeresési munkamenet befejezéséhez a gazdarendszeren szakítsa meg a hibakeresőt, és adja meg a qd (Kilépés és leválasztás) parancsot, vagy válassza a menüből a Hibakeresés leállítása lehetőséget.
0: kd> qd
További információ: Hibakeresési munkamenet befejezése a WinDbgben (klasszikus) a hibakeresési referenciadokumentációban.
14. szakasz: Windows hibakeresési erőforrások
További információk a Windows hibakereséséről érhetők el. Vegye figyelembe, hogy egyes könyvek a Windows régebbi verzióit, például a Windows Vista-t használják a példáikban, de a tárgyalt fogalmak a Windows legtöbb verziójára érvényesek.
Könyvek
Mario Hewardt és Daniel Pravat speciális Windows-hibakeresési
A Windowson belüli hibakeresés: Gyakorlati útmutató Tarik Soulami windowsos® hibakeresési és nyomkövetési stratégiáihoz
Windows Internals by Pavel Yosifovich, Alex Ionescu, Mark Russinovich és David Solomon
Videó
A töredezettségmentesítési eszközök Show WinDbg Episodes 13-29: </shows/defrag-tools/>
Betanítási szállítók:
OSR – https://www.osr.com/