회원가입 | 아이디찾기
신입부원을 모집합니다.
열정패기를 지닌 당신을 기다립니다.
회의
매주 월요일 오후 6시 30분
세미나
매주 월요일 회의이후
회장
24기 이태형
부회장
25기 윤양원
총무
25기 강혜윤
강순주
Real-Time System Lab
전자전기컴퓨터학부 동아리연합
기타 사이트

동아리일정
more 팁과정보
· [10.04] 디버깅 팁 [5]안석

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

요런 형식으로 화면에 디버깅 메세지가 출력되기 때문에, 상당히 편리하게 디버깅 메세지를 사용 할 수가 있습니다.

위의 전처리문을 이해하고, 수정하면 자신만의 멋진(?) 디버깅 매크로를 만들어서 사용할 수도 있을 것 같네요.

· [03.18] [펌] [동영상] 좀 더 나은 사회를 위한 몇 가지 방... [1]김준호
· [02.07] MIT의 수업을 들으세요 류니
· [01.19] TeamViewer 원격제어 프로그램 [2]김준호
· [12.29] 자료검색을 위한 팁 (E-book, 문서, 사진, 비디... [1]류니
· [11.25] [펌] MID만 있으면 영어,중국어 못해도 그만 [2]김준호