* 로그 메세지를 이용한 디버깅 방법 소개
프로그램을 개발하다가 보면 코드가 내가 기대한 것과 다르게 동작하는 경우가 생겨서 디버깅을 하게 됩니다.
보통은 디버거를 이용해서 흐름을 따라가거나 변수값 조사를 합니다.
저는 이번 글에서 디버거를 이용하지 않고 파일에 로그 메세지를 남겨서 디버깅을 하는 방법을 소개합니다.
1. 로그 함수 소개
2. 사용 코드 예
3. 로그 내용 예
4. 기타 응용 방법
5. 잡담
1. 로그 함수 소개
unit myLog;
interface
uses
SysUtils, Windows;
procedure myLogMsg( msg:string );
implementation
procedure myLogMSg( msg:string );
var
logfile:TextFile;
filename:string;
dt: TDateTime;
dt_str:string;
begin
dt := Now;
dt_str := FormatDateTime( 'yyyy/mm/dd hh:mm:ss:zzz ', dt);
filename := 'log.txt';
AssignFile( logfile, filename );
if FileExists(filename) then
Append( logfile )
else if not FileExists(filename) then
Rewrite( logfile );
Append( logfile );
WriteLn( logfile, dt_str + msg );
closefile( logfile );
end;
2. 코드 사용 예
procedure TForm1.Btn_VolumeDnClick(Sender: TObject);
begin
BT_SendMsg( HF_SPEAKER_VOLUME_DOWN_REQ );
myLogMsg( '[TX] HF_SPEAKER_VOLUME_DOWN_REQ' );
end;
3. 로그 파일의 예
2010-03-28 09:06:19:406 Open
2010-03-28 09:06:25:062 [RX] AV_STATE_IND AV_STATE_IND_INITIALISING
2010-03-28 09:06:25:078 [RX] HF_STATE_IND HF_STATE_IND_INITIALISING
2010-03-28 09:06:25:234 [RX] AV_STATE_IND AV_STATE_IND_IDLE
2010-03-28 09:06:25:484 [RX] HF_STATE_IND HF_STATE_IND_INITIALISING
2010-03-28 09:06:25:500
2010-03-28 09:12:19:875 Close
4. 기타 응용 방법
때로는 로그 파일 이름을 프로젝트명_날짜시간_log.txt 처럼 이름을 붙여 두면 계속적으로 로그를 남겨서 관리를 할 수도 있습니다.
예) aaa_20100514_170000_log.txt
위의 예에서 로그 메세지에 문자열만 받게 했는데 printf() 스타일로 인자를 받게 변형하는 방법도 있습니다.
C언어에서는 myLog( "a = %d", a[0] ); 처럼 함수를 만드는 방법을 알고 있는데 델파이는 아직 많이 서툴러서
가변 인자 넣는 방법을 잘 모르겠네요.
로그 함수에 myLog( 출력 여부 지정, 로그 내용) 식으로 사용할 수도 있습니다.
myLog( A_UNIT_PRINT, "aaa" );
myLog( B_UNIT_NOPRINT, "bbb" );
myLog() 함수의 첫번째 인자를 이용해서 unit 단위나 기타 기능 단위로 로그 메세지 출력 여부를 제어 할 수도 있습니다.
파일에 로그를 남기지 않고 디버거 창에 메세지를 뛰우는 방법도 있습니다. OutputDebugString() 함수에 문자열을 넘기게 되면
현재 활성화가 된 디버거의 메세지 창에 로그가 남게 됩니다.
dbgview.exe 프로그램으로 이 메세지를 볼 수가 있습니다.
(http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx)
5. 잡담
예전에 GSM 휴대폰을 개발할 때 프로그램에서 토해내는 방대한 로그 메세지를 보면서 충격을 받았던 적이 있었습니다.
프로그램 디버깅을 이렇게도 할 수가 있구나 하구요. 특히 통신 프로그램의 경우에 디버거를 따라 가면서 분석하는게
필요할 때도 있지만 로그를 남겨서 분석하는게 유용하구나 하는걸 알게 되었습니다.
그 때 이후로는 프로그램을 개발할 때는 이런 로그 함수 기능 구현을 제일 먼저 해 놓고 다른 개발을 하게 됩니다.
개발에 유용한 팁이 되었으면 합니다.