Windows操作系统的许多用户迟早都需要找出为什么他们最喜欢的OS“陷入BSOD”的原因。
关于如何在Internet上查找原因以及如何解决该问题(取决于情况)的文章已经很多,但是如果我需要尽快找出原因并必须定期进行查找(例如服务论坛的工作人员或计算机论坛的常驻人员),该怎么办?

上下文菜单的臭名昭著的调整可以简化任务,因为它们非常简单。
准备工作首先,您需要使用windbg.exe调试器,kd.exe的控制台版本以及其他必要的内容来安装软件包。
这些是
X64 Debuggers and Tools-x64_en-us.msi或
X86 Debuggers and Tools-x86_en-us.msi软件包 ,可根据所使用的操作系统的位深度和/或个人喜好选择。
您不会在Microsoft网站上找到单独的链接,但是这些软件包是
Windows Driver Kit的一部分 ,您可以通过选择适当的安装程序模式来下载而不进行安装,下载完成后这些软件包将位于
\ Windows Kits \ 10 \ WDK \ Installers文件夹中。
如果有人需要,那么我将它们分别上传到I.磁盘:
X64调试器和工具-x64_zh-cn.msiX86调试器和工具-x86_zh-cn.msi我决定不安装调试器,而只是解压msi:
msiexec /a "D:\Desktop\X64 Debuggers And Tools-x64_en-us.msi" /qb targetdir="D:\Desktop\Temp"
这个“便携式”选项绰绰有余。 之后,为方便起见,我将所需的内容从几个子文件夹移至
C:\ Portable \ Debug ,
结果如下:
C:\Portable\Debug\windbg.exe
C:\Portable\Debug\kd.exe
+其他一切。 将来,我们将在这条道路上继续发展(为方便起见,我再次将其添加到%PATH%中)。
此时,可以认为准备措施已完成,并继续描述创建调整的过程。
由于我的任务假定存在很多转储,并且经常发生转储,因此我需要尽可能地加快流程的速度,同时又要为快速分析提供足够的信息。
处理键和调试器命令
作为将来调整的基础,让我们采用这样的批处理文件,在该文件上可以拖动所需的转储。
为了更好地理解信息,在我的理解中,我反转了控制台的颜色并将控制台窗口的大小设置为更大。
@echo off title text %1 mode con: cols=170 color F0 title "%1" kd.exe -nosqm -sup -z "%1" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -c ^ "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q"" pause exit /b
在这里,您可以看到kd.exe传输的参数,例如
-y ,
-i和
-z ,实际上是所有了解
kdfe.cmd的人(在狭窄的圈子中都知道)看到的。
-i !ImagePath! specifies the location of the executables that generated the fault (see _NT_EXECUTABLE_IMAGE_PATH) -y !SymbolsPath! specifies the symbol search path (see _NT_SYMBOL_PATH) -z !CrashDmpFile! specifies the name of a crash dump file to debug
如果我们以通用的指令作为类比,则有一些细微的差别:
-nosqm和
-sup另外作为参数传递。
-nosqm disables SQM data collection/upload. -sup enables full public symbol searches
作为团队:
!cpuid !sysinfo cpuinfo !sysinfo cpuspeed !sysinfo machineid
我不会绘画它们,因为会出现过多的复制粘贴。 有兴趣的人可以在上面提到的两个* .msi或docs.microsoft.com
-cpuid -sysinfo中找到
debugger.chm的详细帮助。 简而言之,有关受害者腺体的基本信息。
事实证明,使用kd.exe的脚本输出几乎与直接通过windbg工作时获得的输出相同,但是由于不需要打开任何内容,配置文件夹,通过菜单打开转储并将命令输入调试器,因此可以更快地获得结果。
从控制台过滤垃圾输出
对于第一个示例,我们来看一个随机用户的内存转储。 输出中有一个小问题:
例如,在使用odin激活器的用户转储中就可以找到它,我们在本示例中看到了这一点。
由于链接到
pastebin ,所以完整的输出非常庞大。
需要“过滤掉”不必要的行,仅留下有用的信息。
我使用了
findstr ,结果得出这样一个丑陋但可行的解决方案:
findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*"
在这里,findstr使用两个常规:一个搜索以三个星号开头,一个空格和一个空格和三个星号结尾的行。 第二个搜索以14星开头的行。 我对findstr没什么可理解的。
(我不建议在kd.exe上的findstr常规中使用行尾,否则kd.exe显示的行尾可能存在问题。代替
\ r \ n,您可能会发现
\ n findstr不考虑行尾。这对您自己很不利。)
初步批处理文件中带有“过滤器”的整个代码如下:
@echo off title text %1 mode con: cols=170 color F0 title "%1" kd.exe -nosqm -sup -z "%1" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols ^ -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" pause exit /b
过滤后版本的完整输出也位于
pastebin上 。
结果是相似的,但是没有“垃圾”。 290行文字和894行文字。 已经好了,但还不是全部。
快速调试器日志创建
下一步是添加日志,该日志可以发布或发送到某处。
为此,请将kd.exe参数-loga <“ P:\传递给\ log.log”>
该代码采用以下形式:
@echo off title text %1 mode con: cols=170 color F0 title "%1" set "D=%1" set L=%D:.dmp=.LOG% kd.exe -nosqm -sup -loga "%L%" -z "%D%" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols ^ -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" pause exit /b
将在与转储本身相同的文件夹中为文件
102516-21949-01.dmp生成日志
102516-21949-01.LOG 。
在这种情况下,“垃圾”输出到日志不会被过滤,只会过滤到控制台的输出,但是在我的情况下,这并不重要,尽管您可以在创建后通过清除日志来解决它:
@echo off title text %1 mode con: cols=170 color F0 title "%1" set "D=%1" set L=%D:.dmp=.LOG% kd.exe -nosqm -sup -loga "%L%" -z "%D%" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols ^ -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" set CL=%L:.LOG=_CLEAN.LOG% type "%L%" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" >> "%CL%" del /f /q "%L%" pause exit /b
在windbg中打开转储
现在是最后一个步骤,但并不是很重要:您需要能够直接将转储传输到windbg.exe,并立即将您可能需要输入的命令传递给它。 一切都通过类似于kd.exe的方式完成,windbg.exe接收到的参数和命令与kd.exe几乎相同
@echo off windbg.exe -z "%1" -sup -y ^ "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -i "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid" exit /b
结果,转储将立即在调试器中打开,并且
-c键中列出的命令将在其中自动执行。
结论与第一个选项相似,不同之处在于转储在windbg中立即打开,由于已发送的命令列表中没有
q命令,因此可以输入命令进行进一步分析。
(顺便说一句,如果在具有kd.exe的脚本的先前版本中,您删除了通过
-c参数在命令列表中传递的
q命令,则将继续显示转储功能,包括直接在过程中记录日志。)
调整创作
现在需要修改所有这些内容,以便可以将* .dmp文件绑定到上下文菜单。 实际上,它到底在做什么。
以下是“单线”:
对于带有控制台输出过滤的选项 cmd /d /k mode con: cols=170 & color F0 & title "%1" & kd.exe -nosqm -sup -z "%1" -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*"
对于筛选控制台输出并创建日志文件的选项(必须使用
延迟的变量扩展名 )
cmd /d /v /k mode con: cols=170 & color F0 & title "%1" & set "D=%1"& set L=!D:.dmp=.LOG! & kd.exe -nosqm -sup -loga "!L!" -z "!D!" -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*"
直接在windbg.exe中打开转储 "C:\Portable\Debug\windbg.exe" -z "%1" -sup -y "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -i "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid"
在注册表中,我创建了以下分区结构:
在进行了更改的注册表项中
创建了一种
单独的 dmp_geek 文件 。 扩展名为* .dmp的文件已分配为
dmp_geek类型的文件。
在每个命令部分中,默认情况下,将图标形式的相应单行+美观和上下文菜单中显示的项目名称的方便名称用作字符串参数。

事实证明,这种调整增加了在控制台和调试器中大规模打开在文件夹中选择的转储的能力,并过滤了“垃圾”并根据需要为每个转储创建了日志。 这样可以节省大量时间。
梳理注册表后,将所有内容导出到准备使用的最终REG文件中。
REG文件的内容 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.dmp] @="dmp_geek" [HKEY_CLASSES_ROOT\dmp_geek] @="dmp_geek" "FriendlyTypeName"=" " [HKEY_CLASSES_ROOT\dmp_geek\DefaultIcon] @="imageres.dll,142" [HKEY_CLASSES_ROOT\dmp_geek\shell] [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe] "MUIVerb"="Kd.exe" "Icon"="C:\\Portable\\Debug\\windbg.exe,6" [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe\command] @="cmd /d /k mode con: cols=170 & color F0 & title \"%1\" & \"C:\\Portable\\Debug\\kd.exe\" -nosqm -sup -z \"%1\" -y srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -i srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -c \"!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q\" | findstr /r /v /c:\"^\\*\\*\\* .* \\*\\*\\*\" /c:\"^\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*.*\"" [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe_-loga] "MUIVerb"="Kd.exe -loga" "Icon"="C:\\Portable\\Debug\\windbg.exe,6" [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe_-loga\command] @="cmd /d /v /k mode con: cols=170 & color F0 & title \"%1\" & set \"D=%1\"& set L=!D:.dmp=.LOG! & \"C:\\Portable\\Debug\\kd.exe\" -nosqm -sup -loga \"!L!\" -z \"!D!\" -y srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -i srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -c \"!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q\" | findstr /r /v /c:\"^\\*\\*\\* .* \\*\\*\\*\" /c:\"^\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*.*\"" [HKEY_CLASSES_ROOT\dmp_geek\shell\Open] "MUIVerb"="Windbg" "Icon"="C:\\Portable\\Debug\\windbg.exe,6" [HKEY_CLASSES_ROOT\dmp_geek\shell\Open\command] @="\"C:\\Portable\\Debug\\windbg.exe\" -z \"%1\" -sup -y \"srv*C:\\Symbols*http://msdl.microsoft.com/download/symbols\" -i \"srv*C:\\Symbols*http://msdl.microsoft.com/download/symbols\" -c \"!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid\""
→从Ya.Disk
GEEK_DMP.reg下载
仅此而已。 现在,即使从表面上看,您也可以快速分析一堆转储。