printk除錯之設定日誌列印級別
日誌列印注意事項:
1. 日誌輸出是有代價的,特別是在嵌入式系統,或者對執行時序要求較高的應用場景。因此
a) 只有在需要的地方加入,不能濫用
b) 一定要有一個全域性的開關,在不需要或者產品釋出的時候,關閉輸出,或者降低日誌輸出的頻率
2. 日誌輸出需要有優先順序控制,例如:發生錯誤時的日誌優先順序最高,一般都要輸出;一些重要的提示,優先順序中等,可能會在debug版的軟體中開啟;一些不重要的提示,可能只會在需要的時候(例如跟蹤bug)開啟
3. 不要直接使用printk(或者printf)。日誌輸出的目標是多樣的,例如通過printf輸出到螢幕、通過串列埠輸出到串列埠除錯助手、通過檔案操作寫入到檔案等等。要通過重定義的方式,將所有的日誌輸出指令定義到合適的輸出路徑,當需要修改輸出路徑的時候,只要修改重定義的部分即可。否則需要在整個程式碼中修改,就麻煩了。
4. 最好為每個軟體模組提供單獨的日誌輸出開關,以增加除錯的靈活性
5. 很多時候,日誌輸出語句,可以部分代替程式碼註釋的功能
例項程式碼:
#ifndef __EIM_DEBUG_H__ #define __EIM_DEBUG_H__
/* * debug level, * if is DEBUG_LEVEL_DISABLE, no log is allowed output, * if is DEBUG_LEVEL_ERR, only ERR is allowed output, * if is DEBUG_LEVEL_INFO, ERR and INFO are allowed output, * if is DEBUG_LEVEL_DEBUG, all log are allowed output, */ enum debug_level { DEBUG_LEVEL_DISABLE = 0, DEBUG_LEVEL_ERR, DEBUG_LEVEL_INFO, DEBUG_LEVEL_DEBUG, }; /* * the macro to set debug level, you should call it * once in the files you need use debug system */ #define DEBUG_SET_LEVEL(x) static int debug = x
#define CONFIG_ENABLE_EIM_DEBUG
#ifdef CONFIG_ENABLE_EIM_DEBUG
/* it can be change to others, such as file operations */ #define PRINT printk
#define EIM_ASSERT() \ do { \ PRINT("ASSERT: %s %s %d", \ __FILE__, __FUNCTION__, __LINE__); \ while (1); \ } while (0)
#define EIM_ERR(...) \ do { \ if (debug >= DEBUG_LEVEL_ERR) { \ PRINT(__VA_ARGS__); \ } \ } while (0)
#define EIM_INFO(...) \ do { \ if (debug >= DEBUG_LEVEL_INFO) { \ PRINT(__VA_ARGS__); \ } \ } while (0)
#define EIM_DEBUG(...) \ do { \ if (debug >= DEBUG_LEVEL_DEBUG) { \ PRINT(__VA_ARGS__); \ } \ } while (0)
#else /* CONFIG_ENABLE_EIM_DEBUG */
#define DEBUG_SET_LEVEL(x) #define EIM_ASSERT() #define EIM_ERR(...) #define EIM_INFO(...) #define EIM_DEBUG(...)
#endif /* CONFIG_ENABLE_DEBUG */
#endif /* __EIM_DEBUG_H__ */