关于Win11系统生成dump文件失败的问题

一、简述

最近项目中有个客户端程序无法调试,只能在客户环境中测试并且遇到了闪退的问题,日志中也无法反映具体的问题所在,于是乎就给加上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 已正确配置以生成转储文件:

  1. 打开系统属性

    • 右键单击“开始”按钮,选择“运行”。
    • 输入 sysdm.cpl 然后按 Enter。
  2. 设置崩溃转储选项

    • 在“系统属性”窗口中,切换到“高级”选项卡。

    • 在“启动和故障恢复”部分,点击“设置”。

    • 确保在“系统失败”部分中选中“写入调试信息”。

    • 选择合适的转储类型:

      • 小内存转储(256KB)
      • 核心转储
      • 完整内存转储
    • 确保转储文件的路径为默认值(例如:C:\Windows\MinidumpC:\Windows\Memory.dmp)。

2. 检查磁盘空间

确保你的系统驱动器(通常是 C 盘)上有足够的空间,以存储生成的 DMP 文件。如果磁盘空间不足,则无法生成转储文件。

3. 检查权限设置

确保没有权限问题阻止 Windows 写入转储文件的位置。可以通过以下步骤修复权限:

  1. 右键单击 C:\Windows\Minidump 文件夹,选择“属性”。
  2. 切换到“安全”选项卡,确保 SYSTEM 和 Administrators 用户组具有“完全控制”权限。

4. 检查驱动问题

驱动程序问题可能导致系统崩溃,阻止 DMP 文件的生成。更新所有驱动程序,特别是显卡和芯片组驱动程序,并确保它们是最新的。

5. 禁用快速启动

快速启动有时会引发与启动相关的问题。可以尝试禁用此功能:

  1. 打开控制面板。
  2. 选择“电源选项”。
  3. 点击“选择电源按钮的功能”。
  4. 点击“更改当前不可用的设置”。
  5. 取消选中“启用快速启动”选项,然后保存更改。

6. 清理系统文件

使用磁盘清理工具,清除系统不需要的临时文件可能会帮助解决一些问题。可以通过以下步骤进行:

  1. 在搜索框中输入“磁盘清理”,并选择它。
  2. 选择系统驱动器(C 盘),点击“确定”。
  3. 在列表中选择要删除的文件类型(例如临时文件、系统生成的文件等),然后点击“确认”。

7. 运行系统文件检查器

使用系统文件检查器(SFC)扫描和修复损坏的系统文件:

  1. 以管理员身份运行命令提示符(右键单击“开始”菜单,选择“Windows Terminal (管理员)”)。

  2. 输入以下命令并按 Enter:

    sfc /scannow
    
    
  3. 验证扫描是否成功。如果发现问题,按照提示进行修复。

8. 检查事件查看器

查看事件查看器中的系统日志,特别是在蓝屏死机或崩溃发生的时间点,查看是否有相关错误信息:

  1. 按 Win + X,选择“事件查看器”。
  2. 在左侧窗格中展开“Windows 日志”,查看“系统”日志或“应用程序”日志。

9. 更新 Windows

确保你的 Windows 11 系统完全更新。引入的更新可能包含修复bug的补丁,这可以解决生成 DMP 文件的问题。

10. 最后手段:重新安装 Windows

如果你已尝试上述所有步骤但仍无法解决问题,重新安装 Windows 可能是解决方案。这将确保一个干净的环境,消除所有潜在的配置和软件问题。

小结

通过这些步骤,你应该能够解决 Windows 11 上 DMP 文件生成失败的问题。如果问题仍然存在,可能需要进一步诊断计算机的硬件或寻求专业支持。


四、自我再探索

看了上面多种解决方式,我先查看了系统的一些设置,对比了虚拟机和主机设置项。

在这里插入图片描述

左图是我自己电脑Win11系统上的设置,右图是虚拟机上Win11系统上的设置项,一开始以为是这边出了问题,经过多次修改下面选项依旧无法生成.dmp文件。

在这里插入图片描述

后来又去网上查询了一些文章,提到了修改注册表的方式感觉值得一试,原作者文章:https://blog.youkuaiyun.com/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上开发时是没有这个问题的,如果有小伙伴使用此方法仍旧无法解决可以留言进行讨论。

### MiniDump 文件生成与分析 MiniDump 是一种轻量级的内存转储文件,通常用于捕获应用程序崩溃时的状态信息。以下是关于 MiniDump 文件生成与分析的相关技术信息和使用方法。 #### 1. MiniDump 文件的生成 MiniDump 文件可以通过 `MiniDumpWriteDump` 函数生成,该函数允许开发者自定义需要捕获的信息类型[^2]。以下是一个简单的代码示例,展示如何在 C++ 程序中生成 MiniDump 文件: ```cpp #include <windows.h> #include <dbghelp.h> #include <tchar.h> BOOL CreateMiniDump(EXCEPTION_POINTERS* pExceptionInfo, LPCTSTR lpszFileName) { HANDLE hFile = CreateFile(lpszFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) return FALSE; MINIDUMP_EXCEPTION_INFORMATION mei; mei.ThreadId = GetCurrentThreadId(); mei.ExceptionPointers = pExceptionInfo; mei.ClientPointers = TRUE; MINIDUMP_TYPE mdt = MiniDumpNormal | MiniDumpWithThreadInfo | MiniDumpWithFullMemory; BOOL bResult = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, mdt, pExceptionInfo ? &mei : NULL, NULL, NULL); CloseHandle(hFile); return bResult; } ``` 上述代码通过 `MiniDumpWriteDump` 函数生成一个包含线程信息和完整内存的 MiniDump 文件[^4]。 #### 2. MiniDump 文件的分析 生成的 MiniDump 文件可以使用工具如 WinDbg 或 Visual Studio 进行分析。以下是使用 WinDbg 分析 MiniDump 文件的基本步骤[^1]: - 打开 WinDbg 并加载 MiniDump 文件。 - 使用命令 `.symfix` 设置符号路径。 - 使用命令 `!analyze -v` 分析崩溃原因。 - 使用命令 `~* kb` 查看所有线程的调用堆栈。 #### 3. 常见问题及解决方法 - **MiniDump 文件生成失败或大小为零**:这可能是由于主线程退出过快,导致异常处理程序没有足够时间生成 MiniDump 文件。可以通过在主函数退出前增加适当的休眠时间来解决这个问题[^3]。 - **MiniDump 文件过大**:如果 MiniDump 文件包含过多不必要的数据,可以通过调整 `MINIDUMP_TYPE` 参数来减少文件大小[^4]。 #### 4. 自定义回调函数 为了进一步控制 MiniDump 文件的内容,可以实现 `MINIDUMP_CALLBACK_ROUTINE` 回调函数,并将其传递给 `MiniDumpWriteDump` 函数。回调函数可以用于过滤特定的信息,例如忽略某些模块或线程的数据[^2]。 ```cpp BOOL CALLBACK MiniDumpCallback(PVOID CallbackParam, PMINIDUMP_CALLBACK_INPUT CallbackInput, PMINIDUMP_CALLBACK_OUTPUT CallbackOutput) { if (CallbackInput->CallbackType == ModuleCallback) { // 忽略特定模块 CallbackOutput->ModuleWriteFlags = 0; } return TRUE; } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值