当前位置: 首页 > news >正文

Linux驱动开发 -- 打开dev_dbg()

 Linux驱动开发 -- 打开dev_dbg() 2012-10-23 19:21:54

分类: LINUX

linux设备驱动调试,我们在内核中看到内核使用dev_dbg来控制输出信息,这个函数的实质是调用printk(KERN_DEBUG )来输出打印信息。要打开这个开关需要下面两步。

     1、打开调试开关:你调试的文件中必然包含了<linux/device.h>,或者<linux /paltforam_device.h>,后者包含了前者,在包含此头文件之前,使用#define DEBUG 1 来打开调试开关:例如
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/clk.h>
#include <linux/module.h>
#define DEBUG    1
#include <linux/platform_device.h>

     在linux/device.h文件中:
#define dev_printk(level, dev, format, arg...)    \
    printk(level "%s %s: " format , dev_driver_string(dev) , (dev)->bus_id , ## arg)

#ifdef DEBUG
#define dev_dbg(dev, format, arg...)        \
    dev_printk(KERN_DEBUG , dev , format , ## arg)
#else
static inline int __attribute__ ((format (printf, 2, 3)))
dev_dbg(struct device * dev, const char * fmt, ...)
{
    return 0;
}
#endif
    但是这个打开了之后,也不能顺利的输出信息,原因是printk有默认的信息级别。
    linux/kern_levels.h文件中
#define KERN_EMERG      KERN_SOH "0"    /* system is unusable */
#define KERN_ALERT      KERN_SOH "1"    /* action must be taken immediately */
#define KERN_CRIT       KERN_SOH "2"    /* critical conditions */
#define KERN_ERR        KERN_SOH "3"    /* error conditions */
#define KERN_WARNING    KERN_SOH "4"    /* warning conditions */
#define KERN_NOTICE     KERN_SOH "5"    /* normal but significant condition */
#define KERN_INFO       KERN_SOH "6"    /* informational */
#define KERN_DEBUG      KERN_SOH "7"    /* debug-level messages */
#define KERN_DEFAULT    KERN_SOH "d"    /* the default kernel loglevel */
可以看到KERN_DEBUG是级别最低的。


2、修改文件kernel/printk.h文件

#define console_loglevel (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])
其中 default_console_loglevel 为终端console输出的最低级别,比这严重的都将输出。原来该值为7,则调试信息无法输出,修改为0则全部有输出。

 

相关文章:

  • 处理hadoop发送的文件到后台并解析存储到数据库策略
  • 猫猫学IOS(三十)UI之Quartz2D画图片画文字
  • Mac OS 安装boost
  • 使用Zookeeper存储Spring中properties的统一配置
  • 第四十二条:慎用可变参数
  • java使用Iterator、for循环同步数据
  • 不要盲目迷信多线程
  • 磁盘的5种卷,RAID—5的修复
  • IOS学习笔记--Objective-C之KVC、KVO
  • Skype for Business实战演练之八:安装Skype for Business Server 2015
  • android intent 传数据
  • java中HashSet详解(转)
  • 当我完善几年前的一个老项目时,我做了哪些改进
  • 简述ASP.NET MVC原理
  • 代码中的良好习惯从点滴做起
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【面试系列】之二:关于js原型
  • 10个最佳ES6特性 ES7与ES8的特性
  • Docker下部署自己的LNMP工作环境
  • ES10 特性的完整指南
  • express + mock 让前后台并行开发
  • Javascript弹出层-初探
  • JavaScript设计模式与开发实践系列之策略模式
  • Python进阶细节
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Sublime text 3 3103 注册码
  • tweak 支持第三方库
  • Twitter赢在开放,三年创造奇迹
  • 测试如何在敏捷团队中工作?
  • 关于使用markdown的方法(引自CSDN教程)
  • 深入浏览器事件循环的本质
  • 使用Gradle第一次构建Java程序
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 转载:[译] 内容加速黑科技趣谈
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • Mac 上flink的安装与启动
  • #100天计划# 2013年9月29日
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (层次遍历)104. 二叉树的最大深度
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三)模仿学习-Action数据的模仿
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .“空心村”成因分析及解决对策122344
  • .mysql secret在哪_MySQL如何使用索引
  • .Net 6.0 处理跨域的方式
  • .net core 6 redis操作类
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .Net的C#语言取月份数值对应的MonthName值
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @ModelAttribute注解使用
  • [.net]官方水晶报表的使用以演示下载