0

Visual Studio で正常に動作するアプリケーションがあります。

ただし、スタンドアロンで実行すると、例外をスローする特定の操作が処理されません。(例外は予想されますが、VS では正しく処理されます。)

machine.config に行を追加して JIT デバッグを有効にし、問題の特定を試みましたが、バグを再現できませんでした (例外は正しく処理されました)。行を削除すると、バグが再発します。

原因を探るにはどうすればよいですか?

私のコードの関連部分(私が信じている)(余分な詳細を削除するために編集されています)はhttp://pastebin.com/i2zLCTn5にあります。

4

2 に答える 2

0

Visual Studio のさまざまな環境でコードがどのように動作するかに影響を与える可能性のあるいくつかの提案:

  • Visual Studio でプログラムを実行するときに、Visual Studio が JIT Optimizer をオフにするのを停止します。

    「モジュールのロード時にJIT最適化を抑制する」というオプションがあります...それをチェックしないように変更してみてください。

    オプションの詳細については、http:

    //msdn.microsoft.com/en-us/library/ms241594.aspxを参照してください。

ここに画像の説明を入力

  • 「ホスティングプロセス」をオフにします... http://msdn.microsoft.com/en-us/library/ms185330(v=vs.80).aspx

  • プログラムを実行し、次に「プロセスにアタッチ」します (その後、ホスティング プロセスにはならず、モジュールがロードされ、JIT が最適化されます)。

  • 例外ダイアログで、食べられている/処理されている例外の「スロー」チェックボックスにチェックマークを付けて、誰がなぜそれを処理しているかを追跡できるようにします。例外がそこで処理されている場合は、詳細を確認できるように NET Framework ソースコードをインストールする必要があります。

  • 代わりに、WinDBG で実行してみることができます (.vshost などのホスティング プロセスでは実行されないため、動作が異なる場合があります)...拡張 DLL PSSCOR4 があることを確認してください (.NET 4 を使用している場合) ) 物事を理解できるようにします。

于 2013-06-06T15:31:04.940 に答える
0

それで、私はこの問題の原因を発見しました-というか、友人が説明しました:

JIT デバッグが無効になっていると、実行が正しく流れているように見えても、スレッド間で例外をキャッチすることはできません。

Form.Closing イベント ハンドラーで例外がスローされていました。

form.Closing += new delegate
{
    switch(form.DialogResult)
    {
        case DialogResult.OK:
            // do stuff;
            break;
        case DialogResult.Cancel:
            throw new AbortOperationException();
    }
}

// ...

try
{
    mainForm.Invoke(new Function<Form, DialogResult>(form.ShowDialog), mainWindow);
}
catch (AbortOperationException)
{
    // handle abort
}

解決策は、以下を排除するためにわずかにリファクタリングすることでしたthrow

form.Closing += new delegate
{
    if (form.DialogResult == DialogResult.OK)
    {
        // do stuff
    }
}

// ...

var result = (DialogResult)mainForm.Invoke(new Function<Form, DialogResult>
if (result == DialogResult.Cancel)
{
    // handle abort
}
于 2013-06-07T12:43:33.347 に答える