内部で例外をスローするときに(false == true)ブロックを実行する場合


152

かなり奇妙な問題が発生しています。

これは私のコードです:

private async Task BreakExpectedLogic()
{
    bool test = false;
    if (test == true)
    {
        Console.WriteLine("Hello!");
        throw new Exception("BAD HASH!");
    }
}

本当にシンプルに思えますが、Console.WriteLineやをヒットするべきではありませんthrow。何らかの理由で、常にをヒットしていthrowます。

throw独自のメソッドに移動すると、正常に動作します。私の質問は、それがifブロックを無視してヒットする方法ですthrow new Exception

ここにいくつかの証拠があります

編集1:署名を含めるようにコードを更新しました。この問題に関係のないものをすべて削除して実行しましたが、引き続き発生します。


5
@TimSchmelter画像はデバッグ中です。黄色のハイライトはコードの場所です
George

5
空のコアコンソールアプリを作成し、コードをMainand .... surprise、norepro に貼り付けました。あなたは間違っているか、いくつかの重要な詳細を見逃しました。
Jamiec 2017年

16
async万が一これがメソッド内にあるのでしょうか?stackoverflow.com/questions/42528458/…に
マシューワトソン

7
@George:古いデバッグシンボルを使用する可能性があるため、まだ証拠はありません。デバッグモードで再コンパイルしてから、もう一度開始してください。
Tim Schmelter 2017年

4
@TimSchmelterプロジェクトを再コンパイル、クリーンアップ、再オープンして、ifを実行するさまざまな方法を試しましたが、それでも同じです
George

回答:


176

それはasyncメソッドのバグのようです、コード実際には実行されませんが、デバッガーはthrowステートメントのある行にステップします。これらの行内のthrowステートメントの前のコードif行が無視されている場合、デバッガーはステートメントのある行にのみ進みますthrow

また、変数を使用しない場合、if (false)またはif (true == false)デバッガーが正しいコード行に移動する場合は、右中かっこに移動します。

このバグは、@ Matthew WatsonによってVisual Studioチームに投稿されています(リンクは現在利用できません)。

また、同様の質問を参照してください- 非同期メソッドの条件チェック

編集(2017/10/06):

.Net Framework 4.7を使用したVS 2017 15.3.5では問題を再現できません。VSチームがこの問題を修正したようです。


20
ありがとう、これはデバッガのバグであることを知らずに、私はおそらく怒ってしまうでしょう。
ジョージ

121
デバッガーのバグ?なんとメタだ。:)(これまでにこのようなメタバグを歌ったことはありません...
Simba

3
@Georgeよろしくお願いします。サンプルを取り、それを使用してコンソールアプリを作成し、RomaがリンクしているVS問題に添付しました。
黒曜石のフェニックス

5
@Simba:自分自身をデバッグするためにデバッガーを使用したことがないことを教えてください。
Joshua

3
うーん。バグはデバッガ自体ではなく、コンパイラによって生成されたデバッグ情報にある可能性があります。MSがConnectのバグを承認するのを待ってから、投票を行います。
エイドリアン・マッカーシー

10

答えの補足として、私は最近同じ問題に遭遇し、デバッガーで実際のx86コードを調べ、次のような奇妙な方法で生成されました(簡略化)。

// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret

したがって、メソッドの最後の命令に直接ジャンプするのではなく、2回ジャンプします。2番目の無条件ジャンプは、ifブロック内のコードの一部として誤って認識されていると思います。

したがって、このバグはJITコンパイラに関連しているのではないかと推測します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.