冗长的(无聊的)故事
目前,我有一个应用程序,导致一个例外,只有一台电脑。经过深入研究,我可以用一个小的示例应用程序封装这个问题,但真正的原因仍然是隐藏的。
由于这台pc上没有安装Visual,我们也不能这样做,所以我搜索了另一个解决方案,以找到真正的原因。
在第一种方法中,我越来越多地简化了我的小应用程序,只需仔细阅读异常消息,与代码进行比较,并尝试& error来解决具体的问题。但是,这无助于获得关于所有使用变量的当前值的所有信息,等等。
所以我找了另一个更好的方法来获取我需要的信息。我已经读了很长一段时间关于转储和微型转储的文章,但从来不需要它们,因为到目前为止,我一直可以在我的开发人员或测试机器上复制用户描述的场景。
但这一次,似乎只有一台pc有问题,不幸的是,改变完整的机器或安装所有新的,没有一个选择。
为了熟悉如何使用转储,我只编写了一个简单的c#测试应用程序,其中包含一个按钮,它只做throw new ArgumentException("Test");。
现在,我需要在按下恶意按钮后创建这样一个神奇的转储文件,将其读入VisualStudio2008Professional中,并将其视为VS中正常运行的应用程序,除非下一步不工作,等等。
据我所知,在特定时间点创建转储的最佳工具是原转储,因为您可以定义何时使用一个或多个转储。
所以我简单地下载了它,并通过调用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中的某个地方徘徊,但在我的代码中却没有出现(我猜这是对话框的MessageQueue,等待鼠标单击)。
如果我仔细研究一下细节,您会发现一些关于如何将未处理的异常委托给JIT调试器的信息。但是我不想要JIT调试器,我想让应用程序崩溃以获得转储文件。
在这些尝试之后,我找到了ClrDump,但这并没有产生任何更好的转储(如果我将它加载到VS中并查看调用堆栈)。
考虑到这些信息之后,您现在(希望)能够为我的.Net应用程序提供一个(可行的)解决方案:
(短)问题
当.net应用程序中发生未处理的异常时,我如何能够创建转储文件,从而能够加载MyApp .pdb文件并查看异常是在什么情况下抛出的?
答案
在Naveen和Lex的帮助下,我可以更深入地了解如何使用崩溃转储进行调试。现在我只想重温一下所有的东西,这些都是让它发挥作用所必需的:
每当您想要获得进程的转储时,您都可以在几个工具中进行选择,以完成任务:
如您所见,您将得到两个工具,它们能够在不同的情况下创建转储,因此在必要的时间点创建转储时,两者都是更多的合作伙伴,而不是竞争对手。
使用上述工具之一创建转储之后,是时候分析转储以找出问题的原因。用于分析,您可以抓取WinDbg。它是Windows调试工具的一部分,可以从微软获得。不幸的是,WinDbg的进入壁垒很高,但它真的很强大。也许可以看看这个博客,以便更好地理解如何使用这个工具。
如果您有一个.Net 4应用程序,并且使用Visual 2010,您也可以使用它进行分析。由于有了更好的图形用户界面,使用起来要容易得多,但它没有WinDbg的功能。为了得到更好的比较,您应该看看这篇文章。
最后但同样重要的是,您还可以在Visual 2008中使用sos.dll。这是文章描述了您可以用它做什么。
发布于 2011-01-24 19:03:01
DebugDiag是基于异常获取内存转储的最简单方法之一。
查找调试器中的“配置异常对话框”帮助部分,以生成基于异常的转储。
下面是一个基于ArgumentException生成完整内存转储的示例

发布于 2011-01-24 11:49:54
DebugDiag或WinDbg都可以。
http://support.microsoft.com/kb/919789
http://www.microsoft.com/whdc/devtools/debugging/default.mspx
https://stackoverflow.com/questions/4780652
复制相似问题