我支持相当广泛部署的.NET 2.0 Winforms应用程序。在极少数情况下,我们会收到客户的支持电话,当您尝试启动应用程序时,应用程序将返回.NET运行时异常。
在过去,我们帮助客户重新安装.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 Runtime 2.0错误。 EventID:5000
提前致谢。
赛斯
答案 0 :(得分: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
答案 1 :(得分:2)
编辑:刚刚看到“在启动时立即发生”。 Indeed WinDBG can help
虽然Windows调试工具确实主要用于本机应用程序,但它们对托管应用程序也很有用。托管应用程序最终在执行时不仅是“本机”,而且还有特别是WinDBG或CDB的SOS extension(如果您更喜欢命令行)。
特别是(小型)崩溃的应用程序转储可以通过SOS扩展进行非常好的分析。如果您的应用程序在发布或调试模式下编译并不重要,只要您在分析转储时获得匹配的符号文件(.PDB)。
那里有很多信息,在这个答案中有很多话要说,但你最好的选择是搜索“windbg sos”。
关于你给出的例子
EventType 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等)来计算未捕获异常的来源。
答案 2 :(得分:0)
我认为你不想要“Windows调试工具”。调试符号适用于OS,而不适用于.NET Framework。 (提醒一下,您的Windows.Forms应用程序位于.NET Framework中,而不是操作系统中。)
http://msdn.microsoft.com/en-us/library/y7f5zaaa.aspx的“远程调试”帮助吗?
我通常包含“StopSwitch”,但这不是启用JIT的要求。 (请参阅http://missico.spaces.live.com/blog/cns!7178D2C79BA0A7E3!309.entry处的“StopSwitch停止执行即时调试”)这允许我启用交换机,然后在它到达调试器停止语句时附加到正在运行的应用程序。
您可以调试“发布”版本。发布pdb有助于堆栈跟踪。
之前我遇到过这个问题。我启用了StopSwitch,检查是第一行,但JIT没有启动,因为问题发生在.NET Framework甚至加载我的应用程序之前。
答案 3 :(得分:0)
我写了一篇博客文章,其中包含一些分步说明以及有用的网址。
赛斯