[转]如何打开pr_debug调试信息
来源:互联网 发布:ue js格式化代码 编辑:程序博客网 时间:2024/06/04 19:56
转自:http://blog.csdn.net/helloanthea/article/details/25330809。
如何打开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到底采用哪种用法:
第一种用法,如果定义了CONFIG_DYNAMIC_DEBUG,就使用动态debug机制dynamic_pr_debug();
第二种用法,如果定义了DEBUG,就使用printk(KERN_DEBUG...);
第三种用法,默认情况下,不打印。
第三种不打印肯定不是我们想要的,那么要想让kernel乖乖的打印调试信息,就只有前面两条路可选了:要么动态debug,要么定义DEBUG宏。
先说一下如何定义DEBUG宏:
其实在kernel中很多driver已经定义好了这样的DEBUG选项,前人栽树,后人乘凉,我们可以先看看有没有现成的。例如,我们经常可以看到这样的配置选项和宏定义:
(1) DMA Engine debugging(CONFIG_DMADEVICES_DEBUG)
(2) Power Management Debug Support(CONFIG_PM_DEBUG)
(3) Enable debug for the B2C2 FlexCopdrivers(CONFIG_PCI_DEBUG)
以DMA为例,在drivers/dma/Makefile中定义了编译选项
ccflags-$(CONFIG_DMADEVICES_DEBUG) := -DDEBUG
其作用相当于在drivers/dma/所有子文件定义了宏#define DEBUG
小伙伴们赶紧把CONFIG_DEBUG选项选上吧,然后重新编译kernel。先别急,这样还不够,默认的console级别是7(在kernel/printk/printk.c中定义了#define DEFAULT_CONSOLE_LOGLEVEL7)只有那些级别“小于7”的调试信息才能打印出来,而printk(KERN_DEBUG...)的级别是7,那就还需要提高console打印级别。如果要查看dma初始化的debug信息,那就直接改代码,#defineDEFAULT_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,大功告成!
如果一些driver没有现成的宏可用,那么你可以在你想debug的源文件中直接定义DEBUG宏,例如你想查看driver/video/fsl-diu-fb.c的调试信息,直接在头文件引用后添加宏定义#define DEBUG(宏的作用范围相信我就不用多说了吧,就是从宏定义开始到源文件的末尾结束),就能如愿以偿了。开发人员也可以自己仿照上述方法进行定义。
下面再简单说一下kernel的动态调试
打开Enable dynamic printk() support(DYNAMIC_DEBUG),那么所有的pr_debug()/dev_debug() 之类的函数在runtime就可以动态地使用了。kernel动态调试提供一个debugfs接口:<debugfs>/dynamic_debug/control
这个文件可以用来获取已完成的调试信息列表,例如你要显示文件'svcsock.c'的1603行内容,你可以这样做:
nullarbor:~ # echo 'file svcsock.c line 1603 +p' >
<debugfs>/dynamic_debug/control
// 提供文件svcsock.c所有信息
nullarbor:~ # echo -n 'file svcsock.c +p' >
<debugfs>/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之旅吧!
- [转]如何打开pr_debug调试信息
- 如何打开pr_debug调试信息
- 如何打开pr_debug调试信息
- 如何打开pr_debug调试信息
- 如何打开pr_debug调试信息
- 如何打开pr_debug调试信息
- 如何打开pr_debug调试信息
- 如何打开pr_debug调试信息
- 如何打开pr_debug调试信息
- linux内核如何打开pr_debug调试信息
- Linux内核动态调试信息的打开,如pr_debug
- Linux内核动态调试信息的打开,如pr_debug
- Linux内核动态调试信息的打开,如pr_debug .
- Linux内核动态调试信息的打开,如pr_debug
- 内核调试pr_debug
- 动态调试pr_debug
- 打开固定文件的pr_debug
- 打开固定文件的pr_debug .
- 人脸识别技术大总结——Face Detection & Alignment
- Github上Stars最多的53个深度学习项目,TensorFlow遥遥领先
- 在安卓开发环境下写一个main测试类运行报错ShouldNotReachHere
- 二维码的介绍
- 第五讲作业,输入长方形的边长,输出发现面积与周长
- [转]如何打开pr_debug调试信息
- 第一个坑的我崩溃的题目:福尔摩斯的约会
- Ubuntu 14.04安装Matlab2012a过程
- Ajax+Js+Dom+Json无刷新分页技术
- C#读写txt文件
- 【HDU】5910 Advanced Traffic System【线段树+并查集】【数据结构模拟最短路】
- 解决Windows 10下Wireshark运行问题
- 第七周 项目5 -排队看病模拟
- 将查询得到的json段的一行,设为链接形式,以打开新页面进行详细内容显示