繁体   English   中英

为什么我的应用程序在发布模式下崩溃但在调试模式下不崩溃?

[英]Why does my application crash in release mode but not in debug mode?

发布模式和调试模式有什么区别?

如何在发布模式下调试以查看失败的原因?

class Program
{
    [STAThread]
    static void Main()
    {
        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainWindow());
        }
        catch (Exception ex)
        {
            Logger.Error("Main : "+ex.Message, typeof(Program));
            MessageBox.Show(ex.Message + ex.StackTrace);
            Environment.Exit(1);
        }
    }
}

您的代码段中的catch子句永远不会捕获应用程序的发布版本中的任何内容。 当您使用附加的调试器运行它时,它确实有效。

您缺少的是Application.ThreadException的行为方式。 每当检测到任何未处理的异常时,该事件就会触发。 但是,在调试代码时, 不会启用此功能。 没有安装异常处理程序来引发事件。 这样做是为了让您有一个很好的方法来调试未处理的异常。 你的代码改变这种行为,现在一个try块活跃,你的catch处理获取异常。

要使代码以相同的方式运行,您需要更改未处理的异常处理策略。 像这样:

    [STAThread]
    static void Main() {
        try {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
            Application.Run(new Form1());
        }
        catch (Exception ex) {
            // etc..
        }
    }

现在你的catch子句将始终捕获异常。 只要它在主线程上引发,它就不会捕获工作线程中引发的异常。 请考虑使用此代码进行统一处理:

    [STAThread]
    static void Main() {
        AppDomain.CurrentDomain.UnhandledException += AllUnhandledExceptions;
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
        Application.Run(new Form1());
    }

    private static void AllUnhandledExceptions(object sender, UnhandledExceptionEventArgs e) {
        var ex = (Exception)e.ExceptionObject;
        // Display or log ex.ToString()
        //...
        Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex));
    }

我的经验告诉我,您应该在寻找处理任何类型设置的代码。

您可以通过调试您的应用程序开始,没有注册表中的设置,也没有application.config中的设置。

如果您的应用程序使用数据库,您也应该尝试使用空数据库。

第二步是在你的同事的计算机上调试你的应用程序。

希望这会有助于你的追求。

很多原因导致它可能发生,并且许多专业人员可以确认这是任何应用程序的经典错误,当您确定一切都很好,但在客户端计算机上无法正常工作时出现。

如果没有问题中提供的任何异常细节,很难说为什么会发生这种情况。

顺便说一下,您可以通过从Visual Studio附加应用程序来调试应用程序。

如何:附加到正在运行的进程

调试和发布模式是构建代码的两种不同方式。 由于几乎每个开发环境的具体方式都不同,因此您无法立即说出。 这些模式也可以称为Mode1和Mode2。

但是,您的调试模式可能会将调试信息(符号表,行号等)编译到二进制文件中,而版本则不会。 但可能存在数千种差异。

尝试找到指定调试/发布模式的位置,您将发现差异!

找到任何环境选项的最佳方法是记录生产中发生的事情。 首先捕获并记录异常,然后使用您学到的内容进行更具体的日志记录。

有关说明,请参阅此Microsoft kb文章

至于发布和调试模式背后的想法:

存在发布模式和调试模式以允许不同的配置,一种设计可帮助开发人员查找错误,另一种设计可优化性能,以及配置生产环境。

了解差异的最佳方法是简单地调出项目构建属性(右键单击项目,选择“属性”,然后单击“左侧”的“构建”选项卡)。 查看可根据配置更改的所有不同选项。

调试与发布的另一个常见问题是没有在您的某个项目项上设置正确的构建操作 ,例如配置文件或嵌入式资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM