막강 디버깅 매크로 DM_PRINT()

배상경 2010.11.23 09:03 조회 수 : 12045

좋은 세미나도 듣고 뭐 저도 기여 할게 없을까 궁리를 하다, 저의 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

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 강좌, 팁, 정보등에 대해 올리는 게시판입니다. woos 2016.04.09 246
129 여기는 팁, 기타 정보를 올리는 곳입니다. 백창우 2006.06.05 14751
128 #pragma에 관련해서.. [2] 원민수 2006.07.19 20782
127 kernel 2.6의 kzalloc함수 (원민수 씀) 백창우 2007.02.23 19337
126 누가 나를 호출했는지 찾기 + 포인터를 심볼 이름으로 변환하여 출력하기 [1] 지현구 2007.02.27 17863
125 태훈님에 이어. ARM kernel 참고자료 백창우 2007.11.05 19014
124 systemtap 관련 간단한 소개입니다. 남용우 2007.11.06 17058
123 define을 사용한 version 처리. 원민수 2008.02.09 15026
122 허접 영어 사전입니다. [3] 백창우 2008.04.22 16092
121 포토샵 웹버전입니다. [1] 강진성 2010.05.14 40685
» 막강 디버깅 매크로 DM_PRINT() [4] file 배상경 2010.11.23 12045
119 perspective of the medical industry and engineering [15] 김성현2 2011.09.16 8197
118 돈되는 이야기?! 음주운전방지 앱 [3] 김성현2 2011.10.18 6775
117 돈되는 이야기?!, 내친김에 하나더, 나는 잘 자고 있을까? [8] 김성현2 2011.10.18 7789
116 돈되는 이야기?! 삼성 손가락 혈압계 [1] 김성현2 2011.10.20 9493
115 조금은 묵직한 시스템, 뇌감시장치 김성현2 2011.11.17 10585
114 C++에서 meta class 이용하기 [2] 이경문 2012.05.06 6888
113 멀티유저 드라이빙 환경 [3] pororo 2012.08.25 7257
112 xen 4.1 설치 방법(우분투 11.04) [2] 이상철 2012.11.14 10109
111 리눅스 커널 스터디 참고자료 (x86) [4] 리누즈박 2013.05.06 18397
110 2013.05.25 ARM 아키텍쳐 세미나 1차 발표자료 - by 민홍 교수님 [5] file K 2013.05.25 4980
XE Login