예외를 던질 때 (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
방금 빈 코어 콘솔 응용 프로그램을 만들고 코드 만 Main붙여서 놀랍게도 norepro에 붙여 넣었 습니다. 당신이 착각했거나 중요한 세부 사항을 놓쳤습니다.
Jamiec

16
이것은에 async혹시 방법은? 그것이 stackoverflow.com/questions/42528458/
Matthew Watson

7
@George : 오래된 디버그 기호를 사용할 수 있기 때문에 여전히 증거가 없습니다. 디버그 모드에서 다시 컴파일 한 후 다시 시작하십시오.
Tim Schmelter

4
@TimSchmelter 내가 다시 컴파일 한, 청소, 프로젝트가를하면 일을 다른 방법을 시도 재개하지만, 여전히 같은
조지

답변:


176

async메서드 의 버그 인 것 같습니다 . 코드 실제로 실행되지 않지만 디버거는 throw문 이있는 줄로 이동 합니다. 이 줄 throw안에 문장 앞에 몇 줄의 코드가있는 경우 if디버거 는 with with 줄 로만 이동합니다 throw.

- 또한, 변수를 사용하지 않는 경우 if (false)또는 if (true == false)다음 코드의 올바른 라인 단계 디버거 - 닫는 중괄호합니다.

이 버그는 @Matthew Watson 이 Visual Studio 팀 에 게시했습니다 (현재 링크를 사용할 수 없음).

또한 비슷한 질문을 참조하십시오- 비동기 방법의 조건 확인

편집 (2017/10/06) :

.Net Framework 4.7을 사용하여 VS 2017 15.3.5에서 문제를 재현 할 수 없습니다. VS 팀 이이 문제를 해결 한 것 같습니다.


20
이것이 디버거의 버그인지 알지 못하고 고맙게 생각합니다.
George

121
디버거의 버그? 메타가 얼마나 :) (노래 전에 이런 메타 버그를 부르지 않는 노래 ... )
Simba

3
@George 걱정하지 않기를 바랍니다. 샘플을 가져 와서 그것을 사용하여 콘솔 응용 프로그램을 만들고 Roma가 연결 된 VS 문제에 첨부했습니다.
흑요석 피닉스

5
@ Simba : 디버거를 사용하여 자신을 디버깅 한 적이 없다고 말합니다.
Joshua

3
흠. 버그는 디버거 자체가 아닌 컴파일러가 생성 한 디버그 정보에있을 수 있습니다. 투표에 참여하기 전에 MS가 Connect 버그를 인식 할 때까지 기다릴 것입니다.
Adrian McCarthy

10

대답에 대한 부록, 최근에 같은 문제가 발생하여 디버거에서 실제 x86 코드를 보았으며 다음과 같이 이상한 방식으로 생성되었습니다 (단순화).

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

따라서 메소드의 마지막 명령어로 직접 점프하는 대신 이중 점프를 수행합니다. 여기서 두 번째 무조건 점프는 if블록 내부의 코드의 일부로 잘못 인식됩니다 .

따라서이 버그는 JIT 컴파일러와 관련이 있다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.