一、简述
最近项目中有个客户端程序无法调试,只能在客户环境中测试并且遇到了闪退的问题,日志中也无法反映具体的问题所在,于是乎就给加上dump文件(具体怎么生成之前的文章中有详细写到,如何使用GoogleBreadpad在windows下捕获程序崩溃报告),在本地电脑进行了测试能够正常生成,谨慎起见又在虚拟机中的win11系统里安装测试了一下,果然无法生成.dmp文件。
二、自我探索
这个时候就专门使用Everything软件一直监测本地所有.dmp文件,我自己也在界面上加了个小按钮(里面实现就是空指针操作,必定崩溃)进行崩溃测试,期间是有.dmp文件生成的但是一闪而过然后又被删除了,这个时候我关闭了系统杀毒,再次测试还是不行,然后便在文件消失的瞬间捕捉到对应的文件夹目录,在"C:\ProgramData\Microsoft\Windows\WER\Temp"目录下会生成WER.9b6ebb45-1268-498a-9ffa-293382cb0b9d.tmp.dmp这个文件以及一些其他附加的文件,这些文件是一起生成一起消失的,我猜测应该是这些文件会组合成最终的dmp文件,但是这个最终的文件没法生成是要解决的问题。
后来又使用管理员权限启动,兼容模式等依旧无法生成,开始进行网上查询。
三、使用人工智能帮助
接着是就是查询gpt、豆包等ai,都给出了以下内容:
如果 Windows 11 无法生成 DMP 文件,这意味着在系统崩溃或出现蓝屏时没有成功保存内存转储。以下是几个检查和解决生成 DMP 文件失败的步骤:
1. 验证转储设置
确保 Windows 已正确配置以生成转储文件:
-
打开系统属性:
- 右键单击“开始”按钮,选择“运行”。
- 输入
sysdm.cpl
然后按 Enter。
-
设置崩溃转储选项:
-
在“系统属性”窗口中,切换到“高级”选项卡。
-
在“启动和故障恢复”部分,点击“设置”。
-
确保在“系统失败”部分中选中“写入调试信息”。
-
选择合适的转储类型:
- 小内存转储(256KB)
- 核心转储
- 完整内存转储
-
确保转储文件的路径为默认值(例如:
C:\Windows\Minidump
或C:\Windows\Memory.dmp
)。
-
2. 检查磁盘空间
确保你的系统驱动器(通常是 C 盘)上有足够的空间,以存储生成的 DMP 文件。如果磁盘空间不足,则无法生成转储文件。
3. 检查权限设置
确保没有权限问题阻止 Windows 写入转储文件的位置。可以通过以下步骤修复权限:
- 右键单击
C:\Windows\Minidump
文件夹,选择“属性”。 - 切换到“安全”选项卡,确保 SYSTEM 和 Administrators 用户组具有“完全控制”权限。
4. 检查驱动问题
驱动程序问题可能导致系统崩溃,阻止 DMP 文件的生成。更新所有驱动程序,特别是显卡和芯片组驱动程序,并确保它们是最新的。
5. 禁用快速启动
快速启动有时会引发与启动相关的问题。可以尝试禁用此功能:
- 打开控制面板。
- 选择“电源选项”。
- 点击“选择电源按钮的功能”。
- 点击“更改当前不可用的设置”。
- 取消选中“启用快速启动”选项,然后保存更改。
6. 清理系统文件
使用磁盘清理工具,清除系统不需要的临时文件可能会帮助解决一些问题。可以通过以下步骤进行:
- 在搜索框中输入“磁盘清理”,并选择它。
- 选择系统驱动器(C 盘),点击“确定”。
- 在列表中选择要删除的文件类型(例如临时文件、系统生成的文件等),然后点击“确认”。
7. 运行系统文件检查器
使用系统文件检查器(SFC)扫描和修复损坏的系统文件:
-
以管理员身份运行命令提示符(右键单击“开始”菜单,选择“Windows Terminal (管理员)”)。
-
输入以下命令并按 Enter:
sfc /scannow
-
验证扫描是否成功。如果发现问题,按照提示进行修复。
8. 检查事件查看器
查看事件查看器中的系统日志,特别是在蓝屏死机或崩溃发生的时间点,查看是否有相关错误信息:
- 按 Win + X,选择“事件查看器”。
- 在左侧窗格中展开“Windows 日志”,查看“系统”日志或“应用程序”日志。
9. 更新 Windows
确保你的 Windows 11 系统完全更新。引入的更新可能包含修复bug的补丁,这可以解决生成 DMP 文件的问题。
10. 最后手段:重新安装 Windows
如果你已尝试上述所有步骤但仍无法解决问题,重新安装 Windows 可能是解决方案。这将确保一个干净的环境,消除所有潜在的配置和软件问题。
小结
通过这些步骤,你应该能够解决 Windows 11 上 DMP 文件生成失败的问题。如果问题仍然存在,可能需要进一步诊断计算机的硬件或寻求专业支持。
四、自我再探索
看了上面多种解决方式,我先查看了系统的一些设置,对比了虚拟机和主机设置项。
左图是我自己电脑Win11系统上的设置,右图是虚拟机上Win11系统上的设置项,一开始以为是这边出了问题,经过多次修改下面选项依旧无法生成.dmp文件。
后来又去网上查询了一些文章,提到了修改注册表的方式感觉值得一试,原作者文章:https://blog.csdn.net/xqjcool/article/details/104589051
这里他根据每个软件进行了设置,我想的是不是直接通过某一项设置直接就可以允许生成而不是这种每一个软件进行配置的方式,后来还真给我找到了在注册表对应的路径下有这么个选项 **“AlwaysKeepMemoryDump”,**好像就是来控制本地是否生成dmp文件的属性。
计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl
这里我们将值改为1之后,再次进行测试,果然生成了dmp文件,具体目录"C:\Users\30629\AppData\Local\CrashDumps"(跟当前系统登录用户关联),该目录下会生成"xxx.exe.8944.dmp"文件,这个文件就是我们需要的崩溃调试文件了,有了这个文件就可以用VS进行调试定位具体的崩溃代码片段了。
再回到本机,打开注册表查看对应的值,我们这里就没有设置**“AlwaysKeepMemoryDump”**的值,那系统应该就是默认生成的。
这里关于Win11系统生成dump文件失败的问题就解决了,目前仅测试于win11,我记得以前win7、win10上开发时是没有这个问题的,如果有小伙伴使用此方法仍旧无法解决可以留言进行讨论。