Debugging Tip입니다.
(이 코드는 Linux GCC환경에서 테스트 되어 있습니다. 하지만 VC++등의 컴파일러에서도 잘 동작할 것입니다.)
프로그램을 짜다 보면, 언제나 버그가 발생하기 마련이죠. 따라서 디버깅은 프로그램을 개발하고 검증하는데 필수적인 과정이라고 할 수 있습니다.
이러한 디버깅을 하는 방법에는 여러가지 방법이 있습니다.
프로그래머는 개발하는 환경이나 자신의 취향에 맞게 디버깅방법을 선택하여 사용하게 됩니다.
리눅스 환경이면, gdb나 ddd등의 Debugger를 이용해서 디버깅을 할 수가 있습니다.
(윈도우 환경이면, IDE(VC++등)에 달린 Debugger를 사용하면 되겠죠?)
하지만, Multi Thread또는 Multi Process, 또는 소캣통신 등의 프로그램에서는 이런 Debugger로 Trace하면서 Debugging하기란 무척 힘든(or impossible)한 작업이 될 것입니다.
따라서, 이러한 상황에서는 가장 무식하고도 확실한 방법인 printf를 군데군데 넣어서, 어디에서 변수값이 무엇인지 확인을 하는 방법이 널리 쓰이고 있습니다.
하지만, 규모가 큰 프로젝트에서는 이렇게 넣었던 디버깅을 위한 printf를 제거하는것도 꽤나 귀찮은 작업이 될 수가 있고, 지웠다가 다시 필요하면 다시 넣어야 하는 삽질을 할 수도 있습니다.
(아마 이런적 한번쯤은 있으셨을 겁니다.)
이러한 삽질을 조금이라도 덜 하는 방법은,
<b>
// 디버깅 메세지가 필요할 경우에 DEBUG를 Define해준다.
// 즉 필요에 따라 디버깅 메세지를 볼 수도, 안 볼수도 있게 해준다.
#define DEBUG
...
#ifdef DEBUG
printf(\"a=%d\\n\",a);
#endif
</b>
요런 코드를 사용하면 됩니다.
하지만, 역시 귀찮은것은 여전하군요..
<b>
본론으로 들어가서...
</b>
제가 이번 Tip에서 소개하는 방법은 전처리문을 사용하여 조금이나마 편리하게 디버깅을 하는 방법입니다.
우선 코드는 다음과 같습니다.
<b>
#define debug_mask 1
#define debug_message_file stdout
static char debug_message_buffer[255];
#define DMSG(msgs...) \\
do { if( debug_mask ) \\
sprintf( debug_message_buffer, msgs ), \\
fprintf(debug_message_file, \"[DMSG] %s: %4d: %s: %s\\n\", \\
__FILE__, __LINE__, __FUNCTION__, \\
debug_message_buffer ); } while(0)
</b>
위의 매크로를 사용하는 예는 다음과 같습니다.
<b>
...
DMSG(\"a=%d\", a);
...
</b>
코드가 조금 지저분 하군요.
하지만, 위력은 가공할 만 합니다. -_-;;
위의 코드를 실행하였을 경우에
[DMSG] deg.c: 20: main: a=5
요런 형식으로 화면에 디버깅 메세지가 출력되기 때문에, 상당히 편리하게 디버깅 메세지를 사용 할 수가 있습니다.
위의 전처리문을 이해하고, 수정하면 자신만의 멋진(?) 디버깅 매크로를 만들어서 사용할 수도 있을 것 같네요.
|
|
|
최근 글
트리에 대한 세미나입니다.
윤양원 05/15
참석인원:이원희,이태형,강혜윤,윤승용..
Lee 05/14
첫 세미나라 많이 부족했습니다 죄송합..
김건형 05/08
이번 세미나 들어주셔서 감사합니다.
..
이거윤 05/08
참석인원: 이태형, 윤정식, 윤양원,..
Lee 05/07