/sys/ kernel /debug/ dynamic_debug/control 打開usbcore模塊中所有的動(dòng)態(tài)輸出語(yǔ)句 # echo 'module usbcore +p' > /sys/ kernel /debug/ dynamic_debug/control 打開svc_process()函數(shù)中所有的動(dòng)態(tài)輸出語(yǔ)句 # echo 'func svc_process() +p' > /sys/ kernel /debug/ dynamic_debug/control 打開文件路徑包含usb的文件里所有的動(dòng)態(tài)輸出語(yǔ)句 # echo -n '*usb* +p' > /sys/ kernel /debug/ dynamic_debug/control 打開系統(tǒng)所有的動(dòng)態(tài)輸出語(yǔ)句 # echo -n '+p' > /sys/ kernel" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

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

麥辣雞腿堡 ? 來(lái)源:嵌入式Linux充電站 ? 作者:Vincent ? 2023-09-27 15:51 ? 次閱讀

動(dòng)態(tài)輸出使用

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

# echo 'file svcsock.c +p' > /sys/kernel/debug/dynamic_debug/control

打開usbcore模塊中所有的動(dòng)態(tài)輸出語(yǔ)句

# echo 'module usbcore +p' > /sys/kernel/debug/dynamic_debug/control

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

# echo 'func svc_process() +p' > /sys/kernel/debug/dynamic_debug/control

打開文件路徑包含usb的文件里所有的動(dòng)態(tài)輸出語(yǔ)句

# echo -n '*usb* +p' > /sys/kernel/debug/dynamic_debug/control

打開系統(tǒng)所有的動(dòng)態(tài)輸出語(yǔ)句

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

上面是打開動(dòng)態(tài)輸出語(yǔ)句的例子,除了能輸出pr_debug()/dev_dbg()函數(shù)中定義的輸出信息外,還能輸出一些額外信息,如函數(shù)名、行號(hào)、模塊名字以及線程ID等

  • p:打開動(dòng)態(tài)輸出語(yǔ)句
  • f:輸出函數(shù)名
  • l:輸出行號(hào)
  • m:輸出模塊名字
  • t:輸出線程ID

另外,還可以在各個(gè)子系統(tǒng)的Makefile中添加ccflags來(lái)打開動(dòng)態(tài)輸出語(yǔ)句

< ../Makefile >

ccflags-y += -DDEBUG
ccflags-y += -DVERBOSE_DEBUG

實(shí)際案例

例如在一個(gè)led驅(qū)動(dòng)中的open()、write()等函數(shù)開頭添加一句pr_debug("%s entern",
**func **** ** );

#include < linux/module.h >
#include < linux/fs.h >
#include < linux/errno.h >
#include < linux/miscdevice.h >
#include < linux/kernel.h >
#include < linux/major.h >
#include < linux/mutex.h >
#include < linux/proc_fs.h >
#include < linux/seq_file.h >
#include < linux/stat.h >
#include < linux/init.h >
#include < linux/device.h >
#include < linux/tty.h >
#include < linux/kmod.h >
#include < linux/gfp.h >

static int major = 0;
static char kernel_buf[1024];
static struct class *hello_class;

#define MIN(a, b) (a < b ? a : b)

static ssize_t hello_drv_read (struct file *file, char __user *buf, size_t size, loff_t *offset)
{
 int err;
 pr_debug("%s entern", __func__);

 err = copy_to_user(buf, kernel_buf, MIN(1024, size));
 return MIN(1024, size);
}

static ssize_t hello_drv_write (struct file *file, const char __user *buf, size_t size, loff_t *offset)
{
 int err;
 pr_debug("%s entern", __func__);
 err = copy_from_user(kernel_buf, buf, MIN(1024, size));
 return MIN(1024, size);
}

static int hello_drv_open (struct inode *node, struct file *file)
{
 pr_debug("%s entern", __func__);
 return 0;
}

static int hello_drv_close (struct inode *node, struct file *file)
{
 pr_debug("%s entern", __func__);
 return 0;
}

/* 2. 定義自己的file_operations結(jié)構(gòu)體                                              */
static struct file_operations hello_drv = {
 .owner  = THIS_MODULE,
 .open    = hello_drv_open,
 .read    = hello_drv_read,
 .write   = hello_drv_write,
 .release = hello_drv_close,
};

static int __init hello_init(void)
{
 int err;
 
 pr_debug("%s entern", __func__);
 major = register_chrdev(0, "hello", &hello_drv);  /* /dev/hello */

 hello_class = class_create(THIS_MODULE, "hello_class");
 err = PTR_ERR(hello_class);
 if (IS_ERR(hello_class)) {
  unregister_chrdev(major, "hello");
  return -1;
 }
 
 device_create(hello_class, NULL, MKDEV(major, 0), NULL, "hello"); /* /dev/hello */
 
 return 0;
}

static void __exit hello_exit(void)
{
 pr_debug("%s entern", __func__);
 device_destroy(hello_class, MKDEV(major, 0));
 class_destroy(hello_class);
 unregister_chrdev(major, "hello");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

為了方面查看,先清除內(nèi)核輸出:

# dmesg -c

然后加載驅(qū)動(dòng),執(zhí)行dmesg查看是否有打?。?/p>

# insmod hello_drv.ko
# dmesg

圖片

此時(shí)沒有pr_debug()的打印。這時(shí)再使用動(dòng)態(tài)輸出打開hello_drv模塊的動(dòng)態(tài)輸出:

# echo 'module hello_drv +p' > /sys/kernel/debug/dynamic_debug/control

然后執(zhí)行該驅(qū)動(dòng)的應(yīng)用層程序,使其調(diào)用到驅(qū)動(dòng)的open、write、close函數(shù),從而執(zhí)行pr_debug():

# ./hello_drv_test -w 10

再查看demsg內(nèi)容:

圖片

可以看到,當(dāng)打開了hello_drv模塊的動(dòng)態(tài)輸出后,驅(qū)動(dòng)中的pr_debug()語(yǔ)句就可以正常打印了。

再看看debugfs的control節(jié)點(diǎn):

# cat /sys/kernel/debug/dynamic_debug/control

圖片

control節(jié)點(diǎn)記錄了剛剛執(zhí)行pr_debug()時(shí)的文件名、所在行號(hào)、模塊名、函數(shù)名和輸出語(yǔ)句(p表示動(dòng)態(tài)輸出的語(yǔ)句)。

聲明:本文內(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)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1338

    瀏覽量

    40101
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1798

    瀏覽量

    84928
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11131

    瀏覽量

    208018
  • 輸出
    +關(guān)注

    關(guān)注

    0

    文章

    89

    瀏覽量

    21768
收藏 人收藏

    評(píng)論

    相關(guā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 ?454次閱讀
    <b class='flag-5'>Linux</b><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)試

    嵌入式Linux系統(tǒng)中內(nèi)核抽象的動(dòng)態(tài)擴(kuò)展技術(shù)

    擴(kuò)展性的意義。然后,討論目前幾種主要的核心動(dòng)態(tài)擴(kuò)展技術(shù),以及各種技術(shù)在嵌入式系統(tǒng)上的優(yōu)缺點(diǎn)。最后,分析嵌入式Linux動(dòng)態(tài)擴(kuò)展性研究所面臨的挑戰(zhàn)和發(fā)展趨勢(shì)。 1、幾種主要的內(nèi)核
    發(fā)表于 10-26 09:22

    嵌入式Linux系統(tǒng)中內(nèi)核抽象的動(dòng)態(tài)擴(kuò)展技術(shù)

    擴(kuò)展性的意義。然后,討論目前幾種主要的核心動(dòng)態(tài)擴(kuò)展技術(shù),以及各種技術(shù)在嵌入式系統(tǒng)上的優(yōu)缺點(diǎn)。最后,分析嵌入式Linux動(dòng)態(tài)擴(kuò)展性研究所面臨的挑戰(zhàn)和發(fā)展趨勢(shì)。 1、幾種主要的內(nèi)核
    發(fā)表于 10-28 09:53

    嵌入式Linux系統(tǒng)中內(nèi)核抽象的動(dòng)態(tài)擴(kuò)展技術(shù)

    嵌入式Linux系統(tǒng)中內(nèi)核抽象的動(dòng)態(tài)擴(kuò)展技術(shù)隨著嵌入式技術(shù)的快速發(fā)展和嵌入式設(shè)備的普及,嵌入式應(yīng)用發(fā)展的一個(gè)關(guān)鍵趨勢(shì)是從靜態(tài)的、固定的系統(tǒng)功能到動(dòng)態(tài)的、可擴(kuò)展的系統(tǒng)功能。首先,介紹嵌入
    發(fā)表于 04-04 17:12

    Linux嵌入式系統(tǒng)中內(nèi)核技術(shù)的可動(dòng)態(tài)拓展技術(shù)有哪些

    值后要重新編譯內(nèi)核,對(duì)普通用戶而言難以實(shí)現(xiàn)。通信的發(fā)展使得嵌入式操作系統(tǒng)的動(dòng)態(tài)擴(kuò)展成為可能,可以在遠(yuǎn)程控制的基礎(chǔ)上增加嵌入式系統(tǒng)的靈活性,延長(zhǎng)嵌入式系統(tǒng)的壽命;同時(shí),由于嵌入式Linux的應(yīng)用日益廣泛
    發(fā)表于 08-06 06:39

    Linux內(nèi)核教程

    本章學(xué)習(xí)目標(biāo)掌握LINUX內(nèi)核版本的含義理解并掌握進(jìn)程的概念掌握管道的概念及實(shí)現(xiàn)了解內(nèi)核的數(shù)據(jù)結(jié)構(gòu)了解LINUX內(nèi)核的算法掌握
    發(fā)表于 04-10 16:59 ?0次下載

    Linux內(nèi)核編譯詳談

    Linux內(nèi)核編譯詳談
    發(fā)表于 10-30 09:51 ?7次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>編譯詳談

    如何配置和使用Linux內(nèi)核printk功能

    了解如何配置和使用Linux內(nèi)核printk功能,包括其動(dòng)態(tài)調(diào)試功能。 這樣可以選擇性地打印調(diào)試消息,而無(wú)需重新編譯內(nèi)核。
    的頭像 發(fā)表于 11-27 06:40 ?3014次閱讀

    linux內(nèi)核是什么_linux內(nèi)核學(xué)習(xí)路線

    Linux內(nèi)核是一個(gè)操作系統(tǒng)(OS)內(nèi)核,本質(zhì)上定義為類Unix。它用于不同的操作系統(tǒng),主要是以不同的Linux發(fā)行版的形式。Linux
    發(fā)表于 09-16 15:49 ?2568次閱讀

    linux內(nèi)核參數(shù)設(shè)置_linux內(nèi)核的功能有哪些

    本文主要闡述了linux內(nèi)核參數(shù)設(shè)置及linux內(nèi)核的功能。
    發(fā)表于 09-17 14:40 ?1319次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b>參數(shù)設(shè)置_<b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b>的功能有哪些

    最硬核的Linux內(nèi)核文章

    來(lái)源 :頭條號(hào)@Linux學(xué)習(xí)教程,冰凌塊兒 01 前言 本文主要講解什么是Linux內(nèi)核,以及通過多張圖片展示Linux內(nèi)核的作用與功能,
    的頭像 發(fā)表于 10-19 17:46 ?2032次閱讀
    最硬核的<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>文章

    快速理解什么是Linux內(nèi)核以及Linux內(nèi)核的內(nèi)容

    01 前言 本文主要講解什么是Linux內(nèi)核,以及通過多張圖片展示Linux內(nèi)核的作用與功能,以便于讀者能快速理解什么是Linux
    的頭像 發(fā)表于 10-21 12:02 ?4160次閱讀
    快速理解什么是<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>以及<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的內(nèi)容

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

    printk()是很多嵌入式開發(fā)者喜歡用的調(diào)試手段之一,但是,使用printk()每次都要重新編譯內(nèi)核,很不方便。使用動(dòng)態(tài)輸出在不需要重新編譯內(nèi)核的情況下,方便的打印出
    的頭像 發(fā)表于 01-06 10:46 ?746次閱讀

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

    動(dòng)態(tài)輸出可以動(dòng)態(tài)選擇打開某個(gè)內(nèi)核子系統(tǒng)的輸出,可以有選擇性地打開某些模塊的輸出。 配置
    的頭像 發(fā)表于 09-27 15:45 ?467次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>輸出</b>調(diào)試

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    ,需要了解Linux內(nèi)核的基本概念和API。以下是一些關(guān)鍵概念: 1.1 內(nèi)核模塊:Linux內(nèi)核模塊是一種
    的頭像 發(fā)表于 08-30 15:02 ?216次閱讀