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

C++빌더 자료실
C++Builder Programming Resources
[652] Trace 개선 버젼
망치 [] 20693 읽음    2012-03-19 14:53
정말 몇년만에 Trace버젼을 업데이트 했습니다. 모든 윈도우 프로그램 개발시 필수로 쓰고 있습니다.

자료실 "Trace"검색해보면 지난 버젼 나옵니다.

사용방법은 자료실 지난 자료에 나와있는데 그 함수를 약간 수정했습니다.


//mode
#define	ICO_NONE	0
#define ICO_NORMAL	1
#define	ICO_ERROR	2
#define	ICO_WARNING	3
#define	ICO_INFO	                4

// 소스의 줄, 함수명, 소스파일명이 찍히게 하는 TRACE
void TRACE4(char* process, int level, int mode, int color, char * lpszFormat, ...)
{
	int 	nBuf;
	char 	szBuffer[4097];
	va_list args;

	va_start(args, lpszFormat);
	nBuf = vsprintf(szBuffer, lpszFormat, args);
	va_end(args);
	if (nBuf < 0) return;
	if (m.line > 0)
	{
		wsprintf(szBuffer + strlen(szBuffer), "|14|%s|%d|%d|%d|%d|%s|%s", process, level, mode, color, m.line, m.func, m.file);
		nBuf = strlen(szBuffer);
	}

	DWORD  dwError = GetLastError();
	COPYDATASTRUCT cds;
	cds.cbData = nBuf + 1;
	cds.lpData = (void *) szBuffer;

	if (m.TraceHandle == 0)
	{
		m.TraceHandle = FindWindow("TFormTrace", NULL);
		//m.TraceHandle = FindWindow(NULL, "TracePlus");
	}
	
	if (m.TraceHandle)
	{
		int iLength = SendMessage(m.TraceHandle, WM_COPYDATA, NULL, (LPARAM)&cds);
		if(iLength == 0)
		{
			m.TraceHandle = 0;
		}
	}	
	SetLastError(dwError);
	m.line = 0;
}


FindWindow는 TFormTrace로 해놓았는데 이건 변경가능하고, 변경하면 Trace 프로그램의
config.ini 환경파일에

[config]
ClassName=TFormTrace

이 부분을 동일하게 변경해서 사용하시면 됩니다.

추가된 기능은 아래와 같습니다.

- 프로세스명 필드 추가
- 디버그 레벨 추가
- 프로세스명에 따른 필터링
- 디버그 레벨에 따른 선택적 필터링
- 디버그 레벨 모드에 따른 필터링
- 디버깅하는 프로그램에서 트레이스 표시시 텍스트 색상 선택
- 필터링 기능 추가(레벨, 프로세스)
- 저장 형식(txt, csv, rtf, html) 추가 ... html로 저장시 한글이 깨집니다. VirtualStringTree에서 깨지더군요...
- 리스트 폰트 변경

- 그리고 전에 Trace는 반드시 Trace프로그램이 실행이 먼저 되어야 했는데 어느때 실행에도 Trace가 되도록 했습니다.
- 최대 MaxLine수가 있습니다. 메모리 문제때문에 이 라인수만큼 보여지도록 했으며, 그 이상이 되면 항상 최신의 데이터의 최대 MaxLine만큼을 가지도록 했습니다.
- 리스트를 선택하고 오른쪽 클릭하면 현재 디버깅 메시지에 대한 색상을 선택해서 표시하도록 할수 있으며, 이 리스트는 저장해서 다시 불러와서 쓸수 있도록 했습니다.

처음 버젼은 김태선님의 소스를 보고 참조하였습니다.

앞으로 더 개선하고 싶은것들이 있는데 일단 시간의 여유가 있을때를 기다려야겠군요.

상용 Trace프로그램들하고는 기능이 많이 떨어지지만 속도때문에 이것만 써서 개발하고 있습니다.

http://blog.naver.com/mangchyda/100153193707
장성호 [nasilso]   2012-03-22 16:46 X
좋은자료 감사합니다.

WM_COPYDATA 말고 multi-thread , multi-process환경에서 좀더 빠른 방법이 없을까요?
망치 [mangchy]   2012-03-22 23:48 X
글쎄요...주로 저는 MemoryMapFile을 쓰는데 Trace에서는 그냥 WM_COPYDATA로 쭈욱 가네요...
맵파일을 쓰려면 이것저것 share하는데 있어서 Lock, Unlock해야되는것을 생각하니 Trace프로그램 코딩하는데 시간이 걸릴거 같아서
윈도우가 알아서 해주는 메시지로 그냥 쓰기로 했습니다.
대신 Trace에서 WM_CopyData메시지 처리하는 부분에서 최소한의 시간만 소요하게 하는 방식으로 해서 전에 버젼보다는 속도를 좀 증가시켰습니다.
지금 이 Trace로 쓰레드 20여개 정도 돌아가는 프로그램 디버깅하는데도 나름 잘 돌아가던데요...
좀더 속도를 요하는 환경이 어떤거길래....궁금하네요... 비젼쪽이 그런건가요?
장성호 [nasilso]   2012-03-23 14:59 X
아뇨~!
꼭 대단한 속도를 요구하는  환경이 이어서 그런것은 아니구요
저희회사에서도 위와같은 방식으로 Loging-Lib와 어플을 만들어 쓰고 있는데요
그냥 좀더 좋은 방법이 없나 고민해 본것입니다.
------------------------------------------------------------
WM_COPYDATA 를 이용한 방식이 메세지 하나에 마이크로(수십~수백 usec) 단위이긴 하지만
적은 시간은 아닌것 같구요

one-process(multi-thread) 환경이 아니라면
근야 file에 기록하는것이 빠르고, lock도  critical_section으로 하면 쉽고 빠르고 한데..

multi-process환경은..
lock거는데 mutex등을 이용하니 상당히 시간이 걸리더군요
SendMessage나 별 차이가 없는듯...

...

OutputDebugString이 좀더 빠르다던데.. 테스트해보진 못했네요

...
장성호 [nasilso]   2012-03-23 15:47 X
앗..
방금전에 인터넷에서 어떤글을 보니.
OutputDebugString  도 sharemem을 쓰고
Mutex , Event 등을 이용해 동기화 한다는 군요
...
망치 [mangchy]   2012-03-29 20:25 X
Hoo Technologies Hoo WinTail 툴이 있는데 이게 장성호님이 말씀하신 방법으로 하는거 같습니다.

http://www.hootech.com/WinTail/

그런데 언젠가 이 툴을 깔아서 해본거 같은데 속도가 그다지 나온거 같지 않던데요...뭐 정확한 기억은 아니지만....
하여튼 자료조사때 Trace관련 툴들을 깔아보고 테스트 해봤을때 속도 체크를 우선 했는데 다들 맘에 안들었던 기억입니다.
뽀뽀중 [kissjung]   2012-06-01 09:15 X
c++ builder xe2 에서

wsprintf(szBuffer + strlen(szBuffer), "|14|%s|%d|%d|%d|%d|%s|%s", process, level, mode, color, m.line, m.func, m.file);

부분에서 에러가 발생 하는데 어떻게 해야 하나요?
에러는 char <-> wchar_t 의 형 변환 문제 같습니다.
에러가 몇개 더 발생하나, L"" 매크로 로 수정 하니 문제 없는데, 다른 부분은 어떻게 해야 하는지 모르겠네요.

[BCC32 Error] Trace.cpp(63): E2034 Cannot convert 'char *' to 'wchar_t *'
  Full parser context
    Trace.cpp(52): parsing: void TRACE4(char *,int,int,int,char *,...)
[BCC32 Error] Trace.cpp(63): E2340 Type mismatch in parameter 1 (wanted 'wchar_t *', got 'char *')
  Full parser context
    Trace.cpp(52): parsing: void TRACE4(char *,int,int,int,char *,...)
[BCC32 Error] Trace.cpp(104): E2034 Cannot convert 'char *' to 'wchar_t *'
  Full parser context
    Trace.cpp(93): parsing: void TRACE2(char *,...)
[BCC32 Error] Trace.cpp(104): E2340 Type mismatch in parameter 1 (wanted 'wchar_t *', got 'char *')
  Full parser context
    Trace.cpp(93): parsing: void TRACE2(char *,...)
[BCC32 Error] Trace.cpp(160): E2034 Cannot convert 'char[4097]' to 'const wchar_t *'
  Full parser context
    Trace.cpp(152): parsing: void DEBUG(char *,...)
[BCC32 Error] Trace.cpp(160): E2342 Type mismatch in parameter 'lpOutputString' (wanted 'const wchar_t *', got 'char *')
  Full parser context
    Trace.cpp(152): parsing: void DEBUG(char *,...)

+ -

관련 글 리스트
652 Trace 개선 버젼 망치 20693 2012/03/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.