定制C++ Windows应用崩溃且生成的dmp转储文件为空的原因咨询
提问内容
我们有一款内部开发的C++应用,通过任务调度器运行。当前我们正在排查该应用的崩溃问题,崩溃时会生成Windows事件日志,正常情况下我们可通过对应的.dmp转储文件在Visual Studio中定位故障。
但目前生成的appname.dmp文件大小为0字节。
请问.dmp文件为空的潜在原因有哪些?
下方附示例事件日志供参考:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> - <System> <Provider Name="Application Error" /> <EventID Qualifiers="0">1000</EventID> <Level>2</Level> <Task>100</Task> <Keywords>0x80000000000000</Keywords> <TimeCreated SystemTime="2021-11-09T15:48:04.642807400Z" /> <EventRecordID>5214</EventRecordID> <Channel>Application</Channel> <Computer>redacted</Computer> <Security /> </System> - <EventData> <Data>redacted.exe</Data> <Data>1.0.0.1</Data> <Data>60816c15</Data> <Data>KERNELBASE.dll</Data> <Data>10.0.17763.2183</Data> <Data>12a65345</Data> <Data>e06d7363</Data> <Data>001235e2</Data> <Data>fa0</Data> <Data>01d7d57fa38520cb</Data> <Data>K:\redacted\redacted.exe</Data> <Data>C:\WINDOWS\System32\KERNELBASE.dll</Data> <Data>03eae790-81b8-4040-aab4-6068440c4db0</Data> <Data /> <Data /> </EventData> </Event>

0字节dmp文件的潜在原因
- 权限不足:任务调度器运行应用时使用的执行身份(如系统服务账户、低权限用户)对转储文件的输出目录没有写入权限,仅能创建空文件,后续写入转储内容时被系统拦截。
- 磁盘资源不足:转储输出目录所在的磁盘分区剩余空间不足,或是执行账户的磁盘配额已耗尽,文件创建后无空间写入实际内容。
- 转储逻辑配置错误:如果是程序内调用
MiniDumpWriteDump生成转储,可能是调用时传入的文件句柄无效、转储类型参数配置错误、内存读取权限不足导致调用失败,仅生成空文件;如果是依赖Windows错误报告(WER)生成转储,可能是WER的转储大小、转储类型、存储上限等系统级配置错误,导致内容无法写入。 - 进程被提前终止:转储写入需要一定时间,若任务调度器配置了崩溃后立即清理/重启进程的规则,或是存在第三方监控程序、杀毒软件发现进程异常后直接强制结束进程,会打断转储写入流程,导致文件为空。
- 二次崩溃问题:从提供的事件日志可见异常代码为
e06d7363,属于C++未捕获异常。如果程序自身注册了未捕获异常处理钩子,钩子执行过程中又触发了新的崩溃,会导致转储逻辑无法正常执行完成,最终只能生成空文件。 - 文件被锁定:转储文件创建后,被杀毒软件、实时备份工具、文件监控类程序抢先加锁,导致系统/程序无法写入转储内容,最终文件大小为0。
内容的提问来源于stack exchange,提问作者Andy P
相关产品推荐
相关产品推荐

