如何打开pr_debug调试信息

转载:http://blog.csdn.net/helloanthea/article/details/25330809

以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

其作用相当于在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接口: <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之旅吧!

时间: 2024-12-25 15:29:21

如何打开pr_debug调试信息的相关文章

打开libimobiledevice调试信息

libimobiledevice类库主要是第三方访问iOS设备的接口封装,iTool第三方iTunes工具的鼻祖吧. 刚接触的时候都不知道怎么调试只知道用生成的工具来获取自己想知道的信息. 开启调试信息: 根源是configure.ac中对这个宏的定义,有的没有这个文件,我们可以直接在config.h 和config.h.status中注释或者删除.

django关闭调试信息,打开内置错误视图

1 内置错误视图 Django内置处理HTTP错误的视图,主要错误及视图包括: 404错误:page not found视图 500错误:server error视图 400错误:bad request视图 如果想看到错误视图而不是调试信息,需要修改 项目名/setting.py文件的DEBUG项. DEBUG = False ALLOWED_HOSTS = ['*', ] 2 编写视图模板 在模板路径下编写自己的404.html,500.html,400.html等 404错误及视图 将请求地

如何优雅的输出PHP调试信息

经常因为出现紧急bug而被老板骂的同事,为了更快的修复而直接利用线上的错误环境现场debug,并直接在页面上echo和dump.结果被老板发现了,又是一通臭骂.那么有没有什么办法更优雅的输出PHP调试信息呢? 这里提供一个方案:利用浏览器调试模式的Console 1,先定义一个php函数: 1 function console($log='') 2 { 3 switch (empty($log)) { 4 case False: 5 $out = json_encode($log); 6 $GL

无法找到.exe的调试信息

原文:无法找到.exe的调试信息 前天重装了电脑,并配置了Visual Studio2005的VC正则库,boost/regex,运行速度马上快了三倍吧,到底是怎么快的,我还真说不清楚,因为电脑这玩意儿,老是要你程序的Bug群魔乱舞,持之以恒到将要失去信心时给你来了180度大转弯,然后就一切正常了.不管貌似这个正则匹配还算很重要,啥时候心静到悠哉时非把这个写下来不可,现在呢,每次编译我的大程序时,都会拿小到不定点儿的mini程序中先来个测试,然后才能盛装转移,可这一重装,我的mini竟然出现以下

STM32M CUBE实现printf打印调试信息以及实现单字节接收

在写单片机程序时我们一般喜欢使用printf来通过串口打印调试信息,但这个函数是不可以直接使用的,必须做点对库函数的改动. 详细工程下载地址: http://download.csdn.net/detail/liucheng5037/8847961 STM32M CUBE是ST官方提供的库以及初始化工具,很好很强大,但是在UART方面值提供了如下函数: HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *

Crash log符号化与调试信息

这篇文章主要整理了crash log的符号化解析和调试信息与配置相关的一些内容. 对于做移动App开发的来说,质量和体验都是很重要的.一个客户端应用如果经常“闪退”,是产品质量很差的一个体现,用户体验就更不用提了.所以开发一个优秀的App,首先是保证自身的技术质量,尽量杜绝“闪退”,也就是“Crash”.但客户端上线后,偶尔出现一个隐藏很深的bug也在所难免.我们所能做的就是尽可能的收集问题相关的信息,争取在将来的新版本中解决和改进. 0. Crash 一个App启动之后,用着用着就突然被iOS

am335x UART1输入u-boot 调试信息代码修改

AM335x 调试信息UART1输出代码修改1. 关于pin_mux  的配置代码修改位置:/board/forlinx/ok335x/mux.c 1 void enable_uart0_pin_mux(void) 2 { 3 configure_module_pin_mux(uart0_pin_mux_spl); 4 configure_module_pin_mux(uart1_pin_mux); 5 } 6 将这行代码打开. 代码跟踪流程:arch/arm/cpu/armv7/start.S

VS2005调试时无法找到调试信息解决方法

调试C++程序的时候出现,无法找到.exe的调试信息,或者调试信息不匹配.未使用调试信息生成二进制文件.解决方法:打开菜单项目->项目属性页: 1.选择配置属性->链接器->调试->生成调试信息改为“ 是”: 2.选择配置属性->C/C++ ->常规->调试信息格式 改为用于“编辑并继续”的程序数据库(/ZI): 3.选择配置属性->C/C++ ->优化->优化改为 自定义. 重新编译,运行.OK.

VS2008中编译通过,但调试时出现“未使用调试信息生成二进制文件”的问题

.只要是“建立项目的时候不应建立空项目,而应当建立一个“win32控制台应用程序”.这样确实可以解决问题.只要你选择的是这个"win32控制台应用程序"则在附加选项里面选不选上“空项目”都可以. 其实问题在于,在空项目中不生成调试文件pdb,所以无法调试. 要让项目生成pdb文件,需要更改: 项目属性,configuration properties->linker->Generate Debug Info 从 no 改为 yes 但这样还是不够的,还需要更改: 项目属性,