蓝屏(BSOD)转储设置,看本文就够了!

前言

我们在内核转储,开抓啦!这篇文章里介绍了一个关键的系统设置。设置好后可以让系统在蓝屏(Blue Screen of Death,简称 BSOD)的时候自动保存转储文件。当时只是简单的介绍了设置步骤,本文力求详细的介绍相关内容。

我们先根据下面的动图回顾一下设置步骤:

系统转储设置

不知道大家有没有想过这些设置保存在哪里了呢?我猜保存在注册表里。是不是呢?我们一起来看看吧。

保存位置

为了找到这些设置保存的位置,我特意用 process monitor 捕获了整个设置过程,并录制了一段视频。

转储设置保存位置调查

根据调查结果可知,转储类型 保存在注册表如下位置:HKLM\System\CurrentControlSet\Control\CrashControl\CrashDumpEnabled 。每一项对应的值如下表:

中文名英文名值
(无)(None)0
小内存转储(256KB)Small memory dump3
核心内存转储Kernel memory dump2
完全内存转储Complete memory dump1
自动内存转储Automatic memory dump7
活动内存转储Active memory dump1

我们可以发现, 完全内存转储 和 活动内存转储 设置的 CrashDumpEnabled 的值居然一样,都是 1。肯定有其它地方不一样。把过滤条件改为 Path  begins with  HKLM\System\CurrentControlSet\Control\CrashControl,

更改过滤条件

继续观察,得到的对比结果如下。

结果对比

经过对比我们发现,当设置为 活动内存转储 时,会设置注册表项HKLM\System\CurrentControlSet\Control\CrashControl\FilterPages 的值为 1,当设置为 完全内存转储 时,会删除 FilterPages 子项。

说明:

win7 及更早的系统中没有 自动内存转储 和 活动内存转储 选项。自动内存转储 是从 win8 开始引入的。活动内存转储 是从 win10 开始引入的。

win7 系统转储设置

其它相关设置

除了指定转储类型,我们还可以进行其它设置。

  • 转储文件: 指定转储文件保存的位置。

    对于小内存转储,指定的是转储文件保存的目录,默认是 %SystemRoot%\Minidump\。对于其它几种转储类型,指定的是转储文件的保存路径,默认是 %SystemRoot%\MEMORY.DMP。

  • 自动重新启动(R) 选项:如果勾选,可以让系统在蓝屏后自动重启。

  • 将事件写入系统日志(W) 选项:如果勾选,可以把蓝屏事件记录到系统日志里。

  • 覆盖任何现有文件(O) 选项:如果勾选,覆盖已存在的同名文件,否则不覆盖(如果已经有同名文件,本次蓝屏的转储文件不会生成)。此选项对小内存转储不生效。

  • 禁止在磁盘空间不足时自动删除内存转储(A) 选项:如果勾选,即使在磁盘空间不足时也不删除之前保存的转储文件。此选项在 win7 中不存在,是在更高版本的操作系统中引入的。

每一项在注册表中的对应位置,请参考如下代码。保存为 .reg 文件,双击即可导入。

Windows Registry Editor Version 5.00; 将事件写入系统日志。1 表示写入,0 表示不写入
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl]
"LogEvent"=dword:00000000; 是否自动重启。1 表示自动重启,0 表示不自动重启
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl]
"AutoReboot"=dword:00000000; 转储类型。每个值的意义参考上表
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl]
"CrashDumpEnabled"=dword:00000001; 转储文件的保存路径。以二进制形式表示的 UNICODE 路径。默认值是 %SystemRoot%\MEMORY.DMP
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl]
"DumpFile"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\74,00,25,00,5c,00,4d,00,45,00,4d,00,4f,00,52,00,59,00,2e,00,44,00,4d,00,50,\00,00,00; 小内存转储文件保存路径。以二进制形式表示的 UNICODE 路径。默认值是 %SystemRoot%\MEMORY.DMP
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl]
"MinidumpDir"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,\00,74,00,25,00,5c,00,4d,00,69,00,6e,00,69,00,64,00,75,00,6d,00,70,00,00,00; 小内存转储文件保存的最大个数。如果转储文件数量超过此值,则删除最旧的那个。
; 界面上没有对应的设置,只能通过注册表修改。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl]
"MinidumpsCount"=dword:00000005; 覆盖任何现有文件。1 表示覆盖,0 表示不覆盖。对小内存转储不生效。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl]
"Overwrite"=dword:00000001; 禁止在磁盘空间不足时自动删除内存转储。1 表示不删除,0 表示删除
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl]
"AlwaysKeepMemoryDump"=dword:00000000

各种转储类型介绍

关于这几种转储类型的介绍,主要翻译自微软官方文档,但不完全是。喜欢看英文文档的小伙伴儿请参考微软官方文档。

  • 完全内存转储

    包含操作系统使用的所有物理内存。默认不包含平台固件占用的物理内存。为了确保转储文件可以顺利生成,请确保引导盘上的页面文件大小至少是物理内存大小 + 1 MB(写转储文件时需要一些头信息)。假设,物理内存是 4GB,我们需要保证初始大小至少是 4097MB。当然设置成更大的值也没关系。我们可以按下图进行设置:

    手动设置分页文件大小
  • 活动内存转储

    活动内存转储 类似于 完整内存转储,但是会过滤掉不太可能与排除故障相关的页面。由于这种过滤,产生的转储文件通常比 完整内存转储 小得多。

    这种类型的转储文件包含分配给用户模式应用程序的任何内存。它还包括分配给 Windows 内核和硬件抽象层(HAL)的内存,以及分配给内核模式驱动程序和其他内核模式程序的内存。转储文件包括映射到内核或用户空间的对调试有用的活动页面,还包括选择的以分页文件为后备的转换、备用和修改页面,比如使用 VirtualAlloc 或以分页文件为后备的内存区域。活动内存转储 不包括空闲列表、零列表、文件缓存、客户虚拟机页面和其他各种类型的不太可能对调试有用的内存。

    当目标系统中托管了虚拟机的时候,活动内存转储 特别有用。完全内存转储会包含所有虚拟机占用的内存,而活动内存转储 不会。

    活动内存转储 在 Windows 10 或更高版本的系统中可用。

  • 核心内存转储

    包含了系统崩溃时内核所使用的物理内存。

    这种转储文件比完整内存转储小得多。

    核心内存转储 不包括未分配的内存,或分配给用户态应用程序的任何内存。它只包括分配给 Windows 内核和硬件抽象层(HAL)的内存,以及分配给内核模式驱动程序和其他内核模式程序的内存。

    大多数情况下,这种类型的崩溃转储是最有用的。它比完全内存转储小得多,但是它只忽略了那些不太可能涉及崩溃的内存部分。

    由于这种转储文件不包含崩溃时驻留在内存中的任何用户模式可执行文件的映像,所以如果这些可执行文件非常重要,您可能还需要设置可执行映像路径。

  • 自动内存转储

    自动内存转储 与 内核内存转储 包含相同的信息。两者的区别不在于转储文件本身,而在于 Windows 设置系统分页文件大小的方式。

    如果系统分页文件大小设置为 系统管理的大小(Y),转储类型设置为 自动内存转储,那么 Windows 可以将分页文件大小设置的比物理内存还要小。在这种情况下,Windows 将分页文件的大小设置得足够大,以确保在大多数情况下可以捕获内核内存转储。

    如果系统崩溃,而分页文件的大小不足以保存内核内存转储,则 Windows 会将分页文件的尺寸增加到至少物理内存的大小。此事件(增大分页文件尺寸的事件)发生的时间会被记录在注册表项HKLM\SYSTEM\CurrentControlSet\Control\CrashControl\LastCrashTime 中。

    增加后的分页文件大小将保持 4 周,然后恢复到之前较小的值。如果希望在 4 周之前就恢复到之前较小的值,可以删除此注册表项。

    自动内存转储在 Windows 8 或更高版本的系统中可用。

  • 小内存转储(256KB)

    小内存转储包含如下内容:

    • 错误检查信息和参数,以及其它蓝屏数据。

    • 崩溃的处理器上下文(PRCB)。

    • 崩溃进程的进程信息和内核上下文(EPROCESS)。

    • 崩溃线程的线程信息和内核上下文(ETHREAD)。

    • 崩溃线程的内核模式调用堆栈。如果它大于 16 KB,则只包含最前面的 16 KB。

    • 加载的驱动程序列表。

在 Windows XP 和 Windows 的后续版本中,还包括以下内容:

    • 已加载模块和已卸载模块的列表。

    • 调试器数据块。它包含关于系统的基本调试信息。

    • Windows 标识为对调试失败有用的任何附加内存页。这包括发生崩溃时寄存器所指向的内存页,以及故障组件特别请求的其他内存页。

    • (Windows Server 2003 及更高版本)The Windows SKU —— 比如,"Professional" 或者 "Server"。

      关于 Windows SKU 可以参考链接 https://www.thewindowsclub.com/windows-7-versions-sku

总结

  • 小内存转储(256KB) 默认会保存到 %SystemRoot%\Minidump 文件夹下,其它几种类型的转储文件默认保存到 %SystemRoot%\Memory.dmp。

  • 各种转储类型产生的转储文件中包含的信息不一样,根据自己的需要选择。产生的转储文件大小排序如下:完全内存转储 > 活动内存转储 > 核心内存转储 = 自动内存转储 > 小内存转储。

  • 系统蓝屏后是否自动重启,是否保存转储文件,是否覆盖现有文件,转储文件保存类型,转储文件保存位置等相关设置都在注册表项 HKLM\System\CurrentControlSet\Control\CrashControl\ 下,可以根据需要修改本文中的代码,并另存为 .reg 文件,双击导入系统即可。注意需要重启生效。

  • 如果在调试的时候遇到了 missing page 错误,可以使用 .ignore_missing_pages 命令。

  • 在 process monitor 的帮助下,没查看任何帮助文档就把各个类型的转储文件对应的值及保存位置调查清楚了!process monitor 真是调查此类问题的神兵利器!你值得拥有!

参考资料

  • https://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-179-Manually-Forcing-a-Crash-Dump

  • https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/varieties-of-kernel-mode-dump-files

  • https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/complete-memory-dump

  • https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/active-memory-dump

  • https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/kernel-memory-dump

  • https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/automatic-memory-dump

  • https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/small-memory-dump

猜你喜欢:

转储文件系列:

转储文件知多少

你需要知道的 N 种抓取 dump 的工具

你生成的转储文件有问题吗?

向大厂看齐!为自己的程序增加自动转储的功能!

内核转储,开抓啦!

调试系列:

调试实战——你知道怎么使用DebugView查看调试信息吗?

调试实战——程序CPU占用率飙升,你知道如何快速定位吗?

调试实战——崩溃在ComFriendlyWaitMtaThreadProc

调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs

调试实战——调试PInvoke导致的内存破坏

调试实战——调试excel启动时死锁

调试实战——调试DLL卸载时的死锁

调试实战——调试TerminateThread导致的死锁

排错系列:

排错实战——VS清空最近打开的工程记录

排错实战——拯救加载调试符号失败的IDA

排错实战——你知道拖动窗口时只显示虚框怎么设置吗?

排错实战——解决Tekla通过.tsep安装插件失败的问题

排错实战——使用process explorer替换任务管理器

排错实战——通过对比分析sysinternals事件修复程序功能异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/311669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法---字符串顺序平移

算法—字符串顺序平移 原理&#xff1a;矩阵的转置思想 代码&#xff1a; #include <stdio.h> #include <stdlib.h> void swap(char *a,int i, int j) {//交换二个变量的值char temp a[i];a[i] a[j];a[j] temp; } void invert(char *a,int s, int e) {//对称…

delphi中的函数传参如何传枚举参数_Python基础笔记Day05函数

Python函数 function函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。函数能提高应用的模块性&#xff0c;和代码的重复利用率。Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0c;这被…

[蓝桥杯2018初赛]日志统计-双指针

代码如下&#xff1a; #include <iostream> #include <algorithm> using namespace std; typedef pair<int, int>PII; #define x first #define y second const int N 100010; bool st[N]; int n, d, k; PII a[N]; int cnt[N];int main() {cin >> n …

不要错过这轮疫情的“洗牌”机会

大家好&#xff0c;我是Z哥。今天和大家随便聊聊天。这次的疫情对我们所有人影响都很大&#xff0c;除了让你心怀忐忑的过了个春节之外&#xff0c;呆在家的时间对很多人来说也是格外的长。这样的突发事件&#xff0c;除了能看出不同公司之间应对突发状况的能力差异之外&#x…

算法---查找倒数第k个链表的值

算法—查找倒数第k个链表的值 代码&#xff1a; link.h #pragma once #define elemType int #include<stdlib.h> typedef struct link {elemType data;struct link * next; }link; bool initLink(link* &Link) {//初始化链表Link (link*)malloc(sizeof(link));Li…

mysql boolean_产品操作MySQL第7篇 – 运算符 – IS NULL

本资料为产品岗位作为日常工作参考&#xff0c;语言口语化At 2019/4/27 By David.Yang介绍什么是IS NULL IS NULL作为一种运算符&#xff0c;用来对数据表中的NULL值数据进行过滤。语法target IS NULLtarget值为NULL&#xff0c;则表达式返回TRUE&#xff0c;否则返回FALSE。MY…

[蓝桥杯2016初赛]交换瓶子

题目描述 有N个瓶子&#xff0c;编号 1 ~ N&#xff0c;放在架子上。 比如有5个瓶子&#xff1a;2 1 3 5 4&#xff0c;要求每次拿起2个瓶子&#xff0c;交换它们的位置。 经过若干次后&#xff0c;使得瓶子的序号为&#xff1a;1 2 3 4 5 对于这么简单的情况&#xff0c;显然…

微软开源Scalar,提升操作巨型Git仓库的速度

Git 属于分布式版本控制系统&#xff0c;默认情况下&#xff0c;每个 Git 仓库都具有整个历史记录的完整文件副本。即便是中等规模的开发团队也会产生数千个提交&#xff0c;每个月向仓库添加几百兆的数据。而随着仓库的占用空间增加&#xff0c;Git 难以管理所有数据&#xff…

word List 41

word List41 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

b树与b+树的区别_面试必考:B树、B树、B+树、B*树图文详解

B树B树又叫做二叉搜索树&#xff0c;倒状的树形结构。如下图所示特点&#xff1a;所有的非子夜节点最多拥有两个子节点树(左子树和右子树)。所有结点存储一个关键字。节点的左右儿子&#xff0c;左边是比该节点小的&#xff0c;右边是比该节点大的。缺点&#xff1a;因为二叉搜…

[蓝桥杯2016初赛]煤球数目-找规律

题目描述 有一堆煤球&#xff0c;堆成三角棱锥形。具体&#xff1a; 第一层放1个&#xff0c; 第二层3个&#xff08;排列成三角形&#xff09;&#xff0c; 第三层6个&#xff08;排列成三角形&#xff09;&#xff0c; 第四层10个&#xff08;排列成三角形&#xff09;&…

.NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(上)

06 | 作用域与对象释放行为作用域主要由 IServiceScope 这个接口来承载对于实现 IDisposable 类的实例的对象&#xff0c;容器会负责对其生命周期进行管理&#xff0c;使用完毕之后&#xff0c;他会释放这些对象实现 IDisposable 接口类型的释放&#xff1a;1、容器只会负责由其…

python调试_Python调试坑

写python的人一般都不太看重调试&#xff0c; 因为这是一门解释性语言&#xff0c; 在哪出错会立马在解释器里提示出来。但是&#xff0c; 以上观点只适用于小的脚本或者项目。因为我在接触目前项目之前&#xff0c; 我一直都是这么做的。 对于一个大的项目来说&#xff0c; 调…

[蓝桥杯]字符串对比-模拟

题目描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间)&#xff0c;它们之间的关系是以下4中情况之一&#xff1a;   1&#xff1a;两个字符串长度不等。比如 Beijing 和 Hebei   2&#xff1a;两个字符串不仅长度相等&#xff0c;而且相应位置上的字符…

word List 42

word List 42 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

利用AppMetrics对Web进行监控教程

一、基础准备1. 安装依赖这里可以通过nuget或使用命令行进行安装&#xff0c;具体需要安装的类库如下&#xff08;注意版本&#xff09;&#xff1a;Install-Package App.Metrics.AspNetCore.Mvc -Version 2.0.0由于我们需要兼容Prometheus进行监控&#xff0c;所以我们还需要安…

matlab贝叶斯优化工具箱_经济学人的神器——BEAR(贝叶斯估计、分析和回归工具包)...

武林至尊&#xff0c;宝刀屠龙&#xff0c;号令天下&#xff0c;莫敢不从&#xff0c;倚天不出&#xff0c;谁与争锋。——金庸《倚天屠龙记》Bayesian Estimation, Analysis and Regression(简写为BEAR) Toolbox是欧央行(ECB)发布的一个综合 (面板)VAR工具箱&#xff0c;通过图…

[蓝桥杯2017决赛]平方十位数-枚举+set去重

题目描述 由0~9这10个数字不重复、不遗漏&#xff0c;可以组成很多10位数字。 这其中也有很多恰好是平方数&#xff08;是某个数的平方&#xff09;。 比如&#xff1a;1026753849&#xff0c;就是其中最小的一个平方数。 请你找出其中最大的一个平方数是多少&#xff1f; 输出…

计算机网络----wireshark抓包

计算机网络----wireshark抓包 抓包截图&#xff1a; 先了解&#xff0c;后期将细讲&#xff01;&#xff01;&#xff01; 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

如何为.NETCore安装汉化包智能感知

引言具体不记得是在群里还是什么地方有人问过&#xff0c;.NETCore有没有汉化包&#xff0c;答案是有&#xff0c;目前微软已经为我们提供了.NETCore多种语言的语言包。下面看看如何安装与使用吧。本文介绍&#xff1a;如何安装这些下载的本地化版本。如何修改Visual Studio安装…