Release에서 디버깅 하기 ...

OS/Windows 2008. 11. 21. 10:54

저같은 경우 통신 프로그램을 개발 할 때
로컬에서 작업을 마치고 나서 실 서버에 서버 프로그램을 올립니다.
그런데 거의 대부분 실서버 올렸다고 바로 릴리즈 하지 못합니다.
쏟아지는 버그와 수정 사항들 ... (저만 그런가요? ^^; )
이럴때 디버깅 하기가 참 곤란 합니다.
다시 로컬 작업하던 컴퓨터에서 디버깅 모드로 디버깅하고 컴파일 하고
다시 실 서버로 올려서 돌아가는지 확인하고.... 에휴~~~~
그럴대 참으로 유용한 방법입니다.

디버그 모드에서 출력창에 스트링을 TRACE 구문이 있는데요
WIN32 API 중에 OutputDebugString()이라는 API가 있습니다.
이건 릴리즈에서도 출력창에 스트링을 출력할 수 있습니다.
그런데 이렇게 막연하게 설명하면은
출력은 어디서 봐????
이러실텐데요....
출력을 보는 프로그램은 Win32 API로 직접만들수도 있지만...
저 같은 경우는 DebugView 라는 프로그램을 사용합니다.
DebugView의 사용법은 헬프 파일을 살펴보세요.
암튼...

OutputDebugString 사용법은 참으로 간단합니다.
void WINAPI OutputDebugString(
  __in_opt  LPCTSTR lpOutputString
);

그냥 문자열을 넘기면 됩니다.
그런데 여기서 문제가 살짝 발생하네요.... 다 좋은데.... 전 printf 같이
인자도 넘기고 싶습니다.
그래서 전 이렇게 했습니다.

void OutputDebugPrintf(TCHAR* pszFormat, ...)
{
    //가변인자의 길이를 모르기때문에 동적으로 생성하기 위한 포인터 변수
    TCHAR* pBuffer = NULL;
    va_list args;

    va_start(args, pszFormat);
    // 가변인자 스트링의 길이를 구한다.
    int nLen = _vsctprintf(pszFormat, args) + sizeof(TCHAR);
    // 가변인자 길이만큼 문자열을 생성한다.
    pBuffer = new TCHAR[nLen];
    // 복사한다.
    _vstprintf_s(pBuffer, nLen, pszFormat, args);
    va_end(args); // Windows에서는 필요없음
 
   // 출력해준다.
   ::OutputDebugString(pBuffer);
    if (pBuffer)
    {
        delete[] pBuffer;
        pBuffer = NULL;
    }
}

va_list, va_start, va_end는 printf와 같이 가변인자를 받아서 처리하는
매크로 들입니다.
이걸이용하면은 인자가 몇개든 출력할수 있습니다.
사용법은 printf와 같습니다.




posted by 뚱2