如何调试垃圾堆/无.dmp/用户机器

How to debug trashed heap / no .dmp / user's machine

本文关键字:dmp 用户 机器 垃圾堆 何调试 调试      更新时间:2023-10-16

我有一个两年前的C++/Win32程序,有数百名用户。 几天前,一位用户报告了以下崩溃。 它在程序收到任何用户输入之前在启动时发生。 没有其他人遇到这个问题。

问题

签名:问题事件名称:APPCRASH 应用程序名称:xyz.exe 应用程序版本:0.0.2.94 应用程序时间戳:50b92e99 故障模块名称:StackHash_dec5 故障模块版本:6.0.6002.18541






故障模块时间戳:4ec3e39f 异常
代码:c0000374
异常偏移量:000abc4f
操作系统版本:6.0.6002.2.2.0.768.3
区域设置 ID:1033
其他信息 1:dec5
其他信息 2: cef9e6e9412cee8472af82d5cdb064b7
附加信息 3: 5d30
附加信息 4: 7ad67f8281216f819f54c76815aefb56

该程序使用 SetUnhandledExceptionFilter 处理程序来编写小型转储,但用户告诉我没有小型转储。 我想这是正常的,因为它是代码 c0000374(堆损坏)。

在用户报告问题后,我给了他一个特殊的构建,其中包含无数的跟踪语句,包括记录通过消息泵的每条消息,但我从中了解到的是,GetMessage 收到的最后一条消息是一条新消息,我将其作为调试内容的一部分放入该特殊构建中。 该消息及其调用的代码不能成为崩溃的来源,因为我在他的崩溃开始后添加了它们。 也许这意味着崩溃发生在其他线程中,而不是处理消息的线程中。 程序在启动时会创建一堆线程。

任何人都可以提出调试策略吗? 我没有.dmp文件,我迷路了。

只要您的应用程序崩溃并且没有立即退出,即进程仍然存在,您就可以使用 procdump by sysinternals ( http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx ) 和procdump -ma xxxx.exe编写完整的内存转储,然后您可以使用 WinDbg 进行分析。