2008. 8. 23. 20:58

[펌]Visual C++ 6.0 사용하기 - 디버깅



이번에는 VC++ 6.0으로 디버그하는 법을 한번 알아보겠습니다.

프로그래밍에서 가장 어렵고 많은 시간을 차지하는게 디버깅이죠.


VC++은 여러가지 기능을 제공하여 좀더 수월하게 디버깅을 할 수 있습니다.


십진수의 이진수 값을 보여주는 간단한 예제를 통해 디버깅 방법을 알아보도록 하겟습니다.


#include <iostream>
#include <climits>              // for CHAR_BIT
using namespace std;

void main()
{
    int num = 2004, size, mask = 0x80000000;
    char bin[64];

    // int형의 비트 크기를 구한다.
    size = sizeof(int) * CHAR_BIT

    for( int i = 0; i < size; i++ )
    {
        if( (num & mask) == 0 ) bin[i] = '0';
        else bin[i] = '1';

        mask >>= 1;        // 우측 시프트
    }
    bin[i] = '\0';

    prinft("%d = %s\n", num, bin);
}



▷ 문법에러 디버깅


위 소스를 컴파일하면 에러가 발생하고 에러 정보가 아래 빌드창에 나타나게 됩니다.


 

에러 메세지를 더블클릭하거나 F4를 누르면 해당 에러위치로 에디터 창의 커서가 바로 이동하게 됩니다.



▷ 논리에러 디버깅


문법에러는 컴파일러가 명확하게 알려주기 때문에 디버깅이 아주 쉽습니다. 그러나 논리에러는 프로그래머가 직접 찾아내는수 밖에 없죠.


위 소스의 문법에러를 고치고 컴파일을 하면


2004 = 00000000000000000000011111111111


라는 결과가 나오지만 사실 십진수 2004는 이진수로 11111010100 입니다.


어디서 잘못됬는지 디버깅을 해보겠습니다.


디버깅을 시작할려면 먼저 툴바의 아이콘이나 단축키 F9로 브레이크 포인트를 지정합니다.



그 다음에 툴바의 아이콘이나 단축키 F5로 디버그를 시작합니다.

 
그럼 디버그 모드로 전환되고 디버그 툴바와 진행화살표가 브레이크포인트에서 멈춰있는것을 볼 수 있습니다.


 

아래 세 버튼을 적절히 사용해서 한줄씩 디버그를 해나가면 됩니다.

(코드가 복잡할 경우 브레이크 포인트를 여러개 잡아서 F5 를 눌러가며 디버그 할 수도 있습니다.)

Step Into : 한줄씩 실행하며 함수 내부로 들어간다. (F11)


Step Over : 한줄씩 실행하며 함수 내부로 들어가지 않는다. (F10)


Step Out : 함수에서 바로 빠져나온다. (Shift + F11)


디버그 중에 현재 변수의 값을 알려면 변수 위에 마우스를 가져다 두거나 Watch 창을 이용할 수 있습니다.


bin[] 배열과 mask 변수가 어떻게 변하는지 Watch 창으로 감시해보도록 하죠.


Watch 창에 두 변수의 이름을 추가합니다.



(변수이름 길어서 타이핑하기가 귀찮으면 블럭을 잡아서 마우스로 드래그해도 됩니다. )
 
 
그런데 mask 값이 10진수로 나와서 보기 불편하기 때문에 아래처럼 쉼표(,)를 찍고 포맷을 정하는 기호를 붙일수 있습니다. ( x 16진수, s 문자열, d 십진수, c 문자 등 )

디버깅을 해보면 우측 시프트한 mask 값이 잘못 되었다는 것을 알수 있습니다.
 

mask 변수값이 0x80000000 일때 mask >>= 1; 을  하면 0x40000000 가 되어야 하는데 mask 변수의 자료형이 signed int 이기 때문에 우측 산술시프트가 되어버려서 0xc0000000 가 되었던 겁니다.
 
우측 논리시프트를 하기 위해서 int mask = 0x80000000; 를 unsigned int mask = 0x80000000 로 고침으로써 제대로된 결과를 얻었습니다.
 
 
 
다음에는 Quick Watch 와 Call Stack 창 그리고 Break Point 대해 설명해보도록 하겠습니다.
 
 
 
참고도서 -------------------------------------------
 
DEBUGGING C++ ( H.PAPPAS 저 이준하 역 ) 인포북 출판
 
 
 
출처 : 네이버카페
http://cafe.naver.com/cafec/1339