定制的 C++ Windows 应用程序崩溃并生成一个空的 dmp 文件

Posted

技术标签:

【中文标题】定制的 C++ Windows 应用程序崩溃并生成一个空的 dmp 文件【英文标题】:Bespoke C++ Windows app crashing and producing an empty dmp file 【发布时间】:2021-12-23 18:30:23 【问题描述】:

我们有一个通过任务调度程序运行的内部 c++ 应用程序。我们正在尝试跟踪导致崩溃、Windows 事件的应用程序问题,我们通常会查找 .dmp 文件以使我们能够在 Visual Studio 中跟踪问题。

但是,这些 Windows 转储文件 [appname. dmp] 是零字节。

请问有没有人知道 .dmp 文件为空的潜在原因?

下面的示例事件日志以防万一。

非常感谢您的帮助和想法:)

安迪P

- <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> 
<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>

【问题讨论】:

我想你想要崩溃转储,这样你就可以知道你的应用程序中的哪一行代码导致了错误? 是的,乔尼 【参考方案1】:

MSDN 指出了一个非常重要的限制:从刚刚崩溃的进程内部编写小型转储是不可靠的。从您的问题中不清楚您是否使用单独的进程来编写转储(“redacted.exe”?),所以这绝对是一个可能的原因。

【讨论】:

哦 - 这很有趣。 @MSalters - 使用单独的转储进程意味着什么? (为我的无知道歉)我读它的方式只是安迪有一个 c++ 应用程序。它已经崩溃(在 Windows 内核库中),他们希望有一个转储文件,但它不存在。 @Jonny:转储文件需要由进程写入。从理论上讲,您可以尝试从“崩溃”进程(通常来自矢量 SEH 处理程序)内部编写转储文件,但从辅助进程中执行此操作更安全。 啊有道理。如果您不指定任何内容,那么 Windows 是否使用 SEH 处理程序的默认实现?即,如果您只是在 Visual Studio 中新建文件项目并创建一个控制台或 win32 c++ 应用程序(并且可能在代码中除以 0 或其他东西来测试崩溃)。我不认为 msdn 或类似网站上有任何示例代码? @Jonny:正确,Windows 将捕获异常并显示错误消息。 Ta Gents - 这是什么 SEH ? docs.microsoft.com/en-us/cpp/cpp/…

以上是关于定制的 C++ Windows 应用程序崩溃并生成一个空的 dmp 文件的主要内容,如果未能解决你的问题,请参考以下文章

怎么用c++编写一个Windows服务程序来监控另一个程序,崩溃后重新启动。

怎么用c++编写一个Windows服务程序来监控另一个程序,崩溃后重新启动。

Windows 上 C++ Mingw 中的崩溃报告

我的程序崩溃时如何自动生成堆栈跟踪

使用Windows事件查看器调试崩溃

Windows C++ 程序中的访问冲突总是会立即崩溃吗?