Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Felhasználói módú kivételkezelés
Kivételek és töréspontok
A leggyakoribb alkalmazáshibákat kivételeknek nevezzük. Ezek közé tartoznak a hozzáférés-megsértések, a nulladik osztási hibák, a numerikus túlcsordulások, a CLR-kivételek és számos egyéb hiba. Az alkalmazások töréspont-megszakításokat is okozhatnak. Ezek akkor fordulnak elő, ha a Windows nem tudja futtatni az alkalmazást (például amikor egy szükséges modul nem tölthető be), vagy töréspontot tapasztal. A töréspontokat beszúrhatja a kódba egy hibakereső, vagy meghívhatja egy függvényen, például a DebugBreaken keresztül.
Kivételkezelők elsőbbsége
A Windows a konfigurációs értékek és az alapján, hogy mely hibakeresők aktívak, többféle módon kezeli a felhasználói módú hibákat. Az alábbi sorozat a felhasználói módú hibakezeléshez használt elsőbbséget mutatja be:
Ha egy felhasználói módú hibakereső jelenleg a hibás folyamathoz van csatolva, az összes hiba okozza, hogy a cél belépjen ebbe a hibakeresőbe.
Amíg a felhasználói módú hibakereső csatlakoztatva van, a rendszer nem használ más hibakezelési módszereket – még akkor sem, ha a gn (Go With Exception Not Handled) parancsot használja.
Ha nincs felhasználói módú hibakereső csatolva, és a végrehajtó kód saját kivételkezelési rutinokkal rendelkezik (például próbálja ki – kivéve), ez a kivételkezelési rutin megpróbálja kezelni a hibát.
Ha nincs felhasználói módú hibakereső csatlakoztatva, és a Windows nyitott kernel-hibakeresési kapcsolattal rendelkezik, és a hiba töréspont-megszakítás, a Windows megpróbál kapcsolatba lépni a kernel-hibakeresővel.
A rendszermag hibakeresési kapcsolatait a Windows rendszerindítási folyamata során kell megnyitni. Ha meg szeretné akadályozni, hogy egy felhasználói módú megszakítás betörjön a kernel hibakeresőjébe, használhatja a KDbgCtrl segédprogramot a -du paraméterrel. A kernel-hibakeresési kapcsolatok konfigurálásával és a KDbgCtrl használatával kapcsolatos részletekért tekintse meg a hibakeresés beállításának lépéseit.
A kernel-hibakeresőben a gh (Go With Exception Handled) használatával figyelmen kívül hagyhatja a hibát, és folytathatja a cél futtatását. A gn (Go With Exception Not Handled) használatával megkerülheti a kernel-hibakeresőt, és továbbléphet a 4. lépésre.
Ha az 1., 2. és 3. lépés feltételei nem érvényesek, a Windows aktiválja az AeDebug beállításjegyzék értékeiben konfigurált hibakereső eszközt. Előre bármely program kiválasztható eszközként ebben a helyzetben. A kiválasztott programot nevezik postmortem hibakeresőnek.
Ha az 1., 2. és 3. lépésben szereplő feltételek nem érvényesek, és nincs regisztrálva a postmortem hibakereső, a Windows Hibajelentés (WER) üzenetet jelenít meg, és megoldásokat biztosít, ha vannak ilyenek. A WER memóriadump fájlt is ír, ha a megfelelő értékek be vannak állítva a beállításjegyzékben. További információ: A WER használata és a User-Mode memóriaképek gyűjtése.
DebugBreak függvény
Ha telepített egy postmortem hibakeresőt, szándékosan be tud törni a hibakeresőbe egy felhasználói módú alkalmazásból a DebugBreak függvény meghívásával.
Postmortem hibakereső megadása
Ez a szakasz azt ismerteti, hogyan konfigurálhat olyan eszközöket, mint a WinDbg, a postmortem hibakereséshez. A konfigurálás után a rendszer automatikusan elindítja a postmortem hibakeresőt, amikor egy alkalmazás összeomlik.
Post Mortem hibakereső beállításkulcsok
A Windows Hibajelentés (WER) létrehozza a postmortem hibakereső folyamatot az AeDebug beállításkulcsban megadott értékekkel.
HKLM\Szoftver\Microsoft\Windows NT\CurrentVersion\AeDebug
Két elsődleges beállításjegyzék-érték van, a Hibakereső és az Auto. A Hibakereső beállításjegyzék-értéke megadja a postmortem hibakereső parancssorát. Az automatikus beállításjegyzék-érték megadja, hogy a postmortem hibakereső automatikusan elindul-e, vagy megjelenik-e először egy megerősítő üzenetmező.
Hibakereső (REG_SZ)
Ez a REG_SZ érték határozza meg azt a hibakeresőt, amely kezelni fogja a halál utáni hibakeresést.
A hibakereső teljes elérési útját fel kell sorolni, kivéve, ha a hibakereső az alapértelmezett elérési úton található könyvtárban található.
A parancssor egy 3 paramétert tartalmazó printf stílusú hívással jön létre a Hibakereső sztringből. Bár a rendelés rögzített, nincs szükség a rendelkezésre álló paraméterek vagy az összes paraméter használatára.
DWORD (%ld) – A célfolyamat folyamatazonosítója.
DWORD (%ld) – Az esemény-kezelő duplikálva lett a postmortem hibakeresési folyamatba. Ha a postmortem hibakereső jelzi az eseményt, a WER a célfolyamatot úgy folytatja, hogy nem várja meg a postmortem hibakereső leállását. Az eseményt csak akkor kell jelezni, ha a probléma megoldódott. Ha a postmortem hibakereső az esemény jelzése nélkül leáll, a WER folytatja a célfolyamatokkal kapcsolatos információk gyűjtését.
void* (%p) – A célfolyamat címterében lefoglalt JIT_DEBUG_INFO struktúra címe. A struktúra további kivételadatokat és kontextust tartalmaz.
Automatikus (REG_SZ) Ez a REG_SZ érték mindig 0 vagy 1.
Ha az Automatikus beállítás értéke 0, a postmortem hibakeresési folyamat elindítása előtt megjelenik egy megerősítő üzenetmező.
Ha az Automatikus beállítás értéke 1, a rendszer azonnal létrehozza a postmortem hibakeresőt.
Ha manuálisan szerkessze a beállításjegyzéket, ezt nagyon óvatosan végezze el, mert előfordulhat, hogy a beállításjegyzék helytelen módosítása nem teszi lehetővé a Windows rendszerindítását.
Példa parancssori használatra
Sok postmortem hibakereső olyan parancssort használ, amely -p és -e kapcsolókat tartalmaz annak jelzésére, hogy a paraméterek egy PID-et és egy eseményt (illetve) jelentenek. A WinDbg windbg.exe -I telepítése például a következő értékeket hozza létre:
Debugger = "<Path>\WinDbg -p %ld -e %ld -g"
Auto = 1
Rugalmasan használható a WER %ld %ld %p paraméterek. Például. nincs szükség a WER-paraméterek közötti kapcsolók megadására. A Windows Sysinternals ProcDumpprocdump.exe -i telepítése például a következő értékeket hozza létre a WER %ld %ld %p paraméterek közötti váltás nélkül:
Debugger = "<Path>\procdump.exe" -accepteula -j "c:\Dumps" %ld %ld %p
Auto = 1
32 és 64 bites hibakeresők
Egy 64 bites platformon a Hibakereső (REG_SZ) és az Automatikus (REG_SZ) beállításjegyzék értékei egyenként vannak definiálva a 64 bites és a 32 bites alkalmazásokhoz. Egy további Windows on Windows (WOW) kulcsot használnak a 32 bites alkalmazások post mortem hibakeresési értékeinek tárolására.
HKLM\Szoftver\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
64 bites platformon használjon egy 32 bites post-mortem hibakeresőt a 32 bites folyamatokhoz, és egy 64 bites hibakeresőt a 64 bites folyamatokhoz. Ezzel elkerülheti a 64 bites hibakeresőt, amely a WOW64 szálakra összpontosít a 32 bites szálak helyett egy 32 bites folyamat során.
Számos postmortem hibakereső esetében, beleértve a Windows postmortem hibakeresőinek hibakeresési eszközeit is, ez magában foglalja a telepítési parancs kétszeri futtatását; egyszer az x86-os és egyszer az x64-es verzióval. Ha például a WinDbg-et szeretné interaktív postmortem hibakeresőként használni, a windbg.exe -I parancs kétszer lesz futtatva, minden verzióhoz egyszer.
64 bites telepítés:
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe –I
Ez frissíti a beállításkulcsot ezekkel az értékekkel.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
Debugger = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -p %ld -e %ld –g
32 bites telepítés:
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe –I
Ez frissíti a beállításkulcsot ezekkel az értékekkel.
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
Debugger = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe" -p %ld -e %ld –g
Post Mortem hibakeresők konfigurálása
Hibakeresési eszközök Windowshoz
A Windows hibakereső eszközei mind támogatják, hogy utólagos hibakeresővé lehessenek beállítva. A telepítési parancs a folyamat interaktív hibakeresését tervezi.
WinDbg
Ha a postmortem hibakeresőt WinDbg értékre szeretné állítani, futtassa a következőt windbg -I: . (A I nagybetűsnek kell lennie.) Ez a parancs a használat után egy sikeres vagy sikertelen üzenetet jelenít meg. A 32 és a 64 bites alkalmazások használatához futtassa a 64 és a 32 hibakereső parancsát is.
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe –I
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe –I
Az AeDebug beállításjegyzék-bejegyzés így lesz konfigurálva, amikor a windbg -I fut.
Debugger = "<Path>\WinDbg -p %ld -e %ld -g"
Auto = 1
A példákban a <Elérési út> az a könyvtár, ahol a hibakereső található.
A -p és -e paraméterek a korábban tárgyalt folyamatazonosítót és eseményt adják át.
A -g átadja a g (Go) parancsot a WinDbg-nek, és folytatja a végrehajtást az aktuális utasításból.
Jegyzet Jelentős probléma merült fel a g (Go) parancs átadásával kapcsolatban. Ezzel a megközelítéssel az a probléma, hogy a kivételek nem mindig ismétlődnek, általában egy átmeneti feltétel miatt, amely már nem létezik a kód újraindításakor. A problémáról további információt a .jdinfo (JIT_DEBUG_INFO használata) című témakörben talál.
A probléma elkerülése érdekében használja a .jdinfo vagy a .dump /j parancsot. Ez a módszer lehetővé teszi, hogy a hibakereső az érdeklődésre számot tartó kódhiba kontextusában legyen. További információ: Just In Time (JIT) Hibakeresés a jelen témakör későbbi részében.
CDB
Ha a postmortem hibakeresőt CDB-re szeretné állítani, futtassa a cdb -iae (Install AeDebug) vagy cdb -iaecKeyString (Az AeDebug telepítése paranccsal) parancsot.
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe -iae
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe -iae
Az -iaec paraméter használatakor a KeyString egy sztringet ad meg, amelyet hozzá kell fűzni a parancssor végéhez a postmortem hibakereső elindításához. Ha a KeyString szóközöket tartalmaz, idézőjelek közé kell tenni.
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe -iaec [KeyString]
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe -iaec [KeyString]
Ez a parancs nem jelenít meg semmit, ha sikeres, és hibaüzenet jelenik meg, ha sikertelen.
NTSD
Ha a postmortem hibakeresőt NTSD-re szeretné állítani, futtassa az ntsd -iae (Install AeDebug) vagy az ntsd -iaecKeyString (Az AeDebug telepítése a paranccsal) parancsot.
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\ntsd.exe -iae
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\ntsd.exe -iae
Az -iaec paraméter használatakor a KeyString egy sztringet ad meg, amelyet hozzá kell fűzni a parancssor végéhez a postmortem hibakereső elindításához. Ha a KeyString szóközöket tartalmaz, idézőjelek közé kell tenni.
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\ntsd.exe -iaec [KeyString]
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\ntsd.exe -iaec [KeyString]
Ez a parancs nem jelenít meg semmit, ha sikeres, és a hibát egy új konzolablakban jeleníti meg sikertelenség esetén.
Jegyzet Mivel a -p %ld -e %ld -g paraméterek mindig az elsőként jelennek meg a postmortem hibakereső parancssorában, a -iaec kapcsolóval ne adja meg a -server paramétert, mert -server csak akkor működik, ha az elsőként jelenik meg a parancssorban. A paramétert tartalmazó postmortem hibakereső telepítéséhez manuálisan kell szerkesztenie a beállításjegyzéket.
Visual Studio JIT Hibakereső
Ha a Visual Studio telepítve van, vsjitdebugger.exe regisztrálva lesz a post mortem hibakeresőként. A Visual Studio JIT Debugger azt tervezi, hogy a folyamatot interaktív módon hibakeresésre szánja.
Debugger = "C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld
Ha a Visual Studio frissül vagy újra telepítve van, a bejegyzés újra meg lesz írva, felülírva az esetleges alternatív értékeket.
Windows Sysinternals ProcDump
A Windows Sysinternals ProcDump segédprogram utólagos memória-dump rögzítésére is használható. A ProcDump használatával és letöltésével kapcsolatos további információkért lásd: ProcDump.
A .dump WinDbg parancshoz hasonlóan a ProcDump nem interaktív módon képes rögzíteni az összeomlás memóriaképét. A rögzítés bármely Windows-rendszer munkamenetben előfordulhat.
A ProcDump a memóriaképfájl-rögzítés befejezésekor kilép, a WER ezután jelenti a hibát, és a hibafolyamat leáll.
Használja a procdump -i jelölőt a ProcDump telepítéséhez és a -u jelölőt a ProcDump eltávolításához, mind a 32, mind a 64 bites post mortem hibakereséshez.
<Path>\procdump.exe -i
A telepítési és eltávolítási parancsok a sikeres módosításkor a beállításjegyzék megváltozott értékeit, hibás esetben pedig a hibákat adják meg.
A BeállításjegyzékBen a ProcDump parancssori beállításai a következőkre vannak beállítva:
Debugger = <Path>\ProcDump.exe -accepteula -j "<DumpFolder>" %ld %ld %p
A ProcDump mind a 3 paramétert használja : PID, Event és JIT_DEBUG_INFO. A JIT_DEBUG_INFO paraméterről további információt alább a Just In Time (JIT) hibakeresésében talál.
A rögzített memóriaképek mérete alapértelmezés szerint Mini (folyamatok/szálak/fogantyúk/modulok/címtér) méretbeállítás nélkül, MiniPlus (Mini plusz MEM_PRIVATE oldalak) esetén -mp beállítással, vagy Teljes (az összes memória – egyenértékű a ".dump /mA"-val) esetén -ma beállítással.
A megfelelő meghajtótérrel rendelkező rendszerek esetében a Teljes (-ma) rögzítés ajánlott.
Használja a(z) -ma-t a(z) -i beállítással az összes memóriarögzítés megadásához. Igény szerint adja meg a kimeneti fájlok elérési útját.
<Path>\procdump.exe -ma -i c:\Dumps
A korlátozott meghajtótérrel rendelkező rendszerek esetében miniPlus (-mp) rögzítés használata ajánlott.
<Path>\procdump.exe -mp -i c:\Dumps
A memóriaképfájl mentéséhez szükséges mappa nem kötelező. Az alapértelmezett mappa az aktuális mappa. A mappát olyan ACL-vel kell védeni, amely egyenlő vagy jobb, mint a C:\Windows\Temp esetében használt. A mappákkal kapcsolatos biztonság kezelésével kapcsolatos további információkért lásd: Biztonság a postmortem hibakeresés során.
A ProcDump postmortem hibakeresőként való eltávolításához és az előző beállítások visszaállításához használja az -u (Eltávolítás) lehetőséget.
<Path>\procdump.exe -u
A ProcDumpról további információt Mark Russinovich és Aaron Margosis, a Microsoft Press által kiadott ProcDump - és Windows SysInternals-rendszergazdai referenciájában talál.
Just In Time (JIT) hibakeresés
Környezet beállítása a hibás alkalmazáshoz
Korábbi megbeszélés szerint nagyon kívánatos a JIT_DEBUG_INFO paraméter használatával a környezetet az összeomlást okozó kivételhez igazítani. Erről további információt a .jdinfo (JIT_DEBUG_INFO használata) című témakörben talál.
Windows hibakeresési eszközei
Ez a példa bemutatja, hogyan szerkesztheti a beállításjegyzéket egy kezdeti parancs (-c) futtatásához, amely a .jdinfo <címparancsot> használja a további kivételadatok megjelenítéséhez, és hogyan módosíthatja a környezetet a kivétel helyére (hasonlóan ahhoz, ahogyan az .ecxr használatával a környezet a kivételrekordra van állítva).
Debugger = "<Path>\windbg.exe -p %ld -e %ld -c ".jdinfo 0x%p"
Auto = 1
A %p paraméter egy JIT_DEBUG_INFO struktúra címe a célfolyamat címterében. A %p paraméter előre hozzá van fűzve a 0x értékhez, így hexa értékként van értelmezve. További információ: .jdinfo (Use JIT_DEBUG_INFO).
A 32 és 64 bites alkalmazások kombinációjának hibakereséséhez konfigurálja a 32 és a 64 bites beállításkulcsokat is (a fent leírtak szerint), és állítsa be a megfelelő elérési utat a 64 bites és a 32 bites WinDbg.exehelyéhez.
Memóriaképfájl létrehozása .dump használatával
Ha a JIT_DEBUG_INFO adatokat tartalmazó hiba esetén memóriaképfájlt szeretne rögzíteni, használja a .dump /j <címet>.
<Path>\windbg.exe -p %ld -e %ld -c ".dump /j %p /u <DumpPath>\AeDebug.dmp; qd"
A /u beállítással egyedi fájlnevet hozhat létre, amely lehetővé teszi több memóriaképfájl automatikus létrehozását. A beállításokkal kapcsolatos további információkért lásd: .dump (Create Dump File).
A létrehozott memóriakép alapértelmezett kivételkörnyezetként tárolja a JITDEBUG_INFO adatokat. A .jdinfo helyett a kivételinformációk megtekintéséhez és a környezet beállításához használja a .exr -1 a kivételrekord megjelenítéséhez, a .ecxr pedig a környezet beállításához. További információ: .exr (Display Exception Record) és .ecxr (Display Exception Context Record).
Windows hibajelentés – q/qd
A hibakeresési munkamenet vége határozza meg, hogy a Windows hibajelentés jelenti-e a hibát.
Ha a hibakeresési munkamenet le van választva a qd használatával a hibakereső bezárása előtt, a WER jelenti a hibát.
Ha a hibakeresési munkamenet a q használatával van kilépve (vagy ha a hibakereső leválasztás nélkül bezárul), a WER nem jelenti a hibát.
Hozzáfűzés ; q vagy ; qd a parancssztring végéig a kívánt viselkedés meghívásához.
Ha például lehetővé szeretné tenni, hogy a WER jelentse a hibát, miután a CDB rögzített egy memóriaképet, konfigurálja ezt a parancssort.
<Path>\cdb.exe -p %ld -e %ld -c ".dump /j 0x%p /u c:\Dumps\AeDebug.dmp; qd"
Ez a példa lehetővé teszi, hogy a WER jelentse a hibát, miután a WinDbg rögzített egy memóriaképet.
<Path>\windbg.exe -p %ld -e %ld -c ".dump /j %p /u <DumpPath>\AeDebug.dmp; qd""
Biztonsági rések
Ha azt fontolgatja, hogy engedélyezi a postmortem hibakeresést egy olyan számítógépen, amelyet másokkal közösen használ, olvassa el a Biztonság a postmortem hibakeresés során című témakört.