【问题标题】:Winforms application crashesWinforms 应用程序崩溃
【发布时间】:2012-07-20 06:08:11
【问题描述】:

我正在使用 winforms 在 Visual C# 中开发一个应用程序。

该应用程序基本上是一个带有三个选项卡的屏幕。 它显示每秒在系统上运行的进程的值(使用 System.Diagnostics.Process[] )。

它生成和更新大量数字和计算(大约 4000/秒)。但是在 10000 次迭代或大约 45 分钟的工作之后,它就崩溃了,令人惊奇的是它总是在同一时间崩溃。

此处涉及的 RAM 仅为 70mb,并且在 windows xp 和 windows 7 下的应用程序的 CPU 负载从未超过 35%。该应用程序的目的是允许用户查看系统上运行的进程与 cpuload 和内存负载.出于安全原因,我们无法推荐任务管理器。

C# 中的任何try - catch 方法都不会捕获错误

以下屏幕是崩溃后的示例

主应用程序屏幕如下所示

有没有人遇到过应用程序在固定运行时间后崩溃的情况。

请建议一种诊断工具或捕获此类错误的方法。

感谢回复

【问题讨论】:

  • 你检查过内存泄漏吗?你有任何代码吗?
  • 它只是一个运行无限循环的计时器,它获取所有进程并在网格中显示。喜欢做 { Process[] plist = Process.GetProcesses(); } 而(真);内存泄漏(甚至更大的应用程序运行良好,而且它总是在固定运行后崩溃)。顺便说一句,你在 wordpress 上的博客很好。
  • 你是否也使用线程,例如后台工作者
  • 很难说是什么原因。如果它在特定迭代后崩溃,那么它可能是一些超出数组索引的东西。粘贴一些你认为可能是问题的代码,特别是你的 timier 代码

标签: c# winforms crash process diagnostics


【解决方案1】:

尝试将其添加到您的主要空白处的服务中

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

        public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            // do your logging here, write to a file, or send an email
        }

service.ExceptionThrown += service_ExceptionThrown;

        private static void service_ExceptionThrown(object sender, ExceptionThrownEventArgs e)
        {
            // do your logging here, write to a file, or send an email
        }

如果你想在 Visual Studio 中调试你的服务,那么只需在命令行参数中通过启动选项添加 -d

【讨论】:

  • @johnblade :我使用了一个计时器,循环只是循环遍历所有进程,如 foreach(Process p in plist) { } 。是的,我也尝试过使用 backgroundworker。甚至把 thread.sleep(1000) 放慢一点。是否有任何工具可以以某种方式指出错误。我已经下载了 CLR 分析器,但天哪,看起来需要一整周的时间来操作它。 (没有任何数据保存或数据表)
  • 你能用 -d 参数让它在 Visual Studio 中运行吗?
  • 我已经设置了 -d 选项,我需要在 Visual Studio 中运行它吗?我将放置事件处理程序(我认为我需要将它们放置在 program.cs 中)
  • 我的事件在静态主函数中,添加在那里
  • 从视觉工作室运行时似乎没问题,现在只是完全混乱。并在独立运行时崩溃。我想我会进行更多测试。我希望我有一根魔杖或精灵
【解决方案2】:

如果您在这台机器上安装了 Visual Studio,您应该能够在应用程序崩溃时对其进行调试。至少您应该看到抛出了哪个异常以及在哪里抛出。

在我的应用程序中,我有一个处理程序,它捕获未捕获的异常并将它们写入日志文件。

添加到构造函数

AppDomain currDomain = AppDomain.CurrentDomain;
currDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExHandler);

并添加这个处理程序

private void UnhandledExHandler(object sender, UnhandledExceptionEventArgs args)
{
    Exception e = (Exception)args.ExceptionObject;
    // Log the exception here
}

【讨论】:

  • 我会在调试器上试一试。
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2023-03-30
  • 2013-02-03
相关资源
最近更新 更多