Linux 驱动的打印方法

Linux  printk
printk( ) 函数中可以指定日志的级别。
#define KERN_EMERG    "<0>"    /* system is unusable            */
#define KERN_ALERT    "<1>"    /* action must be taken immediately    */
#define KERN_CRIT    "<2>"    /* critical conditions        */
#define KERN_ERR    "<3>"    /* error conditions            */
#define KERN_WARNING    "<4>"    /* warning conditions        */
#define KERN_NOTICE    "<5>"    /* normal but significant condition    */
#define KERN_INFO    "<6>"    /* informational            */
#define KERN_DEBUG    "<7>"    /* debug-level messages    */

值越小,其级别越高。
printk(KERN_WARNING “abcdefg\n”),指定了此日志的级别为KERN_WARNING
printk(“abcdefg\n”),没有指定日志的输出级别,则使用系统默认的日志级别 DEFAULT_MESSAGE_LOGLEVEL
在printk.c中,定义DEFAULT_MESSAGE_LOGLEVEL
/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL

在内核驱动中,我们常使用的打印函数是
int dev_printk(const char *level, const struct device *dev, const char *fmt, ...)
这个函数相比printk的好处是,它能够打印出设备和驱动名称的信息。
还有一个函数dev_dbg(dev, format, arg...),它实际上是一个dev_printk的简化宏
#if defined(DEBUG)
#define dev_dbg(dev, format, arg...)        \
    dev_printk(KERN_DEBUG, dev, format, ##arg)
这个函数指定了dev_printk 的输出级别为KERN_DEBUG。由其定义可知,要使用此宏,必须在代码中#define DEBUG 1


在内核中,有几个与dev_dbg类似的函数,对应各自不同的日志级别。不过,使用下面这些函数,不需要#define DEBUG 1
define_dev_printk_level(dev_emerg, KERN_EMERG);
define_dev_printk_level(dev_alert, KERN_ALERT);
define_dev_printk_level(dev_crit, KERN_CRIT);
define_dev_printk_level(dev_err, KERN_ERR);
define_dev_printk_level(dev_warn, KERN_WARNING);
define_dev_printk_level(dev_notice, KERN_NOTICE);
define_dev_printk_level(_dev_info, KERN_INFO);

#define dev_info(dev, fmt, arg...) _dev_info(dev, fmt, ##arg)
另有两个在debug是很有用的函数
#define dev_WARN(dev, format, arg...) \
    WARN(1, "Device: %s\n" format, dev_driver_string(dev), ## arg);

#define dev_WARN_ONCE(dev, condition, format, arg...) \
    WARN_ONCE(condition, "Device %s\n" format, \
            dev_driver_string(dev), ## arg)
代码里面的对这两个函数的注释是:
* dev_WARN*() acts like dev_printk(), but with the key difference of using a WARN/WARN_ON to get the message out, including the file/line information and a backtrace.
它的日志中包含了文件名 行号 及堆栈等信息。而dev_WARN_ONCE则可以通过condition来指定输出日志的条件。










以上都是关于日志输出及其级别的,控制台通过输出日志级别控制来决定各级别的日志是否需要从控制台输出,例如串口等虚拟控制台。
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
int console_printk[4] = {
    DEFAULT_CONSOLE_LOGLEVEL,    /* console_loglevel */
    DEFAULT_MESSAGE_LOGLEVEL,    /* default_message_loglevel */
    MINIMUM_CONSOLE_LOGLEVEL,    /* minimum_console_loglevel */
    DEFAULT_CONSOLE_LOGLEVEL,    /* default_console_loglevel */
};
console_printk的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别。
可用下面的命令设置当前控制台输出日志级别:
# cat  /proc/sys/kernel/printk
# echo 8 > /proc/sys/kernel/printk


另一个比较有效控制log的方法的是使用module_param(debugLevel,int,0),
module_param可以在模块中传入参数,这个参数是可以在终端中通过
echo x > /sys/module/xxx/parameters/debugLevel 来修改的,因此,我们可以此来动态的控制单独某一个模块的log输出,在需要的时候,打印出log。例如:
#define tchip_dev_dbg(dbg_level, dev, format, arg...) \
do {                                      \
if (dbg_level <= debugLevel)       \
dev_info(dev, format, ##arg)    \
}while(0)

或者

#define dprintk(level, fmt, arg...) do {            \
    if (debugLeve >= level)                     \
    printk(KERN_WARNING"rk29xx_ft5x0x: " fmt , ## arg); } while (0)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 驱动调试是开发者在开发和调试Linux内核驱动程序时经常遇到的任务。下面是一些常用的Linux驱动调试方法: 1. 打印调试信息: 在驱动程序中使用printk或者dev_printk函数输出调试信息。由于驱动程序运行在内核空间,因此可以使用printk函数将调试信息输出到内核日志中。通过查看内核日志,可以了解内核执行过程中驱动程序相关的信息。 2. 开启内核调试功能: 使用kdb、kgdb或者kgdboc等工具来开启内核调试功能。这些工具可以通过调试界面或者串口连接到内核进行调试。通过设置断点、单步执行等操作,可以对驱动程序进行详细的调试。 3. 使用调试工具: Linux内核提供了一些调试工具,如kprobe、kprobe-based-trace等。这些工具可以用于在运行时跟踪内核函数的调用和参数,并通过利用perf工具进行性能分析。针对特定问题,可以使用ftrace来进行函数追踪和性能分析。 4. 使用模拟环境: 在某些情况下,为了调试驱动程序,可以使用模拟环境。如使用qemu来模拟运行某个特定的硬件平台,以便方便地进行驱动程序的调试。 5. 动态打印调试信息: Linux内核提供了一些函数(如dynamic_debug_enable)来动态控制驱动程序打印调试信息的级别。通过在驱动程序中使用动态调试宏(如pr_debug),可以根据需要在运行时动态地输出调试信息。 总结起来,Linux驱动调试方法包括打印调试信息、开启内核调试功能、使用调试工具、使用模拟环境以及动态打印调试信息等。这些方法可以帮助开发者定位和解决驱动程序中的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值