Проблема:
Компьютер при загрузке Windows начал падать в «синий экран» (он же «экран смерти», он же BSOD). Загрузиться невозможно.
Что делать? Как найти причину?
Решение:
-
Первым делом пробуем загрузиться с предыдущей удачной конфигурацией. Если получилось - хорошо, проблема загрузки решена, дальше уже начинаем анализировать систему - проверять на ошибки, вирусы и т.п.
-
Если загрузиться с предыдущей удачной конфигурацией не получается, то смотрим код ошибки. Его возможно увидеть нажав при загрузке «F8» и выбрав пункт «Отключить автоматическую перезагрузку при отказе системы»
-
Если видим какой-то конкретный код ошибки, который мы можем как-то самостоятельно интерпретировать, то пытаемся загрузиться в безопасном режиме (либо загружаемся с флешки/CD/DVD либо подключаем жесткий диск к другому, рабочему компьютеру) и устраняем причину падения в синий экран.
-
Если код ошибки непонятен, например что-то такое:
BAD_POOL_CALLER - stop 0x000000c2 (0x00000007 0x00000cd4 0x02050003 0x86d68480)
В этом случае необходимо проанализировать дампы памяти, автоматически созданные системой при сбое загрузки так, как расписано в статье «Интерпретация содержимого малого дампа памяти, создаваемого Windows для отладки». Вкратце для этого нужно:
-
Скачать и установить на другой, рабочий компьютер Debugging Tools for Windows непосредственно с сайта Microsoft либо отсюда:
, либо воспользоваться аналогичной программой. Список таких программ приведен внизу этого поста.
Для MS Windows 8.0 и выше качаем и устанавливаем Windows SDK. При установке оставляем галочку только на Debugging Tools for Windows.
Пакет устанавливается в папки:-
C:\Program Files (x86)\Windows Kits\8.x\Debuggers\x64
-
C:\Program Files (x86)\Windows Kits\8.x\Debuggers\x86
Подробнее читаем статью «Debugging Tools for Windows (WinDbg, KD, CDB, NTSD)».
Зеркало прямо здесь: -
-
Создать на рабочем компьютере папку, например «Dumps», например, в корне диска C:\
-
Распаковать в эту папку скрипт «kdfe», который написал Александр Суховей и опубликовал на ресурсе sysadmins.ru:
Листинг kdfe.cmd:
Код: Выделить всё
::===================================================================== :: Name: KDFE.CMD :: :: Purpose: Kernel debugger Front End. :: :: Usage: kdfe.cmd [dump_file] [-v] :: :: Version: 1.1 :: :: Technology: Windows Command Script :: :: Requirements: Windows 2000+ :: Debugging Tools for Windows :: reg.exe: :: Windows XP: built-in :: Windows 2000: install Windows Support Tools :: :: Authors: Alexander Suhovey (asuhovey@gmail.com) ::===================================================================== @echo off setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION if "%~1"=="-debug" (echo on&set debug=1&shift /1) set sver=1.1 echo. ::========================== :: Variables ::========================== ::Kernel debugger path. Default is: ::For version 6.8.4.0 - October 18, 2007 and older IF EXIST "%PROGRAMFILES%\Debugging Tools for Windows\kd.exe" ( set dbgpath="%PROGRAMFILES%\Debugging Tools for Windows" ) ELSE ( rem For version 6.9.3.113 - April 29, 2008 and newer rem 32 bit IF EXIST "%PROGRAMFILES%\Debugging Tools for Windows (x86)\kd.exe" ( set dbgpath="%PROGRAMFILES%\Debugging Tools for Windows (x86)" ) ELSE ( rem 64 bit IF EXIST "%PROGRAMFILES(x86)%\Debugging Tools for Windows (x86)\kd.exe" ( set dbgpath="%PROGRAMFILES(x86)%\Debugging Tools for Windows (x86)" ) ELSE ( IF EXIST "%PROGRAMW6432%\Debugging Tools for Windows (x64)\kd.exe" ( set dbgpath="%PROGRAMW6432%\Debugging Tools for Windows (x64)" ) ELSE ( echo ERROR: Debugging Tools for Windows not found^^! pause exit /b 1 ) ) ) ) :: Or set the path to Debugging Tools below :: set dbgpath="<path>" ::Symbols and executable images folders. If folders do not contain :: required files, kd.exe will download them from Microsoft Symbols :: Server as needed. set smbpath=%SYSTEMDRIVE%\symbols set imgpath=%smbpath% ::Microsoft Symbols Server URL. set smburl=http://msdl.microsoft.com/download/symbols set imgurl=%smburl% ::Windows Crash Control registry settings path. set ccregpath="HKLM\SYSTEM\CurrentControlSet\Control\CrashControl" ::Debugger parameters. set dbgparams=-y srv*"%smbpath:"=%"*%smburl% -i srv*"%imgpath:"=%"*%imgurl% -c if "%debug%"=="1" ( set dbgparams=%dbgparams% "^^^!sym noisy; .reload; ^^^!analyze -v; q" ) else ( set dbgparams=%dbgparams% "^^^!analyze -v; q" ) ::========================== :: Parse arguments ::========================== set dumpfile=&set v=& :PARSE set arg=%~1& shift /1 if not defined arg goto NEXT if defined v (if defined dumpfile goto NEXT) if "%arg%"=="/?" (goto SYNTAX) else (if "%arg%"=="-?" goto SYNTAX) if "%arg%"=="-v" (set verbose=1&goto PARSE) if not defined dumpfile (set dumpfile="%arg%"&goto PARSE) :NEXT ::========================== :: Checks ::========================== set dbgpath=%dbgpath:"=% for %%i in (reg.exe,"%dbgpath%\kd.exe") do ( if "%%~$PATH:i"=="" ( if not exist %%i ( echo ERROR: Cannot find required file '%%~i' pause goto :EOF ) ) ) ::========================== :: Main section ::========================== set /a n=0 if defined dumpfile ( if exist !dumpfile! ( for %%z in (!dumpfile!) do (set dumpfile="%%~dpnxz") call :ANALYZE !dumpfile! %verbose% ) else ( echo ERROR: Cannot find dump file !dumpfile! ) ) else ( for /f "tokens=2*" %%i in ('reg query %ccregpath% /v DumpFile 2^>^&1 ^| find "DumpFile"') do set kdump=%%j for /f "tokens=2*" %%k in ('reg query %ccregpath% /v MinidumpDir 2^>^&1 ^| find "MinidumpDir"') do set minidir=%%l if "!kdump!!minidir!"=="" echo ERROR: Cannot find required registry information^^!&pause&goto :EOF call :ENUMD "!kdump!" "!minidir!" if !n!==0 ( echo No crash dump files found with following search filter: echo !kdump! echo !minidir!\*.dmp ) else ( echo Following crash dump files found: echo. for /l %%n in (1,1,!n!) do (call :GETD %%n& echo %%n. !dumpfile!) echo. set /p foo="Which one would you like to analyze?[1-!n!] " for /l %%s in (1,1,!n!) do ( if !foo!==%%s ( call :GETD %%s call :ANALYZE !dumpfile! %verbose% pause goto :EOF ) ) echo. echo What was that? Have some coffee and try again. ) ) pause goto :EOF ::========================== :: Subroutines ::========================== :ANALYZE pushd "%dbgpath%" if "%2"=="1" (kd.exe -z %1 %dbgparams% 2>&1) else ( echo. set /p bar="Analyzing %1, please wait..."<nul for /f "delims=" %%r in ('kd.exe -z %1 %dbgparams% 2^>^&1') do ( set out=%%r if not "!out:PROCESS_NAME:=!"=="!out!" (set process=!out:PROCESS_NAME: =!) if not "!out:BUGCHECK_STR:=!"=="!out!" (set crashcode=!out:BUGCHECK_STR: =!) if not "!out:Debug session=!"=="!out!" (set crashdate=!out:Debug session time: =!) if "!out:~0,18!"=="Probably caused by" (set guess=%%r) ) echo Done.&echo. if defined guess ( echo. echo Crash date: !crashdate! echo Stop error code: !crashcode! if defined process echo Process name: !process! echo !guess: :=:! ) else ( echo Didn't find the answer. Try again with '-v' switch. ) ) popd goto :EOF :ENUMD if exist %1 (set /a n+=1&set !n!=%1) for %%m in ("%~2\*.dmp") do (set /a n+=1&set !n!="%%m") goto :EOF :GETD for /f "tokens=2 delims==" %%o in ('set %1 ^| find "%1="') do (set dumpfile=%%o&goto :EOF) goto :EOF :SYNTAX echo. echo Kernel Debugger Front End v%sver% echo. echo SYNTAX: echo. echo %~nx0 [dump_file] [-v] echo. echo dump_file - Crash dump file. If omitted, KDFE will search for crash echo dump files in locations configured on your computer and echo let you select a file to analyze. echo -v - Verbose output. By default KDFE shows only basic crash echo information and debugger's guess about crash cause. echo This switch will show full debugger session output. echo. echo EXAMPLES: echo. echo %~nx0 "c:\my dumps\memory.dmp" -v echo. echo REQUIREMENTS: echo. echo Debugging Tools for Windows echo. echo REFERENCES: echo. echo Debugging Tools for Windows: echo http://www.microsoft.com/whdc/devtools/debugging/default.mspx echo. echo Windows Hang and Crash Dump Analysis webcast by Mark Russinovich: echo http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032298075 echo. echo How to read small memory dump files: echo http://support.microsoft.com/kb/315263 echo. echo How to Use Driver Verifier to Troubleshoot Windows Drivers: echo http://support.microsoft.com/Default.aspx?kbid=244617 goto :EOF ::========================== :: End of script ::==========================
Для MS Windows 8.0 и выше я немного подредактировал скрипт:
Листинг kdfe.cmd для Win 8.0 и выше (WinDbg):
Код: Выделить всё
::===================================================================== :: Name: KDFE.CMD :: :: Purpose: Kernel debugger Front End. :: :: Usage: kdfe.cmd [dump_file] [-v] :: :: Version: 1.1 :: :: Technology: Windows Command Script :: :: Requirements: Windows 2000+ :: Debugging Tools for Windows :: reg.exe: :: Windows XP: built-in :: Windows 2000: install Windows Support Tools :: :: Authors: Alexander Suhovey (asuhovey@gmail.com) ::===================================================================== @echo off setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION if "%~1"=="-debug" (echo on&set debug=1&shift /1) set sver=1.1 echo. ::========================== :: Variables ::========================== ::Kernel debugger path. Default is: ::For version 6.8.4.0 - October 18, 2007 and older IF EXIST "%PROGRAMFILES%\Debugging Tools for Windows\kd.exe" ( set dbgpath="%PROGRAMFILES%\Debugging Tools for Windows" ) ELSE ( rem For version 6.9.3.113 - April 29, 2008 and newer rem 32 bit IF EXIST "%PROGRAMFILES%\Debugging Tools for Windows (x86)\kd.exe" ( set dbgpath="%PROGRAMFILES%\Debugging Tools for Windows (x86)" ) ELSE ( rem 64 bit IF EXIST "%PROGRAMFILES(x86)%\Debugging Tools for Windows (x86)\kd.exe" ( set dbgpath="%PROGRAMFILES(x86)%\Debugging Tools for Windows (x86)" ) ELSE ( IF EXIST "%PROGRAMW6432%\Debugging Tools for Windows (x64)\kd.exe" ( set dbgpath="%PROGRAMW6432%\Debugging Tools for Windows (x64)" ) ELSE ( IF EXIST "%PROGRAMFILES(x86)%\Windows Kits\8.1\Debuggers\x64\kd.exe" ( set dbgpath="%PROGRAMFILES(x86)%\Windows Kits\8.1\Debuggers\x64" ) ELSE ( echo ERROR: Debugging Tools for Windows not found^^! pause exit /b 1 ) ) ) ) ) :: Or set the path to Debugging Tools below :: set dbgpath="<path>" ::Symbols and executable images folders. If folders do not contain :: required files, kd.exe will download them from Microsoft Symbols :: Server as needed. set smbpath=%SYSTEMDRIVE%\symbols set imgpath=%smbpath% ::Microsoft Symbols Server URL. set smburl=http://msdl.microsoft.com/download/symbols set imgurl=%smburl% ::Windows Crash Control registry settings path. set ccregpath="HKLM\SYSTEM\CurrentControlSet\Control\CrashControl" ::Debugger parameters. set dbgparams=-y srv*"%smbpath:"=%"*%smburl% -i srv*"%imgpath:"=%"*%imgurl% -c if "%debug%"=="1" ( set dbgparams=%dbgparams% "^^^!sym noisy; .reload; ^^^!analyze -v; q" ) else ( set dbgparams=%dbgparams% "^^^!analyze -v; q" ) ::========================== :: Parse arguments ::========================== set dumpfile=&set v=& :PARSE set arg=%~1& shift /1 if not defined arg goto NEXT if defined v (if defined dumpfile goto NEXT) if "%arg%"=="/?" (goto SYNTAX) else (if "%arg%"=="-?" goto SYNTAX) if "%arg%"=="-v" (set verbose=1&goto PARSE) if not defined dumpfile (set dumpfile="%arg%"&goto PARSE) :NEXT ::========================== :: Checks ::========================== set dbgpath=%dbgpath:"=% for %%i in (reg.exe,"%dbgpath%\kd.exe") do ( if "%%~$PATH:i"=="" ( if not exist %%i ( echo ERROR: Cannot find required file '%%~i' pause goto :EOF ) ) ) ::========================== :: Main section ::========================== set /a n=0 if defined dumpfile ( if exist !dumpfile! ( for %%z in (!dumpfile!) do (set dumpfile="%%~dpnxz") call :ANALYZE !dumpfile! %verbose% ) else ( echo ERROR: Cannot find dump file !dumpfile! ) ) else ( for /f "tokens=2*" %%i in ('reg query %ccregpath% /v DumpFile 2^>^&1 ^| find "DumpFile"') do set kdump=%%j for /f "tokens=2*" %%k in ('reg query %ccregpath% /v MinidumpDir 2^>^&1 ^| find "MinidumpDir"') do set minidir=%%l if "!kdump!!minidir!"=="" echo ERROR: Cannot find required registry information^^!&pause&goto :EOF call :ENUMD "!kdump!" "!minidir!" if !n!==0 ( echo No crash dump files found with following search filter: echo !kdump! echo !minidir!\*.dmp ) else ( echo Following crash dump files found: echo. for /l %%n in (1,1,!n!) do (call :GETD %%n& echo %%n. !dumpfile!) echo. set /p foo="Which one would you like to analyze?[1-!n!] " for /l %%s in (1,1,!n!) do ( if !foo!==%%s ( call :GETD %%s call :ANALYZE !dumpfile! %verbose% pause goto :EOF ) ) echo. echo What was that? Have some coffee and try again. ) ) pause goto :EOF ::========================== :: Subroutines ::========================== :ANALYZE pushd "%dbgpath%" if "%2"=="1" (kd.exe -z %1 %dbgparams% 2>&1) else ( echo. set /p bar="Analyzing %1, please wait..."<nul for /f "delims=" %%r in ('kd.exe -z %1 %dbgparams% 2^>^&1') do ( set out=%%r if not "!out:PROCESS_NAME:=!"=="!out!" (set process=!out:PROCESS_NAME: =!) if not "!out:BUGCHECK_STR:=!"=="!out!" (set crashcode=!out:BUGCHECK_STR: =!) if not "!out:Debug session=!"=="!out!" (set crashdate=!out:Debug session time: =!) if "!out:~0,18!"=="Probably caused by" (set guess=%%r) ) echo Done.&echo. if defined guess ( echo. echo Crash date: !crashdate! echo Stop error code: !crashcode! if defined process echo Process name: !process! echo !guess: :=:! ) else ( echo Didn't find the answer. Try again with '-v' switch. ) ) popd goto :EOF :ENUMD if exist %1 (set /a n+=1&set !n!=%1) for %%m in ("%~2\*.dmp") do (set /a n+=1&set !n!="%%m") goto :EOF :GETD for /f "tokens=2 delims==" %%o in ('set %1 ^| find "%1="') do (set dumpfile=%%o&goto :EOF) goto :EOF :SYNTAX echo. echo Kernel Debugger Front End v%sver% echo. echo SYNTAX: echo. echo %~nx0 [dump_file] [-v] echo. echo dump_file - Crash dump file. If omitted, KDFE will search for crash echo dump files in locations configured on your computer and echo let you select a file to analyze. echo -v - Verbose output. By default KDFE shows only basic crash echo information and debugger's guess about crash cause. echo This switch will show full debugger session output. echo. echo EXAMPLES: echo. echo %~nx0 "c:\my dumps\memory.dmp" -v echo. echo REQUIREMENTS: echo. echo Debugging Tools for Windows echo. echo REFERENCES: echo. echo Debugging Tools for Windows: echo http://www.microsoft.com/whdc/devtools/debugging/default.mspx echo. echo Windows Hang and Crash Dump Analysis webcast by Mark Russinovich: echo http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032298075 echo. echo How to read small memory dump files: echo http://support.microsoft.com/kb/315263 echo. echo How to Use Driver Verifier to Troubleshoot Windows Drivers: echo http://support.microsoft.com/Default.aspx?kbid=244617 goto :EOF ::========================== :: End of script ::==========================
-
В эту же папку скопировать дампы с нерабочего компьютера. Это файлы:
-
MiniMMDDYY-NN.dmp из папки %SystemRoot%\Minidump, где MMDDYY - дата, а NN - номер файла за текущий день - для малого дампа памяти
-
Memory.dmp из папки %SystemRoot% - для дампа памяти ядра
-
Memory.dmp из папки %SystemRoot% - для полного дампа памяти
-
Недокументированный путь и имя - %SystemRoot% файлы DUMPXXXX.tmp
Пути и имена файлов, заданные по умолчанию можно менять в свойствах системы -> Дополнительно -> раздел «Загрузка и восстановление» -> Параметры -> раздел «Запись отладочной информации»
-
-
Запустить скрипт «kdfe» указав в качестве аргумента командной строки имя файла дампа, например:
Код: Выделить всё
kdfe Mini021212-01.dmp
-
Дождаться окончания выполнения скрипта и проанализировать полученный результат:
в этом случае можно проанализировать файл Kl1.sys и либо снести, либо временно отключить связанный с ним драйвер или программу.
если же получим такой результат:
то все будет сложнее. Проверяем память и жесткий диск на ошибки, обновляем BIOS (сбрасываем его настройки к стандартным), сканируем комп на вирусы, проверяем температурные режимы, заменяем текущие файлы реестра %SystemRoot%\System32\Config на предыдущие версии из папки System Volue Information, пытаемся откатить последние установленные драйверы... Вот статьи в помощь:
-
-
Примечание:
Дамп памяти системы настраивается в свойствах системы -> Дополнительно -> раздел «Загрузка и восстановление» -> Параметры -> раздел «Запись отладочной информации»:
Для применения настроек сохранения дампа памяти через групповые политики, есть файл шаблона групповых политик:
Листинг файла шаблона:
Код: Выделить всё
#if version >= 3
CLASS MACHINE
CATEGORY !!System
CATEGORY !!sErrorReports
POLICY !!Text
KEYNAME "SYSTEm\CurrentControlSet\Control\CrashControl"
EXPLAIN !!ExplDumps
PART !!sLogEvent CHECKBOX DEFCHECKED
VALUENAME "LogEvent"
VALUEON NUMERIC 1
VALUEOFF NUMERIC 0
END PART
PART !!sSendAlert CHECKBOX DEFCHECKED
VALUENAME "SendAlert"
VALUEON NUMERIC 1
VALUEOFF NUMERIC 0
END PART
PART !!sAutoReboot CHECKBOX DEFCHECKED
VALUENAME "AutoReboot"
VALUEON NUMERIC 1
VALUEOFF NUMERIC 0
END PART
PART !!sDumpType DROPDOWNLIST NOSORT
VALUENAME "CrashDumpEnabled"
ITEMLIST
NAME "Отсутствует" VALUE NUMERIC "0"
NAME "Малый дамп памяти (64КБ)" VALUE NUMERIC "3"
DEFAULT
NAME "Дамп памяти ядра" VALUE NUMERIC "2"
NAME "Полный дамп памяти" VALUE NUMERIC "1"
END ITEMLIST
END PART
PART !!sDumpFolder EDITTEXT REQUIRED DEFAULT "%SystemRoot%\Minidump"
VALUENAME "MinidumpDir"
MAXLEN 255
END PART
PART !!sDumpFile EDITTEXT REQUIRED DEFAULT "%SystemRoot%\MEMORY.DMP"
VALUENAME "DumpFile"
MAXLEN 255
END PART
PART !!sOverWrite CHECKBOX DEFCHECKED
VALUENAME "Overwrite"
VALUEON NUMERIC 1
VALUEOFF NUMERIC 0
END PART
END POLICY
END CATEGORY ;sErrorReports
END CATEGORY ;System
#endif
[Strings]
System="Система"
sErrorReports="Отчет об ошибках"
ExplDumps="Настройка записи отладочной информации (Дампа системы) при отказе системы BSOD"
sAutoReboot="Выполнить автоматическую перезагрузку при отказе системы"
Text="Настройка записи отладочной информации (dump)"
sDumpType="Тип записи отладочной информации:"
sDumpFolder="Папка для сохранения малых дампов памяти:"
sLogEvent="Записать событие в системный журнал"
sSendAlert="Отправить административное оповещение"
sOverWrite="Заменять существующий файл дампа"
sDumpFile="Полный путь файла дампа памяти ядра:"
После добавления этого шаблона в групповые политики, настройки дампа будут доступны в оснастке групповых политик -> Конфигурация компьютера -> Административные шаблоны -> Система -> Отчет об ошибках -> Настройка записи отладочной информации (dump):
Настройка параметров обработки сбоев и восстановления системы в Windows
Если нет желания докапываться до причины: проблемы, то, как правило, помогает восстановление файлов реестра из резервной копии как описано в статье.
Дополнение:
Программы для анализа файлов дампов: