Product -> Edit scheme  에서 info의 Build Configuration에서 변경해 주면된다.

단축키는 "Command+<" 이다. 
posted by 뚱2
posted by 뚱2
Visual Studio 2008에서 C++ 프로그램을 컴파일 하면은 기본적으로 두가지 모드가 있습니다.

Release /Debug 두 버전의 차이점은 다른 소소한 성능 향상을 위한 컴파일 옵션도 있지만

가장 중요한건 디버깅이 가능하느냐 가능하지 않냐의 차이점 이라고 생각입니다.

그런데 기존에 구축되어 있는 프로그램을 유지 보수 하다보면은 디버깅 할일이 발생합니다.

기존의 선임이 Release / Debug  별로 프로젝트를 잘 관리했으면 좋겠지만

세상 사는 일이 다 내맘데로 안되듯이 너무 오랜기간 유지 보수를 하다보니 Debug 정보가 유실되는 경우가 있습니다.

프로젝트가 하나의 exe이면 다시 Debug 컴파일 하면되지만 exe와 dll이 약 40~50개 연결된 프로그램이라면

헉 소리 납니다.

이럴때 기본적으로 되어 있는 Release에서 디버깅 정보를 삽입해서 컴파일 할 수 있습니다.

프로젝트 속성 (ALT + F7) 으로 들어가서 아래 그림과 같이 3개의 설명을 그림에 맞게 해주시면 Release 에서도 

디버깅 가능합니다.

* Property Page -> Configuration Properties -> C++ -> General -> Debug Information Format

* Property Page -> Configuration Properties -> C++ -> Optimization -> Optimization 

* Property Page -> Configuration Properties -> Linker -> Debugging -> Generate Debug Info

  
posted by 뚱2

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