3

漫长(无聊)的故事

目前我有一个应用程序只在一台电脑上导致异常。经过一番挖掘,我可以用一个小示例应用程序封装问题,但真正的原因仍然隐藏。

由于在这台电脑上没有安装 Visual Studio,我们也无法这样做,我搜索了另一种解决方案来找到真正的原因。

在第一种方法中,我通过仔细阅读异常消息来越来越多地剥离我的小应用程序,与代码进行比较并尝试错误以解决具体的问题。但这无助于获取有关所有已使用变量的当前值等的所有信息。

所以我寻找另一种更好的方法来获取我需要的信息。我已经阅读了关于DumpsMinidumps的文章很长时间了,但从来不需要它们,因为直到现在我总是可以在我的开发人员或测试机器上重现用户描述的场景。

但这次似乎只有一台电脑出现问题,不幸的是,更换整台机器或安装所有新机器都没有选择。

为了熟悉如何使用转储,我只编写了一个简单的 c# 测试应用程序,其中包含一个按钮,它只做throw new ArgumentException("Test");

现在我需要在按下恶意按钮后创建这样一个神奇的转储文件,将其读入 Visual Studio 2008 Professional 并可以像在 VS 中正常运行的应用程序一样查看它,除了Step next等不起作用。

据我所知,在特定时间点创建转储的最佳工具是procdump,因为您可以定义何时进行一个或多个转储。

所以我只是下载它并通过调用启动它procdump -o -e MyApp.exe d:\MyApp.dmp。它声称MyApp.exe不存在。好吧,我的错。只需先启动 MyApp,然后再启动 procdump。

Procdump 现在正在运行,向我展示了它使用的所有选项,并且似乎在等待未处理的异常。没有比这更容易的了,我只是按下我的恶意按钮......并且在 procdump 中没有任何反应。

相反,我的应用程序会弹出一个对话框窗口,说明发生了未处理的异常(意外、意外)以及我想要做什么(详细信息、继续、退出)。但无论我选择什么,procdump 都无法自动创建转储文件。

如果我procdump -o MyApp.exe d:\MyApp.dmp在对话框显示转储文件似乎没用时去调用它,因为在 VS 中打开它后,调用堆栈只是在某个地方徘徊,ntdll.dll但在我的代码中没有任何地方(我猜这是消息队列对话框等待一些鼠标点击)。

如果我仔细查看详细信息,您会发现一些有关如何将未处理的异常委托给 JIT 调试器的信息。但我不想要 JIT 调试器,我想使应用程序崩溃以获取转储文件。

在这些尝试之后,我找到了 ClrDump,但这并没有产生任何更好的转储(如果我将它加载到 VS 并查看调用堆栈)。

考虑到这些信息,您现在(希望)能够为我的 .Net 应用程序提供(工作)解决方案:

(短)问题

当 .net 应用程序中发生未处理的异常时,我如何能够创建转储文件,我能够加载 MyApp .pdb 文件并查看在什么情况下引发了异常?

答案

在 Naveen 和 Lex Li 的帮助下,我可以更深入地了解如何使用故障转储进行调试。现在我想回顾一下所有的东西,这是让它工作所需要的:

每当您想获得一个进程的转储时,您可以在几个工具之间进行选择来完成工作:

  • 过程转储
    • 简单的命令行工具,可以在复杂的场景中创建转储,但它不能捕获 .net 未处理的异常。
  • 调试诊断
    • 简单的图形工具,可以在崩溃时创建转储(甚至是 .net 异常),但它不能在 Procdump 等高级场景中创建转储。

如您所见,您将获得两种能够在不同情况下创建转储的工具,因此在所需时间点创建转储方面,两者都是合作伙伴而不是竞争对手。

使用上述工具之一创建转储后,是时候分析转储以找出问题的原因了。为了进行分析,您可以获取 WinDbg。它是Windows 调试工具的一部分,可以从 Microsoft 获得。不幸的是,WinDbg 的入门门槛相当高,但它确实很强大。也许看看这个博客,以更好地了解如何使用这个工具。

如果您有一个 .Net 4 应用程序并使用 Visual Studio 2010,您也可以使用它进行分析。由于更好的图形用户界面,它更易于使用,但它没有 WinDbg 的强大功能。为了获得更好的比较,您应该查看这篇文章

最后但并非最不重要的一点是,您还可以在 Visual Studio 2008 中使用 sos.dll。这是描述您可以使用它做什么的文章。

4

2 回答 2

3

DebugDiag是基于异常获取内存转储的最简单方法之一。

在 debugdiag 中查找“配置异常对话框”帮助部分,以根据异常生成转储。

下面是一个基于 ArgumentException 生成完整内存转储的示例

在此处输入图像描述

于 2011-01-24T19:03:01.087 回答
1

DebugDiag 或 WinDbg 都可以。

http://support.microsoft.com/kb/919789

http://www.microsoft.com/whdc/devtools/debugging/default.mspx

于 2011-01-24T11:49:54.673 回答