요약: 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