linux核心函式除錯開關

2021-10-01 08:47:11 字數 2955 閱讀 9647

linux裝置驅動開發,核心使用dev_dbg來控制輸出資訊,這個函式包含在include/linux/device.h標頭檔案中,但是預設情況下看不到除錯資訊,該如何開啟呢,我們直接上**:

#if defined(config_dynamic_debug)

#define dev_dbg(dev, format, ...) \

do while (0)

#elif defined(debug)

#define dev_dbg(dev, format, arg...) \

dev_printk(kern_debug, dev, format, ##arg)

#else

#define dev_dbg(dev, format, arg...) \

()#endif

從上面的**分析dev_dbg可以指向dynamic_dev_dbg()或者系統列印printk(),那麼分別從這兩中情況進行具體分析:

1、 dev_dbg -> dynamic_dev_dbg 定義的debug log的情況

debugfs 預設路徑sys/kernel/debug,官方使用文件參考 kernel/documentation/dynamic-debug-howto.txt,debugfs 使用必須在kernel的config檔案(kernel/arch/arm/configs/***_deconfig)中有

config_debug_fs=y

config_dynamic_debug=y

如何使用:

mount -t debugfs none /sys/kernel/debug                       #路徑也可以自己選擇,這裡用系統預設路徑        

echo -n 'file ***.c +p' > /sys/kernel/debug/dynamic_debug/control #增加***.c檔案dynamic debug的輸出

echo -n 'file ***.c -p' > /sys/kernel/debug/dynamic_debug/control #去掉***.c檔案dynamic debug的輸出

2、dev_dbg ->dev_printk定義的debug log的情況

我們先看一下定義在裡面關於列印級別基本的定義

#define kern_emerg    kern_soh "0"    /* system is unusable */

#define kern_alert kern_soh "1" /* action must be taken immediately */

#define kern_crit kern_soh "2" /* critical conditions */

#define kern_err kern_soh "3" /* error conditions */

#define kern_warning kern_soh "4" /* warning conditions */

#define kern_notice kern_soh "5" /* normal but significant condition */

#define kern_info kern_soh "6" /* informational */

#define kern_debug kern_soh "7" /* debug-level messages */

#define kern_default kern_soh "d" /* the default kernel loglevel*/

在來看下kernel/printk.c 中定義的列印級別,如下:

/* printk's without a loglevel use this.. */

#define default_message_loglevel 4 /* kern_warning */

int console_printk[4] = ;

在核心**include/linux/kernel.h中,定義了控制台的級別:

extern int console_printk;

#define console_loglevel (console_printk[0])

#define default_message_loglevel (console_printk[1])

#define minimum_console_loglevel (console_printk[2])

#define default_console_loglevel (console_printk[3])

據如上定義printk只會列印小於等於該級別的日誌資訊,dev_dbg對應的是除錯資訊,列印級別為kern_debug = 7,預設情況下自然是無法列印的,所以我們需要調整系統的預設列印級別來顯示除錯資訊。

/proc/sys/kernel # cat printk

1 4 1 7

#echo 7 4 1 7 > /proc/sys/kernel/printk #修改printk對應的列印級別

(1)第乙個引數 7表示小於7優先順序訊息才會被輸出到控制台。

(2)第二個引數4 表示預設的printk訊息優先級別,即printk(「hell world」);優先順序為4, 由於4<7,故可以被列印到控制台。

(3)第三個引數1 表示可接收的最高優先順序,當printk disable控制台輸出時,設定第乙個引數為1,但是,從核心等級來看,還有優先順序0,這個是printk最高端優先順序,一般用於核心嚴重訊息列印。比如記憶體錯誤或者 watchdog reset.也可以設定第乙個和第三個引數為0

(4)第四個引數7 預設控制台優先順序,即第乙個引數的預設優先順序。

參考:

freeswitch除錯開關

在windows下 開啟乙個cmd視窗,找到freeswitch.exe的目錄,然後先執行下面的命令 set sofia debug 9 set nua debug 9 set soa debug 9 set nea debug 9 set iptsec debug 9 set nta debug ...

Android部分除錯開關

開啟 gpu render 的profiling bar adb shell setprop debug.hwui.profile visual bars 或visual lines adb shell setprop debug.hwui.profile.maxframes 400 控制彙總條長度...

c語言除錯開關

功能 除錯開關 描述 if條件成立,則列印除錯資訊,否則不列印 include if 1 為0時除錯關閉,為1時除錯開啟 define debug out fmt,args.printf file s func s line d n file func line else define debug ...