C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 자료실
C++Builder Programming Resources
[309] C++용 디버깅 출력창 TraceWindow 1.2 (수정버전)
김태선 [jsdkts] 14378 읽음    2006-05-15 16:50
1.1에 테스트용 코드를 빼지 않아서 다시 올립니다.
//---------------------------------------------------------------------------


C++용 디버깅 출력창 TraceWindow


[서론]

C++프로그램 제작시 프로그램 실행 중간에 어떤 값를 출력해보고 싶을때가 많습니다.
이를 흔히 디버깅 정보를 출력해 본다라고 말합니다.
편법으로 어떤 이는 메시지 박스를 이용해 값을 찍어보기도 하고,
어떤 이는 윈도창의 특정 부분이나 메모장에 값을 찍어 보기도 합니다.

C++빌더는 EventLog 창에 OutputDebugString(String); 함수로 디버그 정보를 표시할 수 있습니다.
VC++에는 Debug 창에 마찬가지로 OutputDebugString(LPCTSTR); 로 디버그 정보를 출력할 수 있습니다.

그런데, EventLog 창에는 다른 이벤트 메시지와 같이 출력되는 문제가 있고,
OutputDebugString() 함수는 단순히 String만을 인자로 받기 때문에 실용상 불편합니다.
실제로는
{
    char  buf[100];
    wsprintf(buf, "이 값은 : %d", value);
    OutputDebugString(buf);
}
식으로 쓰여야 하기 때문입니다.
이러한 문제는 VC++의 경우도 비슷합니다.

더욱 심각한 문제는 Release모드(#define _DEBUG 되지 않은) 상태에서도
OutputDebugString()은 컴파일한 바이너리에서 코드가 그대로 유지된다는 점입니다.
릴리즈 모드로 컴파일할때는 디버깅 정보를 볼 필요가 없기 때문에 당연히 컴파일한 결과에서
모두 빠져야 하기 때문입니다.


그래서 C++빌더에서 보다 간편하게 실시간으로 디버깅 정보를 표시할 수 없을까해서
처음에는 VC++용 TrecePlus를 구해서 빌더용으로 사용했습니다.
하지만 역시 릴리즈 모드에서 디버깅 정보 출력함수가 빠지지 않았고, TracePlus는 단순히
메시지만을 출력하였으며, 부가 옵션이 없어 사용에 조금 불편했습니다.

그래서 보다 세밀한 디버깅 정보의 출력과
릴리즈모드에서 완전히 디버깅 정보 출력 코드는 빠지게 하는 새로운 디버깅 정보 출력창이
필요하게 되었으며, 여기에 몇가지 부가적인 처리 기능을 붙여서
TraceWindow라는 프로그램을 제작하여 공개하게 되었습니다.


세밀한 디버깅 정보의 출력이란, 기존에는 함수에서 표시하는 메시지에 한정 되었던 것을
디버깅 메시지를 출력하는 TRACE(); 가 쓰인 곳의 함수명과
소스파일명과 소스파일의 패스 및 그 라인번호를 시간과 더불어 같이 찍히게 했습니다.
시간은 1초 이하의 시간도 찍히게 개선 되었습니다.

또한 옵션에는
표시할 총 라인수의 제한과 윈도 기동시 자동 시작, 항상 창을 최상위로 유지할수 있는
기능이 들어 있고,
부가 기능으로 Trace.h 를 프로젝트에 포함시키지 않고 그냥 include 해서 사용할수 있는
기능과 IDE의 TOOLS 메뉴에 TraceWindow를 자동 등록하는 기능을 갖추고 있습니다.
또한 빌더 화면 디자인 폼의 기본 폰트를 조절할 수 있는 간단한 서비스를 갖추고 있습니다.

물론 첨부한 소스인 Trace.h 와 Trace.cpp를 프로젝트에 포함해서 사용하는게 정석이며
빌더에 IDE 및 빌더 컴파일러의 한부분으로 설치하는 것은 간편하게 TRACE를 사용할 수
있게 하는 서비스 차원의 기능입니다.

프로젝트마다 디버깅 정보 출력은 안쓰이는 곳이 없기 때문에
간편하게 사용할수 있게 하는 것이 좋으리라 생각되어서 입니다.


[사용방법]

소스에
#include "Trace.h"
로 포함하시고
TRACE창 프로그램인 TraceWindow.exe는 실행시켜 놓고,
소스에 추적하고 싶은 곳에 디버깅 정보를 기재하면 됩니다.
IDE에 설치한 경우는 IDE->Tools 메뉴에 나타납니다.

void  TTest::IamFunc(int value)
{
   TRACE("난 함수다. 인자값은 : %d", value);  // 이 줄이 151번 라인이라면
}
이런 식으로 TRACE 라인을 넣으면 됩니다.

이때 물론 Trace.cpp 는 프로젝트에 추가해야 겠지요.
또는 빌더에 이 TraceWindow를 설치한 경우는  프로젝트에 포함하는 대신,
#pragma link "Trace.obj"
한 줄을 소스에 넣어 주어도 됩니다.

결과는
//--------------------------------------------------------------------------------------
난 함수다. 인자값은: 100     151  TTest::IamFunc  TTest.cpp  D:\CBuilder6\Src\Project1\
//--------------------------------------------------------------------------------------
이렇게 찍힙니다.
TTest.cpp 소스의 TTest::IamFunc 함수가 있는 곳 151번째 줄에서 디버깅 정보를
출력한 사실을 알 수 있습니다.



나중에 릴리즈모드 컴파일할 때 이 TRACE  라인을 지울 필요는 없습니다.
릴리즈모드로 컴파일하거나
#include "Trace.h"
이전에
#define TRACE_OFF
또는
#define DEBUG_OFF
라고 선언해주기만 하면 됩니다.
또는 프로젝트->Options->Directory...->Conditionals 에 넣어주어도 됩니다.
그러면 실행 바이너리 화일에서는 디버깅 정보 출력 코드가 100% 사라지게 됩니다.


[주의사항 및 제한]

주의사항은 소스에서 TRACE 찍을때 | 문자를 포함하면 안됩니다.
항목 구분자로 사용하기 때문입니다.

현재 이 프로그램은 C++Builder 6에서 테스트되었으며,
다른 버전은 기능중의 일부인 자동설치기능을 지원하지 않습니다.
다른 버전은 Trace.h 와 Trace.cpp를 항상 프로젝트에 포함해서 사용해야 합니다.
또한 폼 기본폰트 설정 역시 다른 버전은 지원하지 않습니다.

하지만 본래의 기능인 TRACE 사용은 버전 관계없이 가능하며,
VC++에서의 사용도 문제 없습니다.
첨부한 Trace.cpp 소스를 변경하면
델파이에서의 사용도 가능한데, 이는 별도로 제작해 지원할 생각입니다.


[첨언]

이 프로그램을 트레이에 내려 놓으면 메모리를 1M 이하로 사용하므로
개발시 늘 띄워 놓아도 개발환경에 전혀 지장을 주지 않습니다.

리포팅되는 버그와 추가 기능은 차후 작업할 예정입니다.


그럼 즐거운 플밍하시기를...

//---------------------------------------------------------------------------
이 프로그램과 문서는 상용 목적이 아니라면 누구나 제한없이 사용 가능하며, 배포 가능합니다.

Freeware.
Version 1.0 : 2006.4.29
    1.1 : 2006.5.15
제작자: 김태성 jsdkts@korea.com
크레브 [kkol]   2007-02-22 00:40 X
쓸만할것 같군요.. 잘써보겠습니다. ^^
smleelms [smleelms]   2007-02-26 13:03 X
덕분에 잘 사용하고 있습니다. 한가지 건의 사항이 있어서 그럽니다만, 리스트창의 폰트를 설정할 수는 없을까요 ?

+ -

관련 글 리스트
309 C++용 디버깅 출력창 TraceWindow 1.2 (수정버전) 김태선 14378 2006/05/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.