7

我在 C# 应用程序中遇到 APPCRASH。运行时给出“此应用程序已请求运行时以异常方式终止它”的错误消息。然后,当我单击确定时,我会收到一条“MyApplication 已停止工作”消息,其中包含通常的“在线检查解决方案”、“关闭程序”和“调试程序”选项。当我单击“附加详细信息”时,我得到了 APPCRASH 签名,其中包含许多附加信息。其中一些是人类可读的,其中一些只是十六进制数字。“异常代码”是 40000015。还有几行“附加信息”。我的问题是:宇宙中是否有人知道 APPCRASH 消息中的信息是什么意思?

似乎这条消息是为了让能从中推测出原因的人阅读。在搜索答案时,我发现很多人发布格式完全相同的消息。不幸的是,我没有找到有关此信息含义的解释。

另外,我尝试了“调试程序”选项,但它没有帮助。它只是把我放在系统 dll 中,而我的代码在调用堆栈中的任何地方都没有。我调查了一下,这个系统代码中没有出现这个错误。

APPCRASH 消息将另一个 dll 命名为“故障模块”(此代码使用了很多外部 dll),并且可能发生致命错误。但这些信息并不是很有帮助,因为我需要在我的代码中找到对外部 dll 进行错误调用(或将其置于错误状态)的位置。可悲的是,当我说“我的代码”时,我只是指我正在使用的代码。这是一个巨大的代码库,由几十个人在几年内编写,所以我不能只猜测可能导致致命呼叫的地方。这就是为什么我希望从 APPCRASH 消息中获得更多信息。这也是我对细节非常吝啬的原因。整个事情都是非常专有的,有很多繁文缛节。这也是我没有发布APPCRASH消息内容的原因。

需要明确的是,我并不是要你为我调试我的问题。我无法给你一个可重现的错误案例,我也没有要求任何人告诉我在我的具体案例中错误的原因。我只想知道如何解释这些十六进制数字,但我找不到任何文档。

4

4 回答 4

12

以下是应用程序崩溃消息的示例:

Problem signature:
Problem Event Name: APPCRASH
Application Name: WINWORD.EXE
Application Version: 12.0.4518.1014
Application Timestamp: 45428028
Fault Module Name: StackHash_7ae5
Fault Module Version: 6.0.6000.16386
Fault Module Timestamp: 4549bdc9
Exception Code: c0000374
Exception Offset: 000af1c9
OS Version: 6.0.6000.2.0.0.256.4
Locale ID: 1033
Additional Information 1: 7ae5
Additional Information 2: 4cf2e59e469447e0692da79a5a9446de
Additional Information 3: 333f
Additional Information 4: 583336399425ab3efc33bdfbb60895ee

应用程序名称和应用程序版本很简单,时间戳也是如此(这是文件资源管理器中的更改日期,编码为 32 位 Unix 时间戳值)。故障模块通常是一个dll名称,异常偏移量是导致错误的DLL中硬件指令的偏移地址。在这种情况下,这是一个内部运行时错误,无法检索到有效模块,因此我们得到了 StackHash 而不是实际值。这些版本是 Windows 中可执行文件的普通 PE 版本字符串。区域设置 ID 是正在使用的全球化设置库:1033 是 en-US。

异常代码可以在这里解释。在此示例中,错误是 STATUS_HEAP_CORRUPTION。

附加信息字段是不透明的数据,并且基于异常代码是什么。我不知道有关这些字段的任何有用信息,可能没有,而且这些字段很可能是故意未记录的,以便 Microsoft 可以根据需要更改它们。这些字段通常是大量信息的 md5 哈希......它基本上就在那里,因此可以通过哈希码快速比较大量信息是否相同/不同,这样您就可以知道错误是否是由于与另一个相同的执行状态造成的.

于 2014-08-11T20:50:11.767 回答
1

这意味着您有一个未捕获的未处理异常,它正在使您的应用程序崩溃。

如果它在调试模式下工作,您需要查看发布版本的不同之处。所有的图书馆都在吗?你有你的 app.config 设置吗?

检查 Windows 日志 -> 应用程序下的事件查看器以获取更多信息。

如果您设置异常处理程序,您将获得更好的信息,例如堆栈跟踪。

于 2012-10-16T20:36:17.670 回答
0

您需要生成一个可以在事后分析的故障转储。您将需要对注册表进行一些更改,然后您可以使用 Visual Studio 分析转储文件。希望这将为您提供更多线索,例如失败的特定功能。

有关详细信息,请参阅此网站:http: //blog.functionalfun.net/2013/05/how-to-debug-silent-crashes-in-net.html

您将设置来自 Microsoft 的工具 DebugDiag。

让我知道事情进展如何,或者您是否找到了一些更好的工具。

问候,

戴夫

于 2014-08-06T23:03:23.670 回答
0

.net 中有一个很好的功能,托管调试器助手,用于解决本机和托管代码互操作问题MSDN 文章在这里使用它

MDA 引发的异常可以在 Visual Studio 异常视图窗口中进行配置。

于 2014-08-12T11:31:58.967 回答