Platforma Windows NT se během 15ti let vývoje stala velmi stabilní a vyzrálou řadou operačních systémů. Protože ale stabilitu operačního systému ovlivňují také ovladače (jak od Microsoftu, tak i od třetích stran), občas se stane, že v jádře operačního systému nastane chyba a systém skončí tzv. modrou obrazovkou smrti (Blue Screen of Death, BSOD). Tento článek je úvodem do problematiky analýzy příčin pádu operačního systému a je určen jak pro programátory ovladačů, tak i pro pokročilé administrátory.
Příčin pádu operačního systému může být několik. Jednak to mohou být harwarové problémy (přetaktovaná komponenta, nekompatibilita), softwarové problémy (chyby v ovladačích, konflikty dvou nebo více SW nebo v chyby operačním systému) a nakonec pád některého z kritických procesů operačního systému (např. winlogon.exe, smss.exe, csrss.exe). V tomto článku se zaměříme na analýzu pádů způsobených ovladači a na vyhledání ovladače který chybu způsobil.
Všechny operační systémy Windows řady NT mají v sobě zabudovanou schopnost při svém pádu vygenerovat tzv. crash dump, který obsahuje podrobné informace o příčině pádu, komponentě, kde nastala chyba, seznamu běžících procesů a threadů. Tuto metodu používají k diagnostice chyb i vývojáři operačního systému v Microsoftu. Konfiguraci crash dumpu provedeme ve vlastnostech systému ("My Computer\Properties\Advanced\Startup and Recovery settings", skupina "System failure"). Obr. vpravo ukazuje dialog s nastavením pro operační systém Windows XP SP2.
Pokud spadne systém a generování dumpu je zapnuto, většinou uvidíme hlášení o výpisu paměti ("počitadlo" od 0 do 100). V případě minidumpu je vytvoření dumpu velmi ryché a uživatel většinou nic nepostřehne. Po restartu systému je možné v nastavené složce nalézt soubor s příponou .DMP (memory.dmp, Mini032705-01.dmp), který je potřeba k analýze.
Pokud k pádu systému dochází velmi často nebo brzy po startu systému, není většinou možné dump analyzovat nebo zkopírovat. V takovém případě zkuste nastartovat systém v nouzovém režimu, systémový disk z počítače připojte do jiného PC a soubor zkopírujte nebo použijte některý z nástrojů pro start systému z CD.
Poznámka: Pokud máme nastaven větší dump, je možné, že zápis do souboru DMP bude dokončen až po restartu systému. Je dobré po nastartování a přihlášení chvíli počkat nebo ověřit, zda se velikost souboru DMP nezvětšuje.
K analýze vygenerovaného crash dumpu potřebujeme Debugging Tools for Windows (podobně jako pro analýzu aplikačního dumpu. Debugging Tools for Windows jsou dostupné zdarma na webu Microsoftu. Velikost instalačního balíčku je asi 11 MB. Aplikaci nainstalujte s výchozími volbami.
Dále je potřeba nakonfigurovat tzv. Symbol Server. Symbol Server je databáze PDB souborů (symbolů) pro binárky operačního systému, např. ntoskrnl.exe. Ačkoliv jsou tyto PDB symboly dostupné jako balíček na webu Microsoftu a také v rámci MSDN, po instalaci záplaty operačního systému přestanou odpovídat symboly ke komponentám jejichž nové verze byly při aplikaci záplaty nainstalovány. Nakonfigurováním WinDbg pro použití Symbol Serveru zajistíme, že při potřebě symbolů k operačnímu systému si WinDbg stáhne z webu Microsoftu souboru symboly přesně k té verzi, kterou máte na počítači nainstalovanou.
Spustíme aplikaci WinDbg z balíčku Debugging Tools for Windows a otevřeme vygenerovaný crash dump. (File\Open crash dump). Do příkazového řádku debuggeru zadáme příkaz "!analyze -v", který vypíše informace o příčině pádu systému. Pro zjištění komponenty pravděpodobně odpovědné za pád systému je dobré prozkoumat tzv. call stack, který je vypsán jako součást analýzy. Call stack obsahuje sekvenci volaných funkcí jádra a ovladačů, které vedly k pádu systému.
Hledání příčiny pádu si předvedeme na dvou příkladech z mé praxe
V prvním případě šlo o notebook, který po čisté instalaci systému končil pádem do modré obrazovky. Vzhledem k tomu, že již při instalaci systému byl nakonfigurován minidump, nebylo nutné provádět nastavení crash dumpu. Crash dump z notebooku byl zkopírován do jiného počítače a byla provedena analýza. Call stack vypsaný programem WinDbg vypadal takto:
STACK_TEXT: f997f92c efec3a2d 813694a0 00000000 000000c4 0x0 WARNING: Stack unwind information not available. Following frames may be wrong. f997f954 f8d80506 e1173820 f997f9a8 000000c4 ialmsbw+0x2a2d f997f9a0 f8d80948 ffba09c8 ff8b7780 ffb76978 wA301a+0x5506 f997f9e0 805101a7 ffb76978 ff8b7780 e129a350 wA301a+0x5948 f997f9f8 805c8b23 f8d807e0 00000004 00000001 nt!PpvUtilCallAddDevice+0x41 f997fac0 805adead 00000000 02000001 00000000 nt!PipCallDriverAddDevice+0x3b9 f997fd1c 8061ab9f ff8a5780 00000001 00000000 nt!PipProcessDevNodeTree+0x1a4 f997fd4c 8050cdff 00000003 80558c40 80561b7c nt!PiRestartDevice+0x80 f997fd74 804e47fe 00000000 00000000 8133dda8 nt!PipDeviceActionWorker+0x15e f997fdac 8057dfed 00000000 00000000 00000000 nt!ExpWorkerThread+0x100 f997fddc 804fa477 804e4729 00000001 00000000 nt!PspSystemThreadStartup+0x34 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
Z výpisu vidíme, že příčina pádu byla v ovladači ialmsbw. Zobrazením vlastností ovladače a jeho výrobce bylo zjištěno, že jde o ovladač integrované grafické karty Intel pro notebooky. Stažení nejnovějších ovladačů z webu Intelu pomohlo vyřešit problém.
Po nainstalování antivirového programu AVG od společnosti Grisoft se operační systém zhroutil v momentě, kdy při zavádění systému začínala komunikace se síťovým serverem (po zadání přoihlašovacího jména a hesla). Počítač byl připojen k serveru Novell Netware pomocí síťového klienta dodávaného Microsoftem spolu s Windows XP. Analýza pádu systému zobrazila následující call stack:
STACK_TEXT: f2ccd768 f2b4d1eb ffae0038 f2ccd78c f2ccd790 nwrdr!NwDecodeFileObject+0x18 f2ccd7b0 f2b4d286 8115c430 ffa87a00 ffa33750 nwrdr!NwCommonCleanup+0x29 f2ccd7f0 804e3d77 ffb5ba58 ffa87a00 8131f520 nwrdr!NwFsdCleanup+0x36 f2ccd800 f9efd99d 804e3d77 ffa93590 ffa87a00 nt!IopfCallDriver+0x31 f2ccd804 804e3d77 ffa93590 ffa87a00 00000100 oaFile!oaPassThrough+0x3 f2ccd814 fa24ddc2 ffae0038 ffa1e750 ffa87a10 nt!IopfCallDriver+0x31 WARNING: Stack unwind information not available. Following frames may be wrong. f2ccd82c fa24cff1 ffb4bb88 ffb4bc40 804e3d77 avg7rsxp+0x1dc2 f2ccd890 80567391 8131c020 ffb51a38 00000001 avg7rsxp+0xff1 f2ccd8c0 8056753b 8131c020 ffae0038 8133fad0 nt!ObpDecrementHandleCount+0x119 f2ccd8e8 805675ac e1000cf0 ffae0038 000004a0 nt!ObpCloseHandleTableEntry+0x14d f2ccd930 8056a914 000004a0 00000000 00000001 nt!ObpCloseHandle+0x87 f2ccd944 8052d8dc 800004a0 00000000 ffae1808 nt!ObCloseHandle+0x12 f2ccd978 80615497 ffae0038 800004a0 00000000 nt!IoCreateStreamFileObjectEx+0x109 f2ccd98c fa24d8b9 ffae1808 00000000 ffb0d828 nt!IoCreateStreamFileObject+0x12 f2ccd9e8 fa24dcd8 ffae1808 ffb0d828 ffa93590 avg7rsxp+0x18b9 f2ccda10 fa24cff1 ffb4bb88 ffb4bc40 804e3d77 avg7rsxp+0x1cd8 f2ccdb20 f9efcd52 ffb5ba58 00000000 ff9e94e8 avg7rsxp+0xff1 f2ccdb50 8056386c ffb5ba58 00000000 ff9e94e8 oaFile!oaParseDevice+0x14 f2ccdbd8 80567c63 00000000 f2ccdc18 00000040 nt!ObpLookupObjectName+0x56a f2ccdc2c 80571477 00000000 00000000 642d5501 nt!ObOpenObjectByName+0xeb f2ccdca8 80571546 011cf6d0 00100001 011cf528 nt!IopCreateFile+0x407 f2ccdd04 8057160e 011cf6d0 00100001 011cf528 nt!IoCreateFile+0x8e f2ccdd44 804df06b 011cf6d0 00100001 011cf528 nt!NtOpenFile+0x27 f2ccdd44 7c90eb94 011cf6d0 00100001 011cf528 nt!KiFastCallEntry+0xf8 011cf0e4 00000000 00000000 00000000 00000000 0x7c90eb94
Ve výpisu se objevuje jádro operačního systému ("nt"), online skenovací ovladač AVG ("avg7rsxp"), souborový filtr produktu OptimAccess ("oafile") a také ovladač síťového redirektoru ("nwrdr"). Informace o ovladačích byla získána zobrazením vlastností příslušného souboru v C:\Windows\System32\drivers. Deaktivací redirektoru nebo skeneru AVG problém zmizel, deaktivace ovladače oafile neměla na výsledek vliv. Hlubší analýzou dumpu (která je nad rámec tohoto článku) a po konzultací s firmou Grisoft bylo zjištěno, že chyba je v ovladači nwrdr.sys, což bylo následně potvrzeno i vývojáři Microsoftu:
From: "Neal Christiansen" <nealch@windows.microsoft.com> To: "Windows File Systems Devs Interest List" <ntfsd@lists.osr.com> Sent: Tuesday, November 30, 2004 7:09 AM Subject: RE: [ntfsd] IoCreateStreamFileObject vs. MS Netware redirector Ladislav, I looked at the source to the MS version of the NetWare redirector and your analysis is correct. The code is wrongly assuming that FsContext and FsContext2 should already be setup. The fix is easy and straight forward. Unfortunately I can not simply go out and fix this in down-level OS's. If this is an issue for I would contact your Microsoft Support Person and request a fix. No one actually owns this driver anymore but you can tell them that I would be willing to make the fix. Neal Christiansen Microsoft File System Filter Group Lead This posting is provided "AS IS" with no warranties, and confers no rights
Jednalo se o kolizi obou produktů (AVG a Microsoftího klienta sítě Novell). Problém vyřešilo nainstalování klienta sítě Netware dodávaného společností Novell.
Pomocí analýzy crash dumpu vygenerovaného po pádu operačního systému je možné velmi dobře zjistit důvod nestability systému. Není možné v rámci tohoto článku popsat možnosti kompletní analýzy pádů operačního systému (tj. co přesně udělal ovladač špatně, že přivodil pád systému), nicméně často i jednoduchá analýza ve spojení s technickou podporou výrobce problematického software (nebo pouhé stažení novější verze ovladačů) pomůže problém vyřešit.
Pád operačního systému do modré obrazovky je možné ve Windows 2000 a novějších jednoduše provést i manuálně. Je třeba povolit manuální shození systému v klíči registru:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters] "CrashOnCtrlScroll"=dword:00000001
Po restartu systému podržte pravý Ctrl a dvakrát rychle za sebou stlačte klávesu Scroll Lock. Systém spadně do modré obrazovky a jako příčina pádu bude zobrazeno "Uživatel manuálně vygeneroval crash dump".
Upozornění: Neexperimentujte s pády operačního systému pokud nemáte souborový systém NTFS nebo pokud máte spuštěnou aplikaci s rozpracovanými daty. Při pádu systému hrozí poškození otevřených souborů, což může mít za následek ztrátu dat nebo v krajním případě nutnost reinstalace operačního systému.
Věhlasný programátor a znalec operačního systému Mark Russinovich systému napsal spořič obrazovky, který věrně simuluje pád operačního systému. Nejdříve je zobrazena modrá obrazovka a po chvíli věrohodně simulován restart včetně BIOSu a nabíhání operačního systému. Na rozdíl od skutečného restartu, ten simulovaný je možné přerušit jakoukoliv událostí myši nebo klávesnice. Spořič je možné zdarma stáhnout z http://www.sysinternals.com.
Copyright Ladislav Zezula 12.04.2005