2010-03-05 105 views
3

我支持相当广泛部署的.NET 2.0 Winforms应用程序。在极少数情况下,我们会得到客户的支持电话,当您尝试启动应用程序时,应用程序会返回.NET运行时异常AS SOON。使用Windows调试工具调试.NET 2.0 Winforms应用程序

在过去,我们已经帮助客户重新安装.net框架,并且经常运行......但偶尔不会。

在这种情况下,可以使用Windows Debugging Tools来确定问题的原因。如果是这样,你必须下载调试符号到目标计算机(想避免因为可以下载到目标的几百MB的东西)。

这是.net应用程序的矫枉过正?任何替代品。你将如何去调试这个。非特定的步骤,将不胜感激。当然,这个应用程序被编译为目标机器上的RELEASE配置。客户很可能没有安装开发工具或调试工具。我们通常可以通过遥控器访问电脑。重新迭代。这种情况很快就会发生当客户尝试运行应用程序并立即失败时。

解决客户问题的最快途径是什么?

以下是来自事件日志的最近错误的示例。
EventType clr20r3。 .exe P2 2010.1.0.0,p3 4B857AFD P4 BLAH BLAH system.invalidoperation,P10 NIL。

来源:.NET运行时2.0错误。 EventID:5000

在此先感谢。

Seth

回答

6

为什么不使用它?

对于客户的机器,您将无法进行远程调试。因此,建议捕获故障转储以便崩溃并挂起故障转储,而WinDbg或ADPlus.exe在此处非常有用。

向最终用户推出的WinDbg的应用程序,并执行

.dump /f path 

保存崩溃转储,那么你可以要求转储文件和分析崩溃。

在目标机器上,不需要符号。当您在自己的机器上分析崩溃转储时,符号很有用,而这正是SOS等有用的地方。

当然还有其他方式获得崩溃转储,

http://blogs.msdn.com/lexli/archive/2009/08/23/when-the-application-program-crashes-on-windows.aspx

+0

+1。调试工具是一个简单的小型安装,您可以将它们写入批处理文件以在崩溃模式下运行adplus。我们将此用于有客户问题,我们无法在内部复制 – 2010-03-06 10:31:09

+1

Adplus.vbs已过时。请在相同的文件夹中切换到ADPlus.exe。 – 2010-03-06 12:12:41

+0

Lex 感谢您的回答。这正是我所希望的那种答案。 你说:“让你的最终用户在WinDbg中启动你的应用程序,并执行.dump/f路径” 这是明显的如何做到这一点?它有多简单?你能简单介绍一下吗?我认为“路径”是转储文件的路径。无论如何,完美的答案。现在来看看。 Seth – 2010-03-07 22:46:07

0

我不认为你想要“Windows调试工具”。调试符号适用于操作系统,而不是.NET Framework。 (提醒,您的Windows.Forms应用程序位于.NET Framework中,而不是OS中。)

“远程调试”帮助http://msdn.microsoft.com/en-us/library/y7f5zaaa.aspx

我通常会包含一个“StopSwitch”,但这不是启用JIT的必要条件。 (请参阅“StopSwitch停止执行以进行实时调试”,网址为http://missico.spaces.live.com/blog/cns!7178D2C79BA0A7E3!309.entry)这允许我启用交换机,然后在运行的应用程序遇到调试器停止语句时连接到该应用程序。

您可以调试“发布”版本。发布pdb对堆栈跟踪很有帮助。

我以前有过这个问题。我启用了StopSwitch,检查是第一行,但JIT并未启动,因为问题发生在.NET Framework甚至加载了我的应用程序之前。

+0

WinDbg中实际上可以完全用于调试.NET应用程序。尤其是随着sos扩展。有关在崩溃模式下使用adplus.vbs,请参阅http://msdn.microsoft.com/en-us/library/bb190764.aspx – 2010-03-09 20:19:43

2

编辑:刚才看到“在启动时立即发生”。 Indeed WinDBG can help

尽管用于Windows的调试工具确实主要针对本机应用程序,但它们对于托管应用程序也很有用。不仅托管应用程序在执行时最终为“本机”,而且对于WinDBG或CDB(如果您更喜欢命令行),也有特别的SOS extension

特别是(小)崩溃应用程序的转储可以用SOS扩展很好地分析。如果在释放或调试模式下编译应用程序并不重要,只要分析转储时手头上有匹配的符号文件(.PDB)即可。

这里有很多信息可供讨论,但最好的办法是搜索“windbg sos”。

关于例如你给

事件类型clr20r3。 .exe P2 2010.1.0.0, p3 4B857AFD P4 BLAH BLAH system.invalidoperation,P10 NIL。

它可能是别的东西,但对我来说,它看起来像在.NET应用程序中的未捕获异常 - 在这种情况下是System.InvalidOperationException。

如果你可以得到坠毁应用程序的小型转储(查看ADPlus工具,这是调试工具的一部分,以便按需获取转储或在事件中),那么你可以将它加载到WinDBG中,使用SOS扩展(命令!clrstack,!dumpstack,!threads等)来确定未捕获的异常来自何处。