1. 程式人生 > >printk除錯之設定日誌列印級別

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__ */