좋은 세미나도 듣고 뭐 저도 기여 할게 없을까 궁리를 하다, 저의 10년 노하우인 디버그 매크로를 공개하면 좋지 않을까 하는대까지 생각이 미쳤습니다.
처음 이와 유사한 매크로를 접한게 98년도니 아는 사람은 다 아는 식상한 매크로일지도 모르지만, 나름 10년동안 사용하면서 축적된 잡다한 보물이 되었습니다.
잘쓰면 힘이되고, 잘못쓰면 독(?)이 될 수도 있는 메크로 이제부터 공개합니다.
////////////////////////////////////////////////////////////////////////// /* coded by revival / 2006/03/09 */ /* Debug Message Macro Naming issue * F : File Name * f : Function Name * L : Line Number * N : Enter Code; (n) Line feed */ #if DEBUG_TYPE # define _F_ __FILE__ # define _f_ __FUNCTION__ # define _L_ __LINE__ // Debug Message to FILE # define DMF_F(fp, fmt...) fprintf(fp, "[%s] ", _F_), fprintf(fp, fmt) # define DMF_Ff(fp, fmt...) fprintf(fp, "[%s:%s] ", _F_, _f_), fprintf(fp, fmt) # define DMF_FfL(fp, fmt...) fprintf(fp, "[%s:%s:%d] ", _F_, _f_, _L_), fprintf(fp, fmt) # define DMF_FfLN(fp, fmt...) fprintf(fp, "[%s:%s:%d] ", _F_, _f_, _L_), fprintf(fp, fmt), fprintf(fp, "n") # define DMF_FfN(fp, fmt...) fprintf(fp, "[%s:%s] ", _F_, _f_), fprintf(fp, fmt), fprintf(fp, "n") # define DMF_FL(fp, fmt...) fprintf(fp, "[%s:%d] ", _F_, _L_), fprintf(fp, fmt) # define DMF_FLN(fp, fmt...) fprintf(fp, "[%s:%d] ", _F_, _L_), fprintf(fp, fmt), fprintf(fp, "n") # define DMF_FN(fp, fmt...) fprintf(fp, "[%s] ", _F_), fprintf(fp, fmt), fprintf(fp, "n") # define DMF_f(fp, fmt...) fprintf(fp, "[%s] ", _f_), fprintf(fp, fmt) # define DMF_fL(fp, fmt...) fprintf(fp, "[%s:%d] ", _f_, _L_), fprintf(fp, fmt) # define DMF_fLN(fp, fmt...) fprintf(fp, "[%s:%d] ", _f_, _L_), fprintf(fp, fmt), fprintf(fp, "n") # define DMF_fN(fp, fmt...) fprintf(fp, "[%s] ", _f_), fprintf(fp, fmt), fprintf(fp, "n") # define DMF_L(fp, fmt...) fprintf(fp, "[%d] ", _L_), fprintf(fp, fmt) # define DMF_LN(fp, fmt...) fprintf(fp, "[%d] ", _L_), fprintf(fp, fmt), fprintf(fp, "n") # define DMF_N(fp, fmt...) fprintf(fp, fmt), fprintf(fp, "n") # define DMF_(fp, fmt...) fprintf(fp, fmt), fflush(fp) // Debug Message for Kernel # define DMK_F(fp, fmt...) printk("[%s] ", _F_), printk(fmt) # define DMK_Ff(fp, fmt...) printk("[%s:%s] ", _F_, _f_), printk(fmt) # define DMK_FfL(fp, fmt...) printk("[%s:%s:%d] ", _F_, _f_, _L_), printk(fmt) # define DMK_FfLN(fp, fmt...) printk("[%s:%s:%d] ", _F_, _f_, _L_), printk(fmt), printk("n") # define DMK_FfN(fp, fmt...) printk("[%s:%s] ", _F_, _f_), printk(fmt), printk("n") # define DMK_FL(fp, fmt...) printk("[%s:%d] ", _F_, _L_), printk(fmt) # define DMK_FLN(fp, fmt...) printk("[%s:%d] ", _F_, _L_), printk(fmt), printk("n") # define DMK_FN(fp, fmt...) printk("[%s] ", _F_), printk(fmt), printk("n") # define DMK_f(fp, fmt...) printk("[%s] ", _f_), printk(fmt) # define DMK_fL(fp, fmt...) printk("[%s:%d] ", _f_, _L_), printk(fmt) # define DMK_fLN(fp, fmt...) printk("[%s:%d] ", _f_, _L_), printk(fmt), printk("n") # define DMK_fN(fp, fmt...) printk("[%s] ", _f_), printk(fmt), printk("n") # define DMK_L(fp, fmt...) printk("[%d] ", _L_), printk(fmt) # define DMK_LN(fp, fmt...) printk("[%d] ", _L_), printk(fmt), printk("n") # define DMK_N(fp, fmt...) printk(fmt), printk("n") # define DMK_(fp, fmt...) printk(fmt)
이전에 다른곳에도 올렸던것 같은데, 어디다 올렸는지 기억이 안나에요.
아무튼 이것만 있으면 저만큼 프로그램 할 수 있습니다.ㅋㅋㅋ
C Pre-Processor 에서 제공하는 세가지 매크로를 가지고 유용한 디버깅 정보를 뽑아 냅니다.
LOW 한 사용법은 DMF_FfLN(stdout, "Oh! no~~~~~~~~~~~~~")
오랬동안 다듬은 만큼 처음 접하면 조금 난해해 보일 수도 있습니다.
위 매크로를 조금 사용하기 쉽게 wrapping 한 매크로가 다음에 이어집니다.
# if DEBUG_TYPE == 1 # define DM_(fmt...) DMF_(g_fpDM, fmt) # define DM_F(fmt...) DMF_F(g_fpDM, fmt) # define DM_Ff(fmt...) DMF_Ff(g_fpDM, fmt) # define DM_FfL(fmt...) DMF_FfL(g_fpDM, fmt) # define DM_FfLN(fmt...) DMF_FfLN(g_fpDM, fmt) # define DM_FfN(fmt...) DMF_FfN(g_fpDM, fmt) # define DM_FL(fmt...) DMF_FL(g_fpDM, fmt) # define DM_FLN(fmt...) DMF_FLN(g_fpDM, fmt) # define DM_FN(fmt...) DMF_FN(g_fpDM, fmt) # define DM_f(fmt...) DMF_f(g_fpDM, fmt) # define DM_fL(fmt...) DMF_fL(g_fpDM, fmt) # define DM_fLN(fmt...) DMF_fLN(g_fpDM, fmt) # define DM_fN(fmt...) DMF_fN(g_fpDM, fmt) # define DM_L(fmt...) DMF_L(g_fpDM, fmt) # define DM_LN(fmt...) DMF_LN(g_fpDM, fmt) # define DM_N(fmt...) DMF_N(g_fpDM, fmt) # endif // DEBUG_TYPE == 1 # if DEBUG_TYPE == 2 # define DM_(fmt...) DMF_(stdout, fmt) # define DM_F(fmt...) DMF_F(stdout, fmt) # define DM_Ff(fmt...) DMF_Ff(stdout, fmt) # define DM_FfL(fmt...) DMF_FfL(stdout, fmt) # define DM_FfLN(fmt...) DMF_FfLN(stdout, fmt) # define DM_FfN(fmt...) DMF_FfN(stdout, fmt) # define DM_FL(fmt...) DMF_FL(stdout, fmt) # define DM_FLN(fmt...) DMF_FLN(stdout, fmt) # define DM_FN(fmt...) DMF_FN(stdout, fmt) # define DM_f(fmt...) DMF_f(stdout, fmt) # define DM_fL(fmt...) DMF_fL(stdout, fmt) # define DM_fLN(fmt...) DMF_fLN(stdout, fmt) # define DM_fN(fmt...) DMF_fN(stdout, fmt) # define DM_L(fmt...) DMF_L(stdout, fmt) # define DM_LN(fmt...) DMF_LN(stdout, fmt) # define DM_N(fmt...) DMF_N(stdout, fmt) # endif // DEBUG_TYPE == 2 # if DEBUG_TYPE == 3 # define DM_(fmt...) DMK_(stdout, fmt) # define DM_F(fmt...) DMK_F(stdout, fmt) # define DM_Ff(fmt...) DMK_Ff(stdout, fmt) # define DM_FfL(fmt...) DMK_FfL(stdout, fmt) # define DM_FfLN(fmt...) DMK_FfLN(stdout, fmt) # define DM_FfN(fmt...) DMK_FfN(stdout, fmt) # define DM_FL(fmt...) DMK_FL(stdout, fmt) # define DM_FLN(fmt...) DMK_FLN(stdout, fmt) # define DM_FN(fmt...) DMK_FN(stdout, fmt) # define DM_f(fmt...) DMK_f(stdout, fmt) # define DM_fL(fmt...) DMK_fL(stdout, fmt) # define DM_fLN(fmt...) DMK_fLN(stdout, fmt) # define DM_fN(fmt...) DMK_fN(stdout, fmt) # define DM_L(fmt...) DMK_L(stdout, fmt) # define DM_LN(fmt...) DMK_LN(stdout, fmt) # define DM_N(fmt...) DMK_N(stdout, fmt) # endif // DEBUG_TYPE == 3 # else // DEBUG_TYPE # define DM_(fmt...) # define DM_F(fmt...) # define DM_Ff(fmt...) # define DM_FfL(fmt...) # define DM_FfLN(fmt...) # define DM_FfN(fmt...) # define DM_FL(fmt...) # define DM_FLN(fmt...) # define DM_FN(fmt...) # define DM_f(fmt...) # define DM_fL(fmt...) # define DM_fLN(fmt...) # define DM_fN(fmt...) # define DM_L(fmt...) # define DM_LN(fmt...) # define DM_N(fmt...) #endif // DEBUG_TYPE /* end of revival */
일반적으로 DEBUG_TYPE 을 2로 설정해서 stdout 로 메시지를 출력합니다.
경우에 따라 logfile을 만들 필요가 있으면, DEBUG_TYPE 을 1로 잡아주고 fp를 g_fpDM 에 할당합니다.
이 매크로는 저 혼자 만든게 아니고, 인터넷에서 많은 좋은 아이디어들을 차용했습니다.
특히나 KLDP에서 좋은 정보를 많이 참조했습니다.
해더 전부를 첨부합니다.
그냥 바로 쓰기엔 좀 부담스러운 디버그 툴이지만, 조금만 연구하시면 꿈같은 디버깅을 할 수 있습니다.
(처음 이와 유사한 매크로를 접했을때 제가 그랬거든요.ㅎㅎ)
P.S. 커널을 위한 DMK_ 매크로 집합은 출력전환이 필요없습니다. (printk()를 사용함)
그러나 규칙성을 위해 stdout 를 사용하는 것처럼 만들었고, 최종 사용에서는 그것을 사용하지 않습니다.
reserv for future
댓글 4
-
김영일
2010.11.26 10:59
-
배상경
2010.11.29 12:48
예전에는 윈도에서 EDIT+ 와 UltraEdit 를 사용했습니다.
리눅스는 지금까지 vim 만 사용해 왔습니다.
5년 전쯤 부터 윈도에서도 vim 을 사용하고 있습니다.
gVimPortable 이라고 설치 없이 복사해 쓸수 있는게 있는데, 이걸 씁니다.
최근에 업무때문에 Source Insite 쓰고있는데 나름 좋더군요, 그래도 쓰다보면 뭔가 불편합니다.
지금은 vim 에 중독되어 모든작업을 VIM 에서 처리합니다.
-
김영일
2010.12.02 16:09
에고..이제서야 답글을 보게 되었네요...답변 감사합니다...^^
-
동선
2011.02.24 11:20
심지어 전 php도 VIM에서 하드코딩합니다...ㅋㅋ VIM의 매력에 한번 빠지면 헤어나올 수가 없더군요 ㅠㅠ
.
배상경님..파일 감사합니다...요긴하게 쓸 수 있도록 정리를 잘해놓으셨네요...^^...잘 쓰겠습니다..
그런데 한가지 질문이 있는데요..
위의 캡쳐를 보고 궁금한게 있는데, 에디터툴을 어떤 것을 쓰시는 건가요?.. 대충보니 이클립스 같기도 하고...
전 초기에는 VI 쓰다가 안드로이드 프로그램 하느라고 slickeditor 를 쓰거든요...
slickeditor 는 다 좋은데 프로그램을 동시에 1개 밖에 열수가 없어서, 한개 프로젝트를 편집하다가 다른
프로젝트를 열려면 현재 프로젝트를 접고 다른 프로젝트를 열어야 하는 단점이 있죠
(물론 현재 프로젝트에 다른 프로젝트를 insert 하면 되지만 이러면 검색시간등 프로젝트가 넘 무거워져서리...)
하여튼 현재도 좋은 editor를 찾고 있는데, 이클립스도 좀 그렇고, 소스인사이트는 넘 버그가 많고 utf-8을
지원하지 않아 주석이 문제고...
그래서 배상경님이 쓰시는 editor도 함 검토해볼까 합니다... 알려주시면 감사하겠습니다...