막강 디버깅 매크로 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 제2회 통신망 안정성 확보를 위한 인공지능 해커톤 인공지능팩토리 2023.07.21 10
128 [챗GPT 러닝데이 | 챗GPT말고 LLM] 딥러닝 병렬처리 및 Polyglot 언어모델 file 인공지능팩토리 2023.05.12 14
127 [한국농수산식품유통공사] 2022 농산물 가격 예측 AI 경진대회 ~ 8. 28. (일) 15:00 접수마감 인공지능팩토리 2022.07.29 15
126 제5회 2023 연구개발특구 AI SPARK 챌린지 인공지능팩토리 2023.04.18 16
125 무료온라인 [랭체인러닝데이] 챗GPT 점메추 메뉴판, 예산입력하고 점심 메뉴 추천받자 file 인공지능팩토리 2023.06.02 16
124 [총 상금 1억원] 2022년 스마트농업 AI 경진대회 ~ 8월 28일 (일) 17시까지 접수마감 인공지능팩토리 2022.08.14 17
123 INNOPOLIS AI SPACE-S 인공지능 세미나 - 정형 데이터를 다루는 머신러닝 문제해결 패턴 인공지능팩토리 2022.09.14 17
122 [SD러닝데이] 디자이너의 영상&3D에서의 AI 활용 실전 워크플로우 file 인공지능팩토리1 2023.10.17 17
121 제4차 USG AI·데이터 문제해결 제조혁신 경진대회 file 인공지능팩토리1 2023.10.25 17
120 [캐글 1위 수상자의 세미나] 시장 데이터 분석 및 머신러닝 활용 가이드 인공지능팩토리 2022.08.13 18
119 [무료 세미나] 퀀트 투자와 데이터 기반 트레이딩 그리고 인공지능 인공지능팩토리 2022.08.24 18
118 [공모전] 제4회 빅데이터・인공지능 스타트업 경진대회 인공지능팩토리 2022.09.08 19
117 베타 테스터 모집 : AIF BUG SLAY 인공지능팩토리 2023.04.18 19
116 제2회 ETRI 휴먼이해 인공지능 논문경진대회 ~ 4월 14일 (금) 8시 접수 마감 인공지능팩토리 2023.02.28 22
115 [무료세미나] - SD러닝데이 Knock Knock. "Stable Diffusion? 인공지능팩토리 2023.06.30 22
114 2023 제1회 철도 인공지능 경진대회 인공지능팩토리 2023.07.24 22
113 무료세미나 음성 챗봇 만들기와 마이크로소프트 ISV 혜택 및 등록팁 방출! 인공지능팩토리 2023.07.26 23
112 (채용특전) 제2회 교원그룹 AI 챌린지 - 생성 AI기반 에듀테크 사업 제안 대회 인공지능팩토리 2023.05.22 24
111 장기 수요 예측 모델 경진대회 수상 솔루션 소개 | 제4회 빅스타 경진대회 연계 세미나 인공지능팩토리 2022.12.20 25
110 [챗GPT 러닝데이 | 챗GPT말고 LLM] LLM 기반 챗봇 만들기 file 인공지능팩토리 2023.05.06 25
XE Login