内核调试打印内容

直接结构体名字 加地址  前提是知道地址。   struct slab ffffffff8116ed24

mod -s nnnn ./nnnn.ko 加载模块自己的模块

#12 [ffff881064c1bbd8] rpc_run_task at ffffffffa0567475 [sunrpc]
#13 [ffff881064c1bbf8] at ffffffffa0797391 [enfs]
#14 [ffff881064c1bd28] at ffffffffa079219d [enfs]
#15 [ffff881064c1be08] at ffffffffa07a9479 [enfs]
#16 [ffff881064c1be48]  at ffffffffa0791371 [enfs]
at是函数返回执行地址。

dis -l ffffffffa079219d 能直接打印代码位置。

### 关于内核调试打印的方法 在Linux内核开发过程中,`printk` 是最常用的工具之一,用于记录和显示调试信息。它能够帮助开发者追踪程序运行状态、捕获错误以及分析性能瓶颈。 #### 使用 `printk` 进行内核调试 `printk` 提供了一种机制来向内核日志缓冲区写入消息,并可以通过不同的优先级标签控制输出行为。其基本语法如下所示[^1]: ```c #include <linux/kernel.h> printk(KERN_INFO "Your debug message\n"); ``` 其中,`KERN_INFO` 表示该条目的优先级为信息级别。其他可用的日志级别包括但不限于: - `KERN_EMERG`: 紧急情况 - `KERN_ALERT`: 需要立即采取行动的情况 - `KERN_CRIT`: 临界条件 - `KERN_ERR`: 错误条件 - `KERN_WARNING`: 警告条件 - `KERN_NOTICE`: 正常但重要的状况 - `KERN_DEBUG`: 调试级别的信息 这些前缀决定了消息的重要程度并影响它们是否会被实际输出到终端或保存至环形缓冲区内存中。 #### 动态开关日志功能 为了更灵活地管理哪些部分应该启用详细的诊断数据采集,在某些场景下可能希望仅当特定条件下才激活冗长模式下的报告工作流。为此提供了一个基于模块参数实现方案[^3]: ```c static unsigned my_debug = 0; module_param(my_debug, uint, 0644); #define my_printk(dev, format, ...) \ do { \ if (my_debug) { \ dev_printk(KERN_INFO, dev, format, ##__VA_ARGS__); \ } \ } while(0) ``` 上述代码片段展示了如何创建一个可配置的布尔标志 (`my_debug`) 来决定何时调用自定义版的 `dev_printk()` 宏命令;只有当全局变量 `my_debug` 设置成非零值的时候才会真正触发内部逻辑分支里的操作序列——即把格式化字符串连同变参列表一起传递给标准库函数完成最终渲染过程。 此外还有一种更为高级的形式允许附加更多上下文元数据比如当前所在源码位置标记等细节内容以便后续排查定位问题更加便捷高效[^4]. 最后值得注意的是系统启动阶段也可以预先指定全局性的过滤策略从而限定只接收满足一定严重度阈值以上的事件通知而已[^5]. 修改引导选项中的 loglevel 参数就可以达到这样的效果: ``` loglevel=4 # 对应 KERN_WARNING 和以上级别的消息将会被保留下来。 ``` 通过这种方式可以有效减少不必要的干扰项数量进而提升整体可观测体验质量水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值