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

printk 使用技巧

1. 基本语法与日志级别

// 指定日志级别
printk(KERN_EMERG   "System is unusable\n");
printk(KERN_ALERT   "Action must be taken immediately\n");
printk(KERN_CRIT    "Critical conditions\n");
printk(KERN_ERR     "Error conditions\n");
printk(KERN_WARNING "Warning conditions\n");
printk(KERN_NOTICE  "Normal but significant condition\n");
printk(KERN_INFO    "Informational\n");
printk(KERN_DEBUG   "Debug-level messages\n");// 简写形式(推荐)
pr_emerg("System is unusable\n");
pr_alert("Action must be taken immediately\n");
pr_crit("Critical conditions\n");
pr_err("Error conditions\n");
pr_warn("Warning conditions\n");
pr_notice("Normal but significant condition\n");
pr_info("Informational\n");
pr_debug("Debug-level messages\n");

2. 格式化输出技巧

// 基本格式化
printk(KERN_INFO "Value: %d, String: %s, Pointer: %p\n", value, str, ptr);// 内核专用格式化符
printk(KERN_INFO "IP address: %pI4\n", &ipv4_addr);    // IPv4地址
printk(KERN_INFO "MAC address: %pM\n", mac_addr);      // MAC地址
printk(KERN_INFO "Symbol: %pS\n", function_ptr);       // 符号名
printk(KERN_INFO "Physical address: %pa\n", &phys_addr);// 物理地址// 结构体输出
struct device *dev = ...;
printk(KERN_INFO "Device: %s\n", dev_name(dev));

3. 条件打印与频率限制

#include <linux/ratelimit.h>// 频率限制打印
if (printk_ratelimit()) {printk(KERN_ERR "Rate limited error message\n");
}// 更精细的频率控制
static DEFINE_RATELIMIT_STATE(my_rs, HZ, 10); // 每秒最多10条if (__ratelimit(&my_rs)) {printk(KERN_INFO "Custom rate limited message\n");
}// 条件编译的调试信息
#ifdef DEBUG
#define dbg_printk(fmt, ...) printk(KERN_DEBUG fmt, ##__VA_ARGS__)
#else
#define dbg_printk(fmt, ...) do {} while (0)
#endif

4. 动态调试控制

// 使用动态调试
pr_debug("This can be enabled/disabled at runtime\n");// 条件调试
if (unlikely(debug_enabled)) {printk(KERN_DEBUG "Debug info: value=%d\n", some_value);
}// 一次性警告
#define WARN_ONCE(condition, format...) ({         \static bool __warned;                          \if (condition && !__warned) {                  \__warned = true;                           \printk(KERN_WARNING format);               \}                                              \
})

5. 性能优化技巧

// 避免在热路径中使用 printk
// ❌ 不好的做法
for (i = 0; i < 1000000; i++) {printk(KERN_DEBUG "Iteration %d\n", i);  // 严重影响性能
}// ✅ 好的做法
#ifdef DEBUG
if (i % 1000 == 0) {  // 每1000次打印一次printk(KERN_DEBUG "Progress: %d iterations\n", i);
}
#endif// 使用 pr_cont 避免多行日志的分裂
printk(KERN_INFO "Long message part 1");
pr_cont(" part 2");
pr_cont(" part 3\n");

6. 上下文相关的打印

// 进程上下文
printk(KERN_INFO "Process %s[%d] called\n", current->comm, current->pid);// 中断上下文 - 注意不能睡眠!
printk(KERN_INFO "Interrupt occurred, irq: %d\n", irq);// 在可能睡眠的地方避免 printk
if (!in_interrupt()) {printk(KERN_INFO "Safe to print in process context\n");
}

7. 日志缓冲区管理

// 检查控制台日志级别
extern int console_loglevel;// 动态调整日志级别
echo "8" > /proc/sys/kernel/printk  # 提高控制台日志级别
echo "1" > /proc/sys/kernel/printk  # 降低控制台日志级别// 内核启动参数控制
loglevel=8        # 设置默认控制台日志级别
debug             # 启用调试信息
quiet             # 减少启动信息

8. 调试宏与包装函数

// 自定义调试宏
#define MY_DEBUG 1#if MY_DEBUG
#define my_debug(fmt, ...) \printk(KERN_DEBUG "%s:%d: " fmt, __func__, __LINE__, ##__VA_ARGS__)
#else
#define my_debug(fmt, ...) 
#endif// 错误处理包装
int my_function(void *data)
{if (!data) {pr_err("NULL pointer passed to %s\n", __func__);return -EINVAL;}my_debug("Processing data at %p\n", data);// ... 函数逻辑return 0;
}
http://www.dtcms.com/a/478669.html

相关文章:

  • 深度学习入门(六)——模块、正则化与工程调优全解析
  • python高级05——HTTP协议和静态服务器
  • 现在网站一般做多大的南沙网站建设哪家好
  • 使用Mathematica做Lorenz系统的稳定性分析
  • centos升级redis至最新版(绿色版)
  • 做logo宣传语的网站电影网页设计素材
  • 从C++开始的编程生活(11)——string类基本语法和string类的基本实现
  • 南宁网站建设策划外包培训机构营销方案
  • 建站用什么搭建比较好网站后台是什么
  • 官方网站开发与定制广州网道营销广告有限公司
  • 设置 windows nginx.exe 每天 重启
  • 优先级队列(堆)-703.数据流中的最大值-力扣(LeetCode)
  • 亚马逊自养号测评新手从零起步:环境搭建全流程指南
  • 数据结构_栈和队列
  • 江苏优化网站关键词wordpress子域
  • 怎么用Visio studio做网站北京网页网站设计制作
  • html css网页制作成品——HTML+CSS盐津铺子网页设计(5页)附源码
  • 网站编辑简历网站建设域名什么意思
  • 如何做网站内链优化个人网站建设咨询电话
  • 网站色彩搭配原则拼多多 wordpress
  • 网站建站网站设计公司深圳网站建设 龙华信科
  • 花瓣网是仿国外那个网站做的深圳全网营销方案
  • 网站首页引导页 模版网站制作类软件推荐
  • 【LeetCode】71. 简化路径
  • 基于 go 的分布式缓存
  • 网站建设合同要求黄冈做网站公司
  • 封装的实现和定义
  • 【Android Gradle学习笔记】第三天:Gradle Task
  • 网站建设哪家学校好php网站开发环境一
  • 汽车4G车载TBOX智能信息终端