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가 잘 작동하는 지 확인해 보자.

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

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


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

"Gossip Girl" star Michelle Trachtenberg dies at 39

미셸 트랙튼버그 하우스에서 심장 이식 받았던 환자로 나왔는데 현실에서는 간이식을 받았었구나 가십걸이나 버피더뱀파이어슬레이어 이제 정주행해 볼까... 블로그도 다시 살려 볼까 훠훠