UncleFather » 13 май 2013 20:45, Пн
Проблема:
Компьютер при загрузке 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.
Пакет устанавливается в папки:
Подробнее читаем статью «Debugging Tools for Windows (WinDbg, KD, CDB, NTSD)».
Зеркало прямо здесь:
-
Создать на рабочем компьютере папку, например «Dumps», например, в корне диска C:\
-
Распаковать в эту папку скрипт «kdfe», который написал Александр Суховей и опубликовал на ресурсе sysadmins.ru:
Код: Выделить всё
::=====================================================================
:: 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 и выше я немного подредактировал скрипт:
Код: Выделить всё
::=====================================================================
:: 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» указав в качестве аргумента командной строки имя файла дампа, например:
-
Дождаться окончания выполнения скрипта и проанализировать полученный результат:
в этом случае можно проанализировать файл 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
Если нет желания докапываться до причины: проблемы, то, как правило, помогает восстановление файлов реестра из резервной копии как описано в статье.
Дополнение:
Программы для анализа файлов дампов:
[b][size=150]Проблема:[/size][/b]
Компьютер при загрузке Windows начал падать в «синий экран» (он же «экран смерти», он же BSOD). Загрузиться невозможно.
Что делать? Как найти причину?
[hr][/hr]
[b][size=150]Решение:[/size][/b]
[list][*] Первым делом пробуем загрузиться с предыдущей удачной конфигурацией. Если получилось - хорошо, проблема загрузки решена, дальше уже начинаем анализировать систему - проверять на ошибки, вирусы и т.п.
[*] Если загрузиться с предыдущей удачной конфигурацией не получается, то смотрим код ошибки. Его возможно увидеть нажав при загрузке «[b][i]F8[/i][/b]» и выбрав пункт «[b][i]Отключить автоматическую перезагрузку при отказе системы[/i][/b]»
[list][*] Если видим какой-то конкретный код ошибки, который мы можем как-то самостоятельно интерпретировать, то пытаемся загрузиться в безопасном режиме (либо загружаемся с флешки/CD/DVD либо подключаем жесткий диск к другому, рабочему компьютеру) и устраняем причину падения в синий экран.
[*] Если код ошибки непонятен, например что-то такое:
[quote]BAD_POOL_CALLER - stop 0x000000c2 (0x00000007 0x00000cd4 0x02050003 0x86d68480)[/quote]
[attachment=8]bad_pool_caller.jpg[/attachment]
В этом случае необходимо проанализировать дампы памяти, автоматически созданные системой при сбое загрузки так, как расписано в статье «[url=http://support.microsoft.com/kb/315263]Интерпретация содержимого малого дампа памяти, создаваемого Windows для отладки[/url]». Вкратце для этого нужно:
[list=1][*] Скачать и установить на другой, рабочий компьютер [url=http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx]Debugging Tools for Windows[/url] непосредственно с сайта Microsoft либо отсюда:
[attachment=10]DebugTool.rar[/attachment], либо воспользоваться аналогичной программой. [i]Список таких программ приведен внизу этого поста.[/i]
[b][i][size=120]Для MS Windows 8.0 и выше[/size][/i][/b] качаем и устанавливаем [url=http://go.microsoft.com/fwlink/p?LinkID=271979]Windows SDK[/url]. При установке оставляем галочку только на [b][i]Debugging Tools for Windows[/i][/b].
Пакет устанавливается в папки:[list]
[*] [b][i]C:\Program Files (x86)\Windows Kits\8.x\Debuggers\x64[/i][/b]
[*] [b]C:\Program Files (x86)\Windows Kits\8.x\Debuggers\x86[/b][/list]
Подробнее читаем статью «[url=https://msdn.microsoft.com/library/windows/hardware/ff551063(v=vs.85).aspx]Debugging Tools for Windows (WinDbg, KD, CDB, NTSD)[/url]».
Зеркало прямо здесь:[attachment=0]sdksetup.rar[/attachment]
[*] Создать на рабочем компьютере папку, например «[i][b]Dumps[/b][/i]», например, в корне диска [i][b]C:\[/b][/i]
[*] Распаковать в эту папку скрипт «[i][b]kdfe[/b][/i]», который написал Александр Суховей и опубликовал на ресурсе [url=http://sysadmins.ru/post7180058.html#7180058]sysadmins.ru[/url]:
[attachment=9]kdfe.rar[/attachment]
[spoiler title=Листинг kdfe.cmd:][code]::=====================================================================
:: 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
::==========================[/code][/spoiler]
[b][i][size=120]Для MS Windows 8.0 и выше[/size][/i][/b] я немного подредактировал скрипт:
[attachment=1]kdfe.rar[/attachment]
[spoiler title=Листинг kdfe.cmd для Win 8.0 и выше (WinDbg):][code]::=====================================================================
:: 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
::==========================[/code][/spoiler]
[*] В эту же папку скопировать дампы с нерабочего компьютера. Это файлы:
[list] [*] [b][i]MiniMMDDYY-NN.dmp[/i][/b] из папки [b][i]%SystemRoot%\Minidump[/i][/b], где MMDDYY - дата, а NN - номер файла за текущий день - [b]для малого дампа памяти[/b]
[*] [b][i]Memory.dmp[/i][/b] из папки [b][i]%SystemRoot%[/i][/b] - [b]для дампа памяти ядра[/b]
[*] [b][i]Memory.dmp[/i][/b] из папки [b][i]%SystemRoot%[/i][/b] - [b]для полного дампа памяти[/b]
[*] Недокументированный путь и имя - [b][i]%SystemRoot%[/i][/b] файлы [b][i]DUMPXXXX.tmp[/i][/b][/list]
Пути и имена файлов, заданные по умолчанию можно менять в свойствах системы -> [b][i]Дополнительно[/i][/b] -> раздел «[b][i]Загрузка и восстановление[/i][/b]» -> [b][i]Параметры[/i][/b] -> раздел «[b][i]Запись отладочной информации[/i][/b]»
[*] Запустить скрипт «[i][b]kdfe[/b][/i]» указав в качестве аргумента командной строки имя файла дампа, например:
[code]kdfe Mini021212-01.dmp[/code]
[attachment=6]01.JPG[/attachment]
[*] Дождаться окончания выполнения скрипта и проанализировать полученный результат:
[attachment=7]KDFE.jpg[/attachment]
в этом случае можно проанализировать файл [b][i]Kl1.sys[/i][/b] и либо снести, либо временно отключить связанный с ним драйвер или программу.
если же получим такой результат:
[attachment=5]02.JPG[/attachment]
то все будет сложнее. Проверяем память и жесткий диск на ошибки, обновляем BIOS (сбрасываем его настройки к стандартным), сканируем комп на вирусы, проверяем температурные режимы, заменяем текущие файлы реестра [b][i]%SystemRoot%\System32\Config[/i][/b] на предыдущие версии из папки [b][i]System Volue Information[/i][/b], пытаемся откатить последние установленные драйверы... Вот статьи в помощь:
[list][*] [url=http://www.oszone.net/8736/Verifier]Использование средства проверки драйверов Windows[/url]
[*] [url=http://www.oszone.net/8724/Memory_Test]Диагностика оперативной памяти[/url]
[*] [url=http://www.oszone.net/8752/Test_HDD]Проверка и диагностика жесткого диска[/url][/list][/list][/list][/list]
[hr][/hr]
[b][size=120]Примечание:[/size][/b]
Дамп памяти системы настраивается в свойствах системы -> [b][i]Дополнительно[/i][/b] -> раздел «[b][i]Загрузка и восстановление[/i][/b]» -> [b][i]Параметры[/i][/b] -> раздел «[b][i]Запись отладочной информации[/i][/b]»:
[attachment=4]03.jpg[/attachment]
Для применения настроек сохранения дампа памяти через групповые политики, есть файл шаблона групповых политик:
[attachment=3]DumpSettings.rar[/attachment]
[spoiler title=Листинг файла шаблона:][code]#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="Полный путь файла дампа памяти ядра:"[/code][/spoiler]
После добавления этого шаблона в групповые политики, настройки дампа будут доступны в оснастке групповых политик -> [b][i]Конфигурация компьютера -> Административные шаблоны -> Система -> Отчет об ошибках -> Настройка записи отладочной информации (dump)[/i][/b]:
[attachment=2]01.JPG[/attachment]
[url=http://support.microsoft.com/kb/307973]Настройка параметров обработки сбоев и восстановления системы в Windows[/url]
[b][size=140][i]Если нет желания докапываться до причины:[/i][/size][/b] проблемы, то, как правило, помогает восстановление файлов реестра из резервной копии как описано в [url=http://manaeff.ru/forum/viewtopic.php?p=622]статье[/url].
[hr][/hr]
[b][size=150]Дополнение:[/size][/b]
Программы для анализа файлов дампов:
[list=][*] [url=http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx]Debugging Tools for Windows[/url]
[*] [url=https://apps.microsoft.com/detail/9pgjgd53tn86?rtc=1&hl=ru-ru&gl=RU]WinDbg[/url]
[*] [url=https://www.nirsoft.net/utils/blue_screen_view.html]BlueScreenView[/url][/list]