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

C++빌더 자료실
C++Builder Programming Resources
[343] 디버깅 메시지 출력창 TraceWindow 1.7 버전입니다.
김태선 [cppbuilder] 21426 읽음    2007-05-25 13:37
디버깅 메시지 출력창으로 아주 쓸만한 TraceWindow 1.6입니다.
실무에 적용해서 쓰기 딱 좋습니다.
C++빌더 / VC++ / Delphi
다 지원하고 1.2 버전의 버그가 수정되었으며
몇가지 요청 사항을 수용해서 업그레이드 되었습니다.
그러고보니 만 1년만에 업그레이드해서 릴리즈하는 군요.

델파이는 C++에서 제공하는 TRACE를 쓴 소스 파일명, 함수명, 라인번호를
컴파일러 수준에서 지원하지 않아 조금 아쉽기는 하지만,
그래도 쓸만 할 것입니다.


다음은 도움말입니다. 
//---------------------------------------------------------------------------
이 프로그램과 문서는 상용 목적이 아니라면 누구나 제한없이 사용 가능하며, 배포 가능합니다.
Freeware.
Version
  1.0 : 2006.4.29
  1.1 : 2006.5.15
  1.2 : 2006.5.20
  1.5 : 2007.5.23
  1.6 : 2007.5.25
  1.7 : 2007.6.05

제작자: 김태성 jsdkts@korea.com
//---------------------------------------------------------------------------


C++Builder/VC++/Delphi용 디버깅 출력창 TraceWindow


[서론]

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

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

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

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


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

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


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

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

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

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

1.7 업그레이드 사항
  - C++빌더6 IDE에 TRACE 설치시의 버그 수정함. 에러 메시지 나오지 않음.

1.6 업그레이드 사항
  - 팝업 메뉴에 화면중앙으로 이동기능 추가. 듀얼 모니터 쓰다가 싱글로 바뀐 경우 필요할 때가 있음.
  - 테스크바에서 TraceWindow 프로그램 표시 없앰. 트레이에 있는 것만으로 충분함.
  - VC++ 전용 TraceVC.cpp 소스 제공. 이전에는 Trace.cpp 를 약간 수정해서 사용해야 했음.
   
1.5 업그레이드 사항
  - 옵션에서 표시 폰트를 바꿀수 있음.
  - XP Style 화면 지원.
  - TRACE를 한문장으로 처리하도록 바꿈. if (조건) TRACE(...); else TRACE(...); 식으로 사용 가능.
  - 줄당 즉시 Copy 기능 지원. SQL문장 디버깅시 바로 테스트할 수 있는 등 편리함.
  - 디버깅 정보 파일로 저장 기능 추가.
  - 출력 메시지중 CR LF가 있으면 다음 컬럼에 찍히는 버그 수정.
  - 이중 실행 방지.
  - 델파이 지원. (단 델파이는 컴파일러의 프로프로세스 기능이 없어
       릴리즈시 디버그 정보가 빠지지 않음. 최종 릴리즈시 수동으로 없애야 함.)
   
[사용방법]

소스에
#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% 사라지게 됩니다.


델파이의 경우는
제공되는 uTrace.pas 유닛을 포함하고
TRACE(format, [args]);
함수를 델파이식으로 사용하면 됩니다.


VC++에서는 VC++용으로 제공된 TraceVC.cpp TraceVC.h를 프로젝트에 추가하고
TRACE 를 쓸 곳에서 #include "TraceVC.h" 를 포함해서 사용하면 됩니다.

VC++에서는 C++빌더와는 달리 TRACE가 실행된 함수명을 __FUNC__ 에 넣어주지
않으므로, 함수명은 생략되어 나옵니다.



[주의사항 및 제한]

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

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

하지만 본래의 기능인 TRACE 사용은 버전 관계없이 가능하며,
VC++에서의 사용도 문제 없습니다.

[첨언]

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

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


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

환기9206년, 신시 5905년, 단기4340년(서력 2007년)  초여름.
박상수 [tesra]   2007-05-25 17:09 X
C++빌더 6.0과 VS2005 에서 잘 동작합니다.
좋은 프로그램 감사합니다.
김태선 [cppbuilder]   2007-05-25 17:19 X
요구하신 내용을 수용해서 릴리즈한 것입니다.
조금이라도 도움이 되었으면 합니다.

저도 빌더6.0과 VS2005에서 테스트했고, Delphi7에서 테스트했습니다.
freeman [builder88]   2007-06-06 09:42 X
좋은 프로그램 대단히 감사합니다.
그리고, 소스파일패스 출력부분이 한글인 경우 깨어져 알아볼 수 없습니다.
버그인것 같은데요.  부탁 드릴께요.
그럼 안녕히 계세요.

+ -

관련 글 리스트
343 디버깅 메시지 출력창 TraceWindow 1.7 버전입니다. 김태선 21426 2007/05/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.