首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法追踪的错误

无法追踪的错误
EN

Stack Overflow用户
提问于 2014-09-11 21:58:58
回答 2查看 182关注 0票数 0

我有一个相当简单的程序,作为一个库存跟踪程序。它是一个单线程,.net 4.0,并且完全是事件驱动的(不点击按钮就不会发生任何事情)。程序在没有按钮被点击的情况下崩溃。以下是我尝试获取有关此错误的任何信息所采取的措施:

首先:查找UNHANDELED异常或线程异常。为此错误创建一个消息框弹出窗口和一个数据库条目:

代码语言:javascript
复制
static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

        Application.Run(new archiveInventory_b());
    }
    static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception");
        ErrorLogEntry(e.Exception.Message + " INNER EXCEPTION: " + e.Exception.InnerException.Message, "ThreadException");
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");
        ErrorLogEntry((e.ExceptionObject as Exception).Message + " INNER EXCEPTION: " + (e.ExceptionObject as Exception).InnerException.Message, "UnhandledException");
    }

程序关闭,没有消息框或数据库条目。

第二:当程序关闭时,在ACT中抓住罪魁祸首:

代码语言:javascript
复制
private static void form_Closing(object sender, CancelEventArgs e)
    {
        const string message =
    "Are you sure that you would like to close the program?";
        const string caption = "Form Closing";
        var result = MessageBox.Show(message, caption,
                                     MessageBoxButtons.YesNo,
                                     MessageBoxIcon.Question);

        // If the no button was pressed ... 
        if (result == DialogResult.No)
        {
            // cancel the closure of the form.
            e.Cancel = true;
        }
    }

然而,从未出现过任何消息。还能做些什么来追踪这个人呢?

EN

回答 2

Stack Overflow用户

发布于 2014-09-11 22:43:25

有三个基本原因可以解释为什么.NET程序可以在不触发您编写的事件处理程序的情况下崩溃到桌面。我假设它在代码中不是很明显的东西,比如Environment.Exit():

  • A StackOverflowException.没有足够的堆栈空间来安全地做任何事情,包括触发这些事件。当你附加了调试器时,你总是知道它,但是当你运行你的程序没有调试器的时候,根本不会有通知。
  • An ExecutionEngineException。在检测到其内部数据结构已损坏时由CLR引发。到目前为止,最常见的原因是GC堆损坏,而这又是由错误的pinvoke声明或行为不端的非托管代码引起的。非常难以诊断,损坏总是在崩溃发生之前很久就发生了。
  • A /GS违规。/GS是一个C++编译器选项的名称,该选项向代码添加额外的检查,以验证处理器堆栈是否未损坏。一个非常常见的恶意软件攻击载体,一种让处理器只使用数据执行任意代码的方法。/GS检查存在于CLR中以及由抖动生成的代码中。这种不幸是非常罕见的,最初的.NET 4.0版本在CLR中有一些错误地触发了这个检查,但我已经很久没有听说过它了。可以使用调试器对它们进行诊断,但是您必须打开非托管代码调试。

这三个中的哪一个会使你的程序崩溃,你必须用很难的方法来找出。要发现下一步需要使用哪种方法,最基本的方法是关注进程退出代码。它的值将是非零值,表示失败,它被设置为匹配的基础SEH异常代码。当你在重现崩溃时遇到麻烦时,你可能不得不写一个小帮手程序,除了使用Process类来启动你的主程序之外,什么也不做。当它停止时,Process.ExitCode会为您提供该值。

也许不用说,这将需要一段时间来解决,所以分配您需要的资源来磨练这个问题。广泛的测试,以获得一个复制品是必需的。为一个简单的SOE祈祷吧,到目前为止最常见的原因是,其他两个非常丑陋,你可能需要微软的支持。

票数 2
EN

Stack Overflow用户

发布于 2014-09-11 22:17:26

在Windows x64中有一个known issue about swallowed Exceptions in the Load() event

要消除此原因(或检查它...),请在您的加载事件(如果适用)中添加try/catch,以便验证此处是否发生任何异常?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25789438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档