Wednesday, September 1, 2021

갑자기 Step Into가 안될 때

요약: Short-circuit 당해서 그냥 step into 안 해버리는 경우가 있다.


원래 이랬던 프로그램을

void f1() { /* do something */ }

void f2() { }

void f3() {}

void f() {f1(); f2(); f3(); }

이것을 각 단계 별로 실행하다 한 번이라도 실패하면 바로 중단하기 위해서 bool을 리턴하게 바꿨다:

bool f1r() { /*Side effects*/ if(...) return true; else return false; }

bool f2r() { /*Side effects*/ if(...) return true; else return false; }

bool f3r() { /*Side effects*/ if(...) return true; else return false; }

그리고 중간에 모종의 이유로,
일단 f1, f2, f3를 무조건 다 실행시키고 b값을 마지막에 비교하기로 계획을 바꾼다(if(!b) return 주석화).

void f() {

 bool b = f1(); 

 // if(!b) return;  

 b = b && f2();

// if(!b) return;

 b = b && f3();

// if(!b) return;

// Do rest

}

그랬더니 f2, f3가 실행되지 않았다. 그래서 디버깅을 했더니 step into가 먹히지 않는 것이다!

 f1, f2, f3가 위치한 행에서 step into (F11)를 시도하면 break point를 무시한다. f1/f2/f3 내부에 break point를 둬도 무시한다.

그리고 더 무서운 것은 이것이 "intermittent"하게 일어난다는 것이다.
(사실 b = false일 때만 무시되는 것)




Visual studio 임시 파일 지우고 이것저것 해 보기 전에...

* 다른 함수에 대해서는 step into가 잘 작동하는 지 확인해 보자.

* 함수의 반환값은 무적권 별도의 변수로 저장하는 게 디버깅하기에 좋다.

* 원래의 의도와 다르게 뭔가를 사용할 때는 문제가 생기기 쉽다(...)


예전에도 이거 당했는데 또 당하면 매우 억울하다. 하하

No comments:

Post a Comment

창 핸들을 만드는 동안 오류가 발생했습니다

System.ComponentModel.Win32Exception was unhandled   MyForm w = new MyForm IntPtr handle = wnd.Handle;   // Exception occurs here class MyFo...