Логгирование приложения

Хочу поделится простым способом для отладки приложения на основе макросов.

Отлаживая USB или Ethernet проходит огромное количество вызовов функций и чтобы во всем этом разбираться надо просто логировать так , чтобы было сразу понятно из какой функции вызывается текущая функция и какие функции она вызывает по ходу выполнения программы.

Мучаясь с отладкой LWIP я пришел лично к одному простому варианту. Он подходит для чужого кода , в котором надо быстро разобраться.

Делаем сначала хедер h с нашими двумя макросами и его с файл:

myDebug.h

#define PRINTF_LEFT(num) for( uint8_t ii = 0 ; ii < num ; ii++ ){ \
	printf(" "); }

#define PRINTF_FILL(num,str) for( uint8_t ii = 0 ; ii < num ; ii++ ){ \
	printf("%s",str); }

#define PRINTF(num,message)  PRINTF_LEFT(num); \
	printf message
extern volatile uint32_t LEFT_MARGIN;

#ifdef DEBUG_FUNC_CALLS

	#define ENTER_FUNC(name) { \
			taskENTER_CRITICAL(); \
			LEFT_MARGIN ++; \
			PRINTF(0,("\n%d : " , xTaskGetTickCount())); \
			PRINTF_FILL(LEFT_MARGIN<<2,"-");\
			printf(" > %s\n",name); \
			taskEXIT_CRITICAL(); \
			}

	#define EXIT_FUNC(name) { \
			taskENTER_CRITICAL(); \
			PRINTF(0,("%d : " , xTaskGetTickCount())); \
			if(LEFT_MARGIN==0) { \
				PRINTF(LEFT_MARGIN,("stop LEFT_MARGIN=%d" , LEFT_MARGIN)); \
				PRINTF(0,("\n")); \
				while(1) ; \
			} \
			PRINTF_FILL(LEFT_MARGIN<<2,"-");\
			printf(" < %s\n",name); \
			LEFT_MARGIN--; \
			taskEXIT_CRITICAL(); \
			}
#else
	#define ENTER_FUNC(name)
	#define EXIT_FUNC(name)
#endif

myDebug.c

Тут только одна строка будет. Это глобальная переменная для учета количества входов в функции и выходов из них.


volatile uint32_t LEFT_MARGIN = 0;

Далее в любом коде , выполнение которого вас интересует в самом начале прописываем макрос ENTER_FUNC(__func__) , а в конце функции и перед всеми return из функции прописываем EXIT_FUNC(__func__) .

И вот примерный результат лога (небольшой кусок):

47026 : -------------------------------- > tcp_close_shutdown

47026 : ------------------------------------ > tcp_send_fin
47026 : ------------------------------------ < tcp_send_fin

47027 : ------------------------------------ > tcp_output
47027 : ------------------------------------ < tcp_output
47027 : -------------------------------- < tcp_close_shutdown
47027 : ---------------------------- < http_close_or_abort_conn
47028 : ------------------------ < http_eof
47028 : -------------------- < http_send
47028 : ---------------- < http_recv

По-моему очень нативно и понятно где мы находимся и что делает программа.