E D R , A S I H C RSS

Release Debug Build Start Go의관계

VC++ 통합환경을 사용할 때 가장 많 쓰게 되는 기능 중, Build->Start(CTRL+F5)와 Debug->Go(F5)의 차점중 하나에 대해 알아 보겠습니다.

F5는 IDE(통합환경)가 실행 프로세스를 반동결(Soft-ice)상태로 실행시켜, 사용자가 내부 변수의 값을 들여다 볼 수 있거나 중간에 멈출 수 있게 합니다. 디버깅을 할 때에 아주 중요한 역할을 하지요.
반면, CTRL-F5는 IDE가 실행 프로세스를 단순히 생성(fork)하는 역할만 합니다. 즉, 배포된 프로그램을 우리가 설치해서 실행할 때와 똑같은 환경라고 생각하면 되겠습니다.

두 개의 기능은 방금 설명한 것 외에 조금 다른 실행환경을 제공합니다. 바로 "미초기화 변수의 초기화"입니다. 그리고, 양상은 프로그램 릴리즈 빌드냐, 디버그 빌드냐에 따라 다릅니다. 아래와 같은 구조체와 것을 사용한 코드(비록 한 줄지만)있다고 가정합시다.

~cpp 
struct Sample
{
   Sample(bool b_isValid):b_isValid_(b_isValid){}
   Sample(){}
   
   inline bool isValid(){return b_isValid_;}

   bool  b_isValid_;
};

.
.
.


Sample smpl1; 
bool b = smpl1.isValid();

코드를 릴리즈 빌드로 만들고, Start(CTRL+F5)로 실행할 때의 b값과 Go(F5)로 실행할 때의 b값을 체크하면 서로 다르게 나옵니다. Start의 경우 b의 값 false가 나오고, Go의 경우 b의 값 true로 나옵니다. 바꾸어 말하면 Start는 미초기화 변수를 0으로 놓고, Go는 0 아닌 값으로 세팅한다는 것입니다. (실제로 bool 타입의 false 값을 VC6의 디버거로 읽으면 0입니다. VC7의 경우엔 false라고 나오지만요)

한데, 디버그 빌드의 경우는 어떨까요? 그 경우에는 Start나 Go나 차를 보지 않고 b값 true입니다. 여기서 자그마한 결론을 얻을 수 있습니다.

  1. 디버그 빌드를 했거나 F5로 실행시키는 경우, 미초기화 변수는 0 아닌 값으로 초기화된다.
  2. 릴리즈 빌드한 프로그램을 CTRL-F5로 실행시키는 경우, 미초기화 변수는 0으로 초기화된다.

    디버깅할 때는 잘 돌던 프로그램 그냥 실행시킬 땐 오동작을 보는 경우가 있어 막대한 육체적/정신적 에너지를 낭비하는 경우가 있는데, 그런 경우를 만난다면 글의 내용을 한 번쯤 떠올려 보시기 바랍니다. 그리고 다음의 점검을 해보시기 바랍니다.

    -기본생성자가 함부로 내동댕쳐져 있는가?
    -복사생성자에서 멤버 간 대입(member-wise assignment)를 잘 하는가?
    - 전역변수와 정적변수 초기화를 제대로 했는가?
    - 실수로 초기화하지 않고 쓰는 지역변수가 있는가?(요즘 나오는 대부분의 좋은 컴파일러는 경고 메시지를 내주긴 합니다만)

ExtractedFrom) http://www.kwak101.pe.kr/
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:27:53
Processing time 0.0146 sec