7

リリースモードとデバッグモードの違いは何ですか?

また、リリースモードでデバッグして、何が失敗しているかを確認するにはどうすればよいですか?

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);
        }
    }
}
4

5 に答える 5

8

スニペットの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));
    }
于 2012-08-25T19:28:33.973 に答える
3

私の経験によれば、あらゆる種類の設定を処理するコードを探す必要があります。

レジストリに設定がなく、application.configに設定がない状態で、アプリケーションをデバッグすることから始めることができます。

アプリケーションでデータベースを使用している場合は、空のデータベースでも試してみてください。

2番目のステップは、同僚のコンピューターでアプリケーションをデバッグすることです。

これがあなたの探求に役立つことを願っています。

于 2012-08-25T19:15:50.823 に答える
2

それが発生する理由はたくさんあり、多くの専門家は、それがあらゆるアプリケーションの古典的なバグであることを確認できます。これは、すべてが正常に機能していることを確認したときに表示されますが、クライアントマシンでは何も機能しません。

質問で提供された例外の詳細なしに、なぜこれが起こるのかを言うのは非常に難しいです。

ちなみに、Visual Studioからアプリケーションにアタッチすることで、アプリケーションをデバッグできます。

方法:実行中のプロセスにアタッチする

于 2012-08-25T18:36:12.260 に答える
0

デバッグモードとリリースモードは、コードをビルドするための2つの異なる方法です。使用するほとんどすべての開発環境で特定の方法が異なるため、すぐに判断することは不可能です。モードは、Mode1およびMode2と呼ばれることもあります。

ただし、デバッグモードでは、デバッグ情報(シンボルテーブル、行番号など)が、リリースではコンパイルされないバイナリにコンパイルされる可能性があります。しかし、何千もの違いがあります。

デバッグ/リリースモードが指定されている場所を見つけてみてください。違いがわかります。

于 2012-08-25T18:40:19.197 に答える
0

環境オプションを見つける最良の方法は、本番環境で何が起こっているかをログに記録することです。例外をキャッチしてログに記録することから始め、次に、より具体的なログに学習した内容を使用します。

手順については、このMicrosoftkbの記事を参照してください。

リリースモードとデバッグモードの背後にある考え方について:

リリースモードとデバッグモードは、さまざまな構成を可能にするために存在します。1つは開発者がバグを見つけるのに役立つ設計で、もう1つはパフォーマンスを最適化し、実稼働環境に合わせて構成するためのものです。

違いを知る最良の方法は、プロジェクトのビルドプロパティを表示することです(プロジェクトを右クリックし、[プロパティ]を選択して、左側の[ビルド]タブをクリックします)。構成に基づいて変更できるさまざまなオプションをすべて確認してください。

デバッグとリリースのもう1つの一般的な問題は、構成ファイルや埋め込みリソースなど、プロジェクトアイテムの1つに正しいビルドアクションを設定しないことです。

于 2012-08-25T18:46:45.397 に答える