`dev_info()` 能做什么?驱动开发中的日志调试利器

Linux 内核动态打印调试(dev_info、 dev_dbg ) 在 kernel 驱动代码中,使用动态输出是系统内核调试的重要手段之一,printk打印是全局的,只能设置输出等级。而动态输出可以动态选择打开某个内核子系统的输出,可以有选择性地打开某些模块的输出,printk被dev_info,dev_dbg,dev_err之类的函数代替,dev_xxx函数的本质还是使用printk打印的,只是对printk进行了一层包装。下面简述下这几个dev_xxx函数的基本使用规则,以及动态调试使用方式。 阅读详情

🚀

在 Linux 驱动开发过程中,调试信息的输出是我们定位问题、理解内核执行流程的第一武器。而与 printk() 并列,内核为我们提供了一个更具语义化和上下文感知能力的日志接口:dev_info()。本文将围绕 dev_info() 展开,讲清它的使用方式、适用场景、输出机制以及与其他调试手段的比较,帮助你在实际调试中更加得心应手。


在这里插入图片描述

📌 为什么需要 dev_info()?

传统的 printk() 当然能用,但它存在两个问题:

  1. 输出不带上下文:你无法直接知道哪一个设备、哪一条总线产生了这条日志。
  2. 维护性差:在多设备、多模块并存的复杂系统中,printk() 的信息常常缺乏“来源说明”。

而 dev_info() 提供了解决方案:

  • 自动输出设备名称、驱动名、总线名
  • 日志更具结构性,便于筛选与追踪
  • 与设备生命周期绑定,语义更明确

🔍 dev_info() 是什么?

dev_info() 是 Linux 内核中的一个宏定义,声明在:

#include <linux/device.h>

用于输出级别为 KERN_INFO 的日志,绑定在特定 struct device * 对象上。与它一同提供的还有:

函数名含义输出级别
dev_emerg()紧急错误(系统崩溃)KERN_EMERG
dev_alert()严重警告KERN_ALERT
dev_crit()关键错误KERN_CRIT
dev_err()一般错误KERN_ERR
dev_warn()警告KERN_WARNING
dev_info()一般信息KERN_INFO
dev_dbg()调试信息(需打开)KERN_DEBUG

🧩 dev_info() 实战示例

以 I2C 设备驱动为例,在 probe() 函数中添加日志输出:

static int my_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    dev_info(&client->dev, "my_i2c_driver: probe called\n");

    // ...初始化代码...
    return 0;
}

启动内核后,在 dmesg 中你可以看到:

[    3.452184] my_i2c_driver 1-0050: my_i2c_driver: probe called

这条日志不仅包含了你写入的信息,还附带了设备名(如 1-0050 表示 i2c-1 总线上的 0x50 地址设备)。


🔧 输出日志在哪看?

你可以通过以下方式查看:

dmesg | grep my_i2c_driver

或者查看串口输出(如使用 minicom)的内核启动日志。


🧠 dev_info() 背后的工作机制

dev_info() 的本质是封装了 printk(),但它调用了 dev_printk(),能自动从 struct device 中获取信息进行格式化输出:

dev_printk(KERN_INFO, dev, fmt, ...);

输出内容类似:

[时间戳] 设备名:消息内容

这让你的日志天然带有设备来源信息,尤其适合多实例设备(如多个 I2C 设备)共用驱动的场景。


🛠️ dev_dbg() 与动态调试

有些人会问:为什么我用 dev_dbg() 打印不出来?

这是因为 dev_dbg() 的默认行为是 关闭的。你需要手动打开 dynamic debug:

开启 dynamic debug(示例)

echo 'file drivers/i2c/* +p' > /sys/kernel/debug/dynamic_debug/control

或者在模块中启用:

#define DEBUG
#include <linux/device.h>

如果你不想控制开关,建议统一使用 dev_info()。


📘 dev_info() 与 printk() 的对比

维度dev_info()printk()
是否绑定设备上下文✅ 是❌ 否
输出是否包含设备信息✅ 是❌ 否
适合用于模块化驱动✅ 非常适合❌ 不适合大型驱动
用法灵活性中(需传 dev)高(直接调用)

📦 推荐使用时机

场景推荐使用
probe() 入口/出口调试✅ dev_info()
获取资源失败(regmap/clk)✅ dev_err()
中断触发验证✅ dev_info() 或 dev_dbg()
配置状态检查(如 suspend/resume)✅ dev_info()

✅ 总结

dev_info() 是 Linux 驱动开发中推荐使用的日志打印方式。相较于传统的 printk(),它更具结构化、语义清晰、上下文感知能力。通过与 struct device 绑定,它可以让你在驱动调试中更加有针对性地观察设备行为,尤其适用于复杂 SoC、BSP、I2C/SPI 平台等多设备场景。

建议你在今后的驱动开发中,将 dev_info()、dev_err()、dev_dbg() 等用法作为调试日志的默认选择,全面提升代码质量与可维护性。


📌 你是否正在调试某个驱动匹配不成功的问题?不妨马上在 probe() 中加上 dev_info() 看看吧!


如需配套代码模板、调试脚本或 DTS 示例,欢迎关注我的平台“嵌入式Jerry”,每日一练,一起进阶。

📺 视频教程请关注 B 站:“嵌入式 Jerry”


CDDT CST CDDT CSTTT This is the second part of the SA8653 automotive CDDT configuration guide. It describes the matching rules and modification methods between CDDT and device‑tree DDTS. It explains CDT’s underlying logic and configuration in TZ, QNX and Android. It details C 阅读详情

相关推荐

判断两个多边形是否相交(java实现)

判断两个多边形是否相交 ,当前认为一个点相交也是相交,可针对凹多边形和凸边型等多复杂的多边形进行相交判断,采用java实现,因为网上java实现的比较少,所以这里写下如何实现,适用于碰撞检测,地图等等应用场景

IT_CREATE的博客 5843

Claude Code国内实战指南:精准上下文配置与Token精算

Claude Code并非传统代码补全工具,而是一种基于宪法AI架构的确定性推理系统,其核心在于可追溯、带源码锚点的上下文驱动推理。它依赖结构化项目元数据(如CODE_CONTEXT.md、Kconfig、.gitignore)构建知识图谱,而非泛化统计模型,因此在嵌入式、车规、医疗等强合规场景中具备独特技术价值。通过CLI深度配置、IDE桥接层定制与桌面网关沙箱化,可实现本地开发环境中的可审计、可复现协同。结合claude-3-sonnet模型选型、上下文压缩与--dry-run token精算,显著提升

weixin_34268169的博客 334

分析攻击流量样本

利用wireshark分析.pcap攻击样本的攻击流程,利用漏洞等。

一段旅途 6842

dev_info()/dev_dbg()/dev_err()

目前在kernel驱动代码中,都不再建议直接使用printk直接添加打印信息,而是使用dev_info,dev_dbg,dev_err之类的函数代替,虽然这些dev_xxx函数的本质还是使用printk打印的,但是相比起printk: 支持打印模块信息、dev信息 支持动态调试(dynamic debug)方式 下面简述下这几个dev_xxx函数的基本使用规则,以及动态调试使用方式。 dev...

boyemachao的专栏 1万+

嵌入式人工智能(18-基于树莓派4B的继电器JQC-3FF-S-Z)

本次实验的输出端控制不会接强电,就用LED灯来模拟即可,由于我那个流水灯模块是低电平点亮,所以接线稍有不同,同学们注意。只有继电器吸合,输出端的NO与COM就导通,给LED低电平然后就亮,否则继电器断开,NO与COM不导通,LED不亮。原理都一样,控制电流的接通与断开,这个模块看起来还简单点,毕竟还有2个指示灯,下端IN如接上电源红灯亮,继电器动作有电流通过绿灯亮。在实际应用中,可以通过编程控制继电器的通断状态,例如在Python编程中设置继电器模块的通断时间,从而实现自动化控制。

u010152658的博客 2530

044、手持视频抖动严重?OpenCV 光流 + IMU 融合的电子防抖工程方案

本文探讨了基于OpenCV光流和IMU融合的手持视频电子防抖方案。作者从实际工程经验出发,分析了纯光流和纯IMU方案的局限性,指出时间戳对齐和坐标系标定是关键挑战。文章详细介绍了融合滤波器的实现方法,推荐互补滤波替代卡尔曼滤波,并提出了动态调整融合系数的策略。在光流算法优化方面,建议采用网格化FAST特征点和前后向误差检测。最后分享了运动补偿裁剪策略和多线程流水线设计,强调在嵌入式设备上使用NEON指令优化性能。该方案通过精确的时间同步和传感器融合,有效解决了手持拍摄中的高频抖动问题。

ai技术增长的博客 248

linux内核 dev_info函数解析

https://blog.youkuaiyun.com/adaptiver/article/details/12789479

ask_true的博客 4971

(持续更新中!)详解【计算机类&面试真题】军队文职考试 ——第一期(真题+解析)| TCP、UDP的区别;程序局部性;ICMP协议及主要功能;重定位所需的计算机硬件

在当今信息化时代,军队中对于计算机专业人才的需求与日俱增。因此,了解面试和复试中常见的问题和要求对于准备应聘者来说至关重要。本文将围绕面试的准备要点、常见问题以及面试技巧进行探讨,并提供一些建议和经验。通过了解面试和复试的准备要点、常见问题以及技巧,读者将能够提升应对能力和成功率。本文为准备军队文职面试和计划考研复试的读者提供了有价值的参考和指导。通过阅读本篇博客,读者将能够获得关于军队文职计算机类面试和计算机考研复试的全面了解,提升自身的应对能力和成功率。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1687

Linux内核调试之printk()变形 dev_info、dev_dbg、dev_err

目前在kernel驱动代码中,都不再建议直接使用printk直接添加打印信息,而是使用dev_info,dev_dbg,dev_err之类的函数代替。 注意:这三个函数声明于linux/include/linux/device.h 使用上述三个打印函数时打印信息格式如下 驱动模块的名字: + 具体的信息 如:在运行的linux系统设备上,插入鼠标,就会打印出鼠标的相关信息; [ 402.134068] input: USB Optical Mouse as /devices/soc0/soc/2100000

xuangelouzhu的博客 1万+

Palantir 凭什么两年涨 20 倍?深度解析解决 AI 幻觉的 “本体论“ 核心原理

本文深度解析了Palantir本体(Ontology)的核心原理及其在企业AI应用中的革命性价值。本体通过构建结构化的语义层与动态执行层,将企业分散的数字资产(数据集、虚拟表、模型)映射为现实世界的数字孪生,使大模型能够在**严格的业务规则与数据边界内**进行推理与决策,从而从架构层面彻底解决AI幻觉问题。这一技术架构不仅帮助Palantir实现股价两年增长20倍、市值突破4000亿美金的商业成功,更成为SAP、Salesforce等ERP巨头争相模仿的下一代企业智能标准范式。通过航空业飞机故障应急处理等实

program哲学 217

Android 车联网——CarAudioService介绍(六)

CarAudioService 是 Android Automotive OS 中的一个重要组件,用于管理车辆中的音频功能。它是 Android Auto 的一部分,负责处理车辆音频的播放、控制和路由。CarAudioService 使用标准的 Android 组件架构,基于 Binder 通信机制,提供了一组 API,用于管理车辆音频。它包括以下主要功能:音频路由管理:CarAudioService 可以让开发者控制音频的路由,即将音频发送到不同的输出设备,例如车辆的扬声器、耳机等。

小旭的专栏 3199

嵌入式Linux C语言驱动开发进阶指南(20年专家经验倾囊相授)

掌握嵌入式 Linux 的 C 语言驱动开发核心技术,解决设备兼容与系统稳定性难题。涵盖字符设备、中断处理、DMA等关键设计方法,适用于工业控制、物联网等场景。20年专家实战经验总结,助你高效开发高效驱动,值得收藏。

CodePulse的博客 772

创新引入HAttention模块:提升YOLOv8小目标检测精度【YOLOv8】

YOLOv8在前几个版本的基础上进行了多项优化,特别是在模型的速度和精度上做了较大改进。改进的backbone:引入了更加高效的骨干网络(backbone)设计,如更深的网络层和更高效的特征提取模块。增强的Neck模块:使用了PANet等机制来更好地融合不同尺度的特征,增强了多尺度目标检测能力。增强的Head模块:包括多头检测头,以便针对不同大小的目标进行更精细的预测。尽管如此,YOLOv8仍面临着在小目标检测精度上不如大型目标的挑战,尤其在复杂背景或高密度目标环境下。

博客 2768

Linux终端原生Codex编程辅助:本地化、低侵入、上下文感知的AI编码实践

在Linux系统开发中,AI辅助编程正从图形界面IDE向终端原生能力演进。其核心在于将代码大模型(如CodeLlama)深度集成至bash/zsh、vim等原生工具链,实现上下文感知(自动读取git状态、Makefile、编译数据库)、低侵入集成(不改开发习惯,仅增快捷键与CLI命令)与离线可控(本地量化推理、无网络依赖)。这种方案显著降低机械性防御编程负担,提升C/内核模块等系统级开发的逻辑设计专注度,适用于嵌入式、驱动开发、安全敏感等强约束场景。

weixin_33801856的博客 224

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

内核动态调试输出dev_info, dev_dbg

dev_info, dev_dbg Linux 内核动态调试_代码撸起的博客-优快云博客_dev_info 输出

chenliang0224的专栏 1086

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

dev_info、dev_dbg、dev_err及动态调试

目前在kernel驱动代码中,都不再建议直接使用printk直接添加打印信息,而是使用dev_info,dev_dbg,dev_err之类的函数代替,虽然这些dev_xxx函数的本质还是使用printk打印的,但是相比起printk: 支持打印模块信息、dev信息 支持动态调试(dynamic debug)方式 下面简述下这几个dev_xxx函数的基本使用规则,以及动态调试使用方式。 dev_info(): 启动过程、或者模块加载过程等“通知类的”信息等,一般只会通知一次,例如probe函数; dev

一口Linux的专栏 1915

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

dev_info函数的打印会出现在dmesg日志中吗?

dev_info函数的打印信息不会出现在dmesg日志中。它通常用于在设备驱动程序中打印调试信息或提示性信息,并且这些信息通常会输出到核心消息缓冲区,而不是dmesg日志中。你可以使用printk函数或者pr_debug(),这样才会在dmesg里面看到输出。 ...

weixin_42601547的博客 574

Linux内核中dev_info、dev_dbg、dev_err及动态调试

目前在kernel驱动代码中,都不再建议直接使用printk直接添加打印信息,而是使用dev_info,dev_dbg,dev_err之类的函数代替,虽然这些dev_xxx函数的本质还是使...

Peter的专栏 3532

linux中dev_info函数,Linux驱动基础:dev,driver相关函数接口说明

下面以misc_register()函数为例,说明device相关的函数接口都在做什么。#include #include #include #include MODULE_AUTHOR("aaa");MODULE_DESCRIPTION("A gentle Hello World module");MODULE_LICENSE("GPL");static struct miscdevice te...

weixin_36098237的博客 1702

kernel中的日志打印

1.kernel中打印日志形式 (1)printk (2)pr_xxx (pr_debug支持动态打印) (3)dev_xxx (dev_dbg支持动态打印) (4)module_param_named (支持动态动态打印) 目前在kernel驱动代码中,不在建议直接使用printk直接添加打印信息,而是使用pr_debug、pr_info、dev_info、dev_dbg之类的函数替代,这些函数的本质还是printk打印,但相比具有以下优点: (1)支持打印模块信息、dev信息(指的是dev_xxx)

云淡风轻 4152

linux 驱动 dev_info,不大一般的LED驱动 - Linux驱动实践_Linux编程_Linux公社-Linux系统门户网站...

看了这么多内核代码,终于要自己开始做驱动了.按照由易到难,由浅入深的顺序,就从LED开始.LED驱动可以说是hello world之后最简单的驱动模块了.如果自己写一个LED驱动那是很简单的,其实用linux内核中的leds子系统来做也是比较简单的,内核中的leds子系统是将led抽象成platform_device,并有leds_class.这样,在/sys/class/leds/目录下面就可以...

weixin_42480812的博客 318

linux dev_info函数,FT_GetDeviceInfoList函数的用法

介绍FT_GetDeviceInfoList函数的用法、参数、返回值、注意事项、适用的操作系统环境、调用代码示例等。支持的操作系统LinuxMac OS X 10.4 以上版本Windows 2000 以上版本Windows CE 4.2 以上版本概述该函数返回设备信息列表,以及列表中包含的D2XX设备的数量。定义FT_STATUS FT_GetDeviceInfoList ( FT_DEVIC...

weixin_39909212的博客 1075

linux 查看input dev info

cat /proc/bus/input/devices

yiwuxue的专栏 1910
上一篇: 签了三十多本书,真心感谢每一位支持和帮助我的人
下一篇: 连海外同学都在找Yocto书籍!
嵌入式孙老师
博客等级 码龄7年 5686粉丝 898原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值