Řešení pádů operačního systému "post mortem"

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.

Proč to padá ?

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.

Pád operačního systému

Co budeme analyzovat

Konfigurace systémového crash dumpu

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.

Čím budeme analyzovat

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.

Jak budeme analyzovat

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.

Příklady z praxe

Hledání příčiny pádu si předvedeme na dvou příkladech z mé praxe

Příklad první

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.

Příklad druhý

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.

Shrnutí

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.

Dvě perličky na závěr

Manuální shození systému

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.

Blue-Screen spořič obrazovky

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.