如何调试正在消失的应用程序

本文关键字:消失 应用程序 何调试 调试 | 更新日期: 2023-09-27 17:48:49

在Windows 2003服务器上,我有一个纯.NET 3.5 C#应用程序(没有非托管代码)。它通过套接字连接到其他各种远程系统,起到数据集线器的作用。它运行10-15个小时很好,没有问题,但有时它会消失。如果我使用任务管理器观看应用程序,内存使用率将保持不变。

Main()函数中,我将应用程序其余部分的调用封装在一个try .. catch块中,它刚刚完全经过该块——将异常记录到文件中的catch块被忽略。如果我手动引发一个异常进行测试,catch块就会被调用。

在进入try .. catch之前,我要:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

系统上有Watson博士,但DRWTSN32.EXE指向的目录中没有任何内容

我怎样才能发现导致这种情况的异常?

如何调试正在消失的应用程序

尝试使用微软的调试工具。你可以从这里下载。

使用adplus捕获崩溃,然后使用windbg进行分析。

adplus-class-pn-your.exe-quiet

这个博客上有很多关于windows调试的好信息。

如果这是一个Windows窗体应用程序,那么很可能是未处理的异常被窗口消息泵捕获,这就是为什么你永远看不到它。要处理此问题,请在此处查看我的答案。

如果是Windows服务,则异常可能出现在后台线程上,而没有整理回主线程。要处理这个问题,您需要将任何后台线程封送回主线程,并且异常将被重新抛出,以便您可以捕获它

如果它是一个控制台应用程序,那么我有点困惑。

编辑:您的评论说这是一个Windows窗体应用程序。在这种情况下,您可能没有看到异常,因为它是由内置的Windows窗体异常处理程序处理的,默认情况下执行以下操作:

  • 在以下情况下捕获未处理的托管异常:
    • 未附加调试器,并且
    • 在窗口消息处理过程中发生异常,并且
    • jitDebugging=false(在App.Config中)
  • 向用户显示对话框并防止应用程序终止

您可以通过在App.Config中设置jitDebugging=true来禁用此行为。然后,您应该能够通过注册事件Application.ThreadException来查看未处理的异常,例如在C#中:

Application.ThreadException += new Threading.ThreadExceptionHandler(CatchExceptions);

您还可以在启动时附加WinDBG,并在.NET异常上启用断点。然后,您可以执行!printexception来查看发生了什么。

EventLog中可能存在应用程序的跟踪。

我有一个.Net应用程序消失了,没有可能捕捉到异常。每次发生这种情况时,EventLog中都会有一个条目。

要查看事件日志,只需在命令提示符或运行框中键入EventVwr即可。

如果是Windows窗体应用程序,可以尝试Application.ThreadException