Linux核心日誌開關

2022-03-31 23:20:59 字數 4503 閱讀 2177

linux核心日誌開關

1、讓pr_debug能輸出

--- a/kernel/printk/printk.c

+++ b/kernel/printk/printk.c

@@ -59,7 +59,7 @@

/* we show everything that is moreimportant than this.. */

#define minimum_console_loglevel 1 /*minimum loglevel we let people use */

-#define default_console_loglevel 7 /*anything more serious than kern_debug */

+#define default_console_loglevel 8 /*anything more serious than kern_debug */

int console_printk[4] = {

default_console_loglevel, /* console_loglevel */

2、讓模組內**都能輸出

--- a/drivers/of/makefile

+++ b/drivers/of/makefile

extra_cflags += -ddebug

3、讓每個檔案輸出

--- a/drivers/of/makefile

+++ b/drivers/of/makefile

檔案include之前加define debug

或者makefile裡面增加

pr_debug()

some files call pr_debug(), which is ordinarily an empty macro that discards

its arguments at compile time. to enable debugging output, build the

cflags_[filename].o := -ddebug

to the makefile.

for example, to see all attempts to spawn a usermode helper (such as

/sbin/hotplug), add to lib/makefile the line:

cflags_kobject_uevent.o := -ddebug

then boot the new kernel, do something that spawns a usermode helper, and

use the "dmesg" command to view the pr_debug() output.

4、核心列印控制

d,lx,ld,,lu,這幾個都是輸出32位的

hd,hx,hu,這幾個都是輸出16位資料的,

hhd,hhx,hhu,這幾個都是輸出8位的,

lld,ll,llu,llx,這幾個都是輸出64位的,

---------------

如何開啟pr_debug除錯資訊

以dma的除錯為例,先來看看乙個pr_debug函式呼叫

pr_debug("%s: %s (%s)\n",

__func__,

chan ? "success" : "fail",

chan ? dma_chan_name(chan) : null);

在include/linux/printk.h裡找到pr_debug的定義

/* if you are writing a driver, please use dev_dbg instead */

#if defined(config_dynamic_debug)

/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */

#define pr_debug(fmt, ...) \

dynamic_pr_debug(fmt, ##__va_args__)

#elif defined(debug)

#define pr_debug(fmt, ...) \

printk(kern_debug pr_fmt(fmt), ##__va_args__)

#else

#define pr_debug(fmt, ...) \

no_printk(kern_debug pr_fmt(fmt), ##__va_args__)

#endif

三個判斷條件決定pr_debug的用法:

1.如果定義了config_dynamic_debug,就使用動態debug機制dynamic_pr_debug();

2.如果定義了debug,就使用printk(kern_debug...)

3.預設情況下,不列印。

那麼要想讓kernel乖乖的列印除錯資訊,就只有兩條路可選了:要麼動態debug,要麼定義debug巨集。

先說一下如何定義debug巨集:

其實在kernel中很多driver已經定義好了這樣的選項

例如,我們經常可以看到這樣的配置選項和巨集定義:

(1)dma engine debugging(config_dmadevices_debug )

(2)power management debug support(config_pm_debug)

(3) enable debug for the b2c2 flexcop drivers(config_pci_debug)

以dma為例,在drivers/dma/makefile中定義了編譯選項

ccflags-$(config_dmadevices_debug)  := -ddebug (可在核心config中把該巨集開啟)

其作用相當於在drivers/dma/所有子檔案定義了巨集#define debug

小夥伴們趕緊把config_debug選項選上吧,然後重新編譯kernel。先別急,這樣還不夠,

預設的console級別是7(在kernel/printk/printk.c中定義了#define default_console_loglevel 7)

只有那些級別「小於7」的除錯資訊才能列印出來,而printk(kern_debug...)的級別是7,那就還需要提高console列印級別

如果要檢視dma初始化的debug資訊,那就直接改**

#define default_console_loglevel 8

如果是runtime,可以直接通過printk的sys介面調整列印級別

$cat /proc/sys/kernel/printk

7       4       1       7

$echo 8 > /proc/sys/kernel/printk

$cat /proc/sys/kernel/printk

8       4       1       7

ok,大功告成!

ps:如果一些driver沒有現成的巨集可用,開發人員可以自己仿照上述方法,也可以直接在原始檔中定義debug巨集

#define debug(巨集的作用範圍相信我就不用多說了吧,就是從巨集定義開始到原始檔的末尾結束)

下面再簡單說一下kernel的動態除錯

開啟enable dynamic printk() support(dynamic_debug),那麼所有的 pr_debug()/dev_debug() 之類的函式在runtime就可以動態地使用了。

kernel動態除錯提供乙個debugfs介面: /dynamic_debug/control 

這個檔案可以用來獲取已完成的除錯資訊列表

例如你要顯示檔案'svcsock.c'的1603行內容,你可以這樣做:

nullarbor:~ # echo 'file svcsock.c line 1603 +p' >

/dynamic_debug/control  

// 提供檔案svcsock.c所有資訊 

nullarbor:~ # echo -n 'file svcsock.c +p' >

/dynamic_debug/control

如果你想執行多個命令,你需要為每個加入「echo」分割,像這樣:

nullarbor:~ # echo 'file svcsock.c line 1603 +p' > /proc/dprintk ;\

> echo 'file svcsock.c line 1563 +p' > /proc/dprintk

或者甚至是這樣:

nullarbor:~ # (

> echo 'file svcsock.c line 1603 +p' ;\

> echo 'file svcsock.c line 1563 +p' ;\

> ) > /proc/dprintk

file可以替換成module,format等匹配方式,具體用法請參考documentation/dynamic-debug-howto.txt

好了,enjoy你的debug之旅吧!

linux核心函式除錯開關

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

LINUX核心日誌介紹。

var log vmkernel.log 存放vmkernel生成的日誌 var log vmkwarning.log 只保留vmkernel日誌中的警告和系統告警事件 var log vpxa.log vcenter 日誌,vcenter server通過程序名為vpxa的vcenter serv...

linux的核心日誌系統

在linux中,syslogd是使用者空間的乙個守護程序,所有的需要記錄日誌的別的程序可以和這個守護程序通訊,可以委託這個守護程序幫助記錄日誌,為何不自己記錄呢,那是因為syslogd非常的專業,可以將日誌記錄到很細的地步,可以看etc 下面的配置檔案,既然所有的程序都可以委託syslogd記錄日誌...