'디버깅 기법'에 해당되는 글 1건
- 2012.04.06 printf문을 디버깅 모드에 활용하기
펌웨어를 개발하다 보면 반드시 디버깅 작업을 하기마련이다.
보통 In-Circuit Emulator를 이용하여 디버깅 작업을 하는데, 브레이크 포인트 갯수도 제한 될 뿐더러 느린 속도 및 RUN, STOP 작업을 반복해야 하는 경우가 많다. 소장님께서 printf문을 이용하여 디버깅 작업을 하면 좋다는 추천에 이리저리 검색했다.
다음은 실제 이번에 진행했던 프로젝트에 사용한 방법이다.
하단 내용 중 __C30_UART=1; 는 dsPIC에서 fprintf문의 출력을 UART1 또는 UART2로 하기위해 정의해 주는 구문이다.
하단의 소스를 간단히 설명하면, #define NDEBUG 정의가 되어 있으면 디버깅 모드인 상태가 되며, dbg(("\rDEBUG MODE\n"))와 같이 사용하면 디버깅 메세지를 확인할 수 있으며, dbgl();와 같이 사용하면 파일명, 함수명, 라인번호를 확인할 수 있다.반대로 #define NDEBUG가 정의되어 있지 않다면, dbg(); 및 dbgl();은 아무것도 아닌 구문이 된다.
//#define NDEBUG // NDEBUG라는 것이 선언되어 있지 않으면 dbg라는 것은 printf 함수로 대치 된다.
// DEBUG 모드 시에는 #define NDEBUG로 선언 한다.
#ifndef NDEBUG
#define dbg(s) __C30_UART=2; \
printf s ; \
__C30_UART=1;
//괄호가 우측에 없어서 이상하지만 이렇게 하면 인자의 수에 관계없이 사용할 수 있다.
//단 사용에 주의! 괄호를 항상 두개씩 넣어 사용해야 한다.
//EX. dbg(("string")) ;
//EX. dbg(("%x", args)) ;
//EX. dbg(("%x %x", args1, args2)) ;
#define dbgl() __C30_UART=2; \
printf( "\r[FILE NAME: %s , FUNC NAME: %s , LINE: %d]\n", __FILE__,__FUNCTION__,__LINE__); \
__C30_UART=1;
//#define dbgl(fmt,args...) printf( "[%s %s %d]" fmt, __FILE__,__FUNCTION__,__LINE__, ## args )
//printf 함수를 이용한 위치 추적
//이 문장이 적혀진 라인을 포함하는 파일명과 함수명 그리고 파일의 라인번호를 출력
#else
#define dbg(s)
#define dbgl()
#endif
'The Work > Software' 카테고리의 다른 글
C# COMPONENT (0) | 2013.03.21 |
---|---|
프로그래머가되기위한방법 (0) | 2012.10.11 |
변환문자 의미 자료형 (C언어 형식 지정자) (0) | 2012.01.03 |
전처리 지시어 (0) | 2011.12.27 |