一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用動(dòng)態(tài)輸出打印內(nèi)核的DEBUG信息

嵌入式與Linux那些事 ? 來(lái)源:嵌入式與Linux那些事 ? 2023-01-06 10:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

簡(jiǎn)介

printk()是很多嵌入式開發(fā)者喜歡用的調(diào)試手段之一,但是,使用printk()每次都要重新編譯內(nèi)核,很不方便。使用動(dòng)態(tài)輸出在不需要重新編譯內(nèi)核的情況下,方便的打印出內(nèi)核的debug信息。

要開啟動(dòng)態(tài)輸出,內(nèi)核需要添加CONFIG_DYNAMIC_DEBUG。開啟宏之后,pr_debug(),dev_dbg() ,print_hex_dump_debug(),print_hex_dump_bytes()`所有信息都可以被動(dòng)態(tài)打印出來(lái)。

動(dòng)態(tài)輸出支持的特性

動(dòng)態(tài)輸出在debugfs文件系統(tǒng)中對(duì)應(yīng)的是control文件節(jié)點(diǎn)。control文件節(jié)點(diǎn)記錄了系統(tǒng)中所有使用動(dòng)態(tài)輸出技術(shù)的文件名路徑,輸出語(yǔ)句所在的行號(hào)、模塊名和將要輸出的語(yǔ)句等。

你可以通過(guò)以下命令查看目前所有調(diào)試狀態(tài)的行為配置:

cat/sys/kernel/debug/dynamic_debug/control

你也可以應(yīng)用標(biāo)準(zhǔn)的Unix文本過(guò)濾命令來(lái)過(guò)濾這些數(shù)據(jù), 例如:

grep-irdma/sys/kernel/debug/dynamic_debug/control|wc-l

在第三列顯示了調(diào)試狀態(tài)位的激活標(biāo)志。如果無(wú)額外行為被激話, 為 "=_"。因此你可以通過(guò)下面的命令查看任何不是默認(rèn)標(biāo)志的狀態(tài)位:

awk'$3!="=_"'/dynamic_debug/control

命令行使用方法

在語(yǔ)法層面上,一個(gè)命令由一系列的規(guī)格匹配組成,最后由一個(gè)標(biāo)記來(lái)改變這規(guī)格。

command::=match-spec*flags-spec

match-spec常用來(lái)選擇一個(gè)已知的dprintk()調(diào)用點(diǎn)的子集來(lái)套用flags-spec。把他們當(dāng)做彼此之間的每對(duì)做隱式查詢。注意,一個(gè)空的match_specs列表是有可能的,但不是非常有用,因?yàn)樗粫?huì)匹配任何調(diào)用點(diǎn)的調(diào)試子句。

一個(gè)匹配規(guī)范由一個(gè)關(guān)鍵字組成,關(guān)鍵字控制被比較的調(diào)用點(diǎn)的屬性和要比較的值。可能關(guān)鍵字是:

match-spec::='func'string|
'file'string|
'module'string|
'format'string|
'line'line-range
line-range::=lineno|
'-'lineno|
lineno'-'|
lineno'-'lineno

注意:line-range不能包含空格,例如,“1-30”是有效的范圍,但“1 - 30”就是無(wú)效的

每個(gè)關(guān)鍵字的含義如下:

func:給定的字符串會(huì)和每個(gè)調(diào)用點(diǎn)的函數(shù)名比較。例如:func svc_tcp_accept

file:給定的字符串會(huì)和每個(gè)調(diào)用點(diǎn)的源文件的全路徑名或者相對(duì)名比較。例如:file svcsock.c, file /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svcsock.c

module:給定的字符串會(huì)和每個(gè)調(diào)用點(diǎn)的模塊名進(jìn)行比較。模塊名是和在ls mod 里看到的字符串一樣。例如,module sunrpc

format:給定的字符串會(huì)在動(dòng)態(tài)調(diào)試格式字符串里查找。注意這字符串不需要匹配這個(gè)格式??崭窈推渌厥庾址軌蛴冒诉M(jìn)制字符語(yǔ)法來(lái)轉(zhuǎn)義,例如空字符是?40。作為選擇,這個(gè)字符串可以附上雙引號(hào)(")或者是單引號(hào)(‘)。例如:

formatsvcrdma://NFS/RDMA服務(wù)器的dprintks
formatreadahead//一些在預(yù)加載緩存里的dprintks
formatnfsd:?40SETATTR//一個(gè)使用空格來(lái)匹配格式的方式
format"nfsd:SETATTR"http://一個(gè)整齊的方法來(lái)用空格匹配格式
format'nfsd:SETATTR'//同樣是一個(gè)用空格來(lái)匹配格式的方法和

line:給定的行號(hào)或者是行號(hào)范圍會(huì)和每個(gè)dprintk()調(diào)用點(diǎn)的行號(hào)進(jìn)行比較。例如:

line1603//準(zhǔn)確定位到1603行
line1600-1605//1600行到1605行之間的6行
line-1605//從第一行到1605行之間的1605行
line1600-//從1600行到結(jié)尾的全部行

標(biāo)記規(guī)范包含了一個(gè)由一個(gè)或多個(gè)標(biāo)記字符跟隨的變化操作。這變化操作如下所示:

-//移除給定的標(biāo)記

+//加入給定的標(biāo)記

=//設(shè)置標(biāo)記到給定的標(biāo)記上

f//包含已打印消息的函數(shù)名

l//包含已在打印消息的行號(hào)

m//包含已打印消息的模塊名

p//產(chǎn)生一個(gè)printk()消息到顯示系統(tǒng)啟動(dòng)日志

t//包含了不在中斷上下文中產(chǎn)生的消息里的線程ID

傳遞啟動(dòng)參數(shù)給內(nèi)核

在調(diào)試系統(tǒng)啟動(dòng)是時(shí),像USB核心初始化等,這些代碼在系統(tǒng)進(jìn)入shell前已經(jīng)初始化完畢,因此無(wú)法及時(shí)打開動(dòng)態(tài)輸出語(yǔ)句。這時(shí)可以在內(nèi)核啟動(dòng)時(shí)傳遞參數(shù)給內(nèi)核,在系統(tǒng)初始化時(shí)就打開它們。

例如,在內(nèi)核命令行中添加 usbnet.dyndbg=+plft ,就可以在啟動(dòng)時(shí)打開 usbnet的動(dòng)態(tài)輸出。

在內(nèi)核啟動(dòng)后,通過(guò) dmesg | grep "usbnet" 即可看到輸出的調(diào)試信息。

舉例

打開文件svcsock.c 1603行動(dòng)態(tài)輸出語(yǔ)句

echo-n'filesvcsock.cline1603+p'>/sys/kernel/debug/dynamic_debug/control

打開文件svcsock.c所有動(dòng)態(tài)輸出語(yǔ)句

echo-n'filesvcsock.c+p'>/sys/kernel/debug/dynamic_debug/control

打開NFS服務(wù)模塊所有動(dòng)態(tài)輸出語(yǔ)句

echo-n'modulenfsd+p'>/sys/kernel/debug/dynamic_debug/control

打開函數(shù)svc_process()的所有動(dòng)態(tài)輸出語(yǔ)句

echo-n'funcsvc_process+p'>/sys/kernel/debug/dynamic_debug/control

關(guān)閉函數(shù)svc_process()的所有動(dòng)態(tài)輸出語(yǔ)句

echo-n'funcsvc_process-p'>/sys/kernel/debug/dynamic_debug/control

打開NFS調(diào)用的所有以READ開始的信息.

echo-n'format"nfsd:READ"+p'>/sys/kernel/debug/dynamic_debug/control

查看輸出的信息可以使用 dmesg | grep XXX 。也可以使用 tail -f /var/log/dmesg來(lái)實(shí)時(shí)監(jiān)控dmesg的日志輸出。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5152

    文章

    19675

    瀏覽量

    317579
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1416

    瀏覽量

    41436
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    590

    瀏覽量

    22287
  • DEBUG
    +關(guān)注

    關(guān)注

    3

    文章

    95

    瀏覽量

    20555

原文標(biāo)題:使用動(dòng)態(tài)輸出打印內(nèi)核的DEBUG信息

文章出處:【微信號(hào):嵌入式與Linux那些事,微信公眾號(hào):嵌入式與Linux那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)核學(xué)習(xí)筆記:動(dòng)態(tài)輸出調(diào)試

    上篇說(shuō)到printk調(diào)試,但printk是全局的,只能設(shè)置輸出等級(jí)。而動(dòng)態(tài)輸出可以動(dòng)態(tài)選擇打開某個(gè)內(nèi)核子系統(tǒng)的
    發(fā)表于 06-01 15:16 ?852次閱讀
    Linux<b class='flag-5'>內(nèi)核</b>學(xué)習(xí)筆記:<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>輸出</b>調(diào)試

    STM32WB55開發(fā)(4)----配置串口打印Debug調(diào)試信息

    在STM32WB55系列微控制器上進(jìn)行開發(fā)時(shí),實(shí)時(shí)監(jiān)控應(yīng)用程序的運(yùn)行情況和調(diào)試潛在問題是至關(guān)重要的。使用串口(USART/UART)進(jìn)行Debug信息打印是一種簡(jiǎn)便、高效的方法。下面是如何在STM32WB55上配置串口來(lái)
    的頭像 發(fā)表于 12-01 15:48 ?1985次閱讀
    STM32WB55開發(fā)(4)----配置串口<b class='flag-5'>打印</b><b class='flag-5'>Debug</b>調(diào)試<b class='flag-5'>信息</b>

    [求助]winCE板子進(jìn)桌面后就不打印debug信息

    我的mini2440+winCE,在板子啟動(dòng)時(shí),屏幕出現(xiàn)歡迎界面時(shí)串口能打印debug信息,但進(jìn)入桌面后就不打印了,有的正在打印的函數(shù)名,只
    發(fā)表于 03-06 14:11

    內(nèi)核調(diào)試解惑!

    解惑!我在使用飛思卡爾的單片機(jī)(M0+內(nèi)核的)用J-link做一個(gè)串口調(diào)試,就是在程序里調(diào)用printf函數(shù)然后在keil的Debug(printf)Viewer或者是Debug Uart#里
    發(fā)表于 01-23 11:10

    AM335x linuxBSP 編出的內(nèi)核沒有打印啟動(dòng)信息

    使用TI提供的linux-3.1.0-psp04.06.00.03.sdk編譯的內(nèi)核只是將pr_err信息打印出來(lái)了,請(qǐng)問如何設(shè)置可以講內(nèi)核啟動(dòng)信息
    發(fā)表于 05-15 07:06

    am335x調(diào)試內(nèi)核時(shí)怎么設(shè)置輸出打印信息

    請(qǐng)問怎么設(shè)置輸出打印信息???用printk后還要修改其他宏嗎?請(qǐng)知道的朋友告訴我,寫下步驟。謝謝。
    發(fā)表于 06-21 03:12

    多任務(wù)環(huán)境下串口輸出debug信息的方法是什么?

    debug信息交錯(cuò)到一起的現(xiàn)象。于是我又添加了另一種輸出的方式:為debug輸出額外創(chuàng)建一個(gè)進(jìn)程專用于
    發(fā)表于 07-20 08:03

    如何利用串口輸出printf的打印信息

    PC機(jī)上,printf輸出到顯示設(shè)備,在嵌入式linux系統(tǒng),一般利用printf輸出調(diào)試信息,需要重定向到串口。以AT91RM9200為例,簡(jiǎn)要說(shuō)明如何利用串口輸出printf的
    發(fā)表于 11-04 07:10

    分享一下Linux內(nèi)核日志與信息打印

    嵌入式軟件調(diào)試技術(shù)專題(3):Linux內(nèi)核日志與信息打印 6年嵌入式開發(fā)經(jīng)...
    發(fā)表于 12-23 07:36

    串口DEBUG只有打印信息的功能嗎

    使用串口DEBUG,只是看到boot的一些信息,無(wú)法登錄?這是因?yàn)檫@個(gè)debug功能只是打印信息?額外問一下,想在target 端 編譯開發(fā),要安裝GCC等,但是不可以使用連到包管理服
    發(fā)表于 01-11 06:25

    PRINT指定輸出串口1的打印信息,如果想輸出其他串口0的信息,怎么修改?

    PRINT指定輸出串口1的打印信息,如果想輸出其他串口0的信息,怎么修改!
    發(fā)表于 08-09 07:32

    嵌入式log打印格式輸出技巧

    嵌入式log打印格式輸出技巧Log 信息格式條件編譯可變參數(shù)宏C標(biāo)準(zhǔn)中一些預(yù)定義的宏格式輸出16進(jìn)制數(shù)組Log 信息格式參考目前主流嵌入式、
    發(fā)表于 10-20 21:06 ?5次下載
    嵌入式log<b class='flag-5'>打印</b>格式<b class='flag-5'>輸出</b>技巧

    Linux內(nèi)核動(dòng)態(tài)輸出調(diào)試

    pr_debug()/dev_dbg()函數(shù)來(lái)輸出信息,這些就使用了動(dòng)態(tài)輸出。 需要打開的內(nèi)核
    的頭像 發(fā)表于 09-27 15:45 ?799次閱讀
    Linux<b class='flag-5'>內(nèi)核</b><b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>輸出</b>調(diào)試

    Linux內(nèi)核基礎(chǔ):動(dòng)態(tài)輸出使用

    動(dòng)態(tài)輸出使用 打開svcsock.c文件中所有的動(dòng)態(tài)輸出語(yǔ)句 # echo 'file svcsock.c +p' > /sys/ kernel /
    的頭像 發(fā)表于 09-27 15:51 ?771次閱讀
    Linux<b class='flag-5'>內(nèi)核</b>基礎(chǔ):<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>輸出</b>使用

    內(nèi)核調(diào)試工具printkprintk的輸出格式

    很多內(nèi)核開發(fā)者喜歡的調(diào)試工具是printk,在Linux內(nèi)核中,使用printk()函數(shù)來(lái)打印信息,它與C庫(kù)的printf()函數(shù)類似。 printk()與printf()的一個(gè)重要
    的頭像 發(fā)表于 09-27 16:09 ?1446次閱讀