4

在 Windows 2003 服务器上,我有一个纯 .NET 3.5C#应用程序(没有非托管代码)。它通过套接字连接到各种其他远程系统,并充当数据中心。它可以正常运行 10-15 小时,没有问题,但有时它会消失。如果我使用任务管理器观看应用程序,内存使用量保持不变。

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

在进入之前try .. catch我做:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

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

我怎样才能捕捉到导致这种情况的任何异常?

4

5 回答 5

7

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

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

adplus -crash -pn your.exe -quiet

这个博客上有很多关于在 Windows 上调试的重要信息。

于 2008-11-06T12:36:00.307 回答
3

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

如果它是 Windows 服务,则异常可能出现在后台线程上,而不是编组回主线程。为了解决这个问题,您需要将任何后台线程编组回您的主线程,并且异常将在那里重新抛出,以便您可以捕获它。

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

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

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

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

Application.ThreadException += new Threading.ThreadExceptionHandler(CatchExceptions);
于 2008-11-06T13:05:57.890 回答
1

You could also attach WinDBG at startup and enable breakpoints on .NET exceptions. You can then do a !printexception to see what is going on.

于 2008-11-06T16:43:41.460 回答
1

EventLog 中可能有应用程序的踪迹。

我有一个 .Net 应用程序消失了,但无法捕获异常。每次发生这种情况时,EventLog 中都会有一个条目。

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

于 2008-11-07T11:27:34.903 回答
0

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

于 2008-11-06T12:33:14.303 回答