支持作者,点击京东购买作者创作书籍《Yocto项目实战教程:高效定制嵌入式Linux系统》
作者:嵌入式 Jerry
适用对象:Linux 驱动开发者 / 内核调试人员 / 自己写驱动需要打点分析行为者
一、为什么需要 trace_printk()
如果你是驱动开发者,遇到如下场景:
- 想知道一个内部流程是否被调用
- 想控制性地打印输出一些状态
- 想输出进 ftrace buffer 而不是 dmesg
那么,你需要的就是:
trace_printk()
trace_printk()
是 ftrace 提供的一个无需控制台、无需 printk buffer,直接展示在 ftrace buffer 中的低开销打印 API
二、基础使用示例:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/tracepoint.h>
#define TRACE_TAG "gpu-dvfs"
#define TRACE_MSG(msg, ...) trace_printk("[%s] " msg "\n", TRACE_TAG, ##__VA_ARGS__)
static void sub_task(void)
{
TRACE_MSG("sub_task: begin");
mdelay(10);
TRACE_MSG("sub_task: end");
}
static int __init trace_demo_init(void)
{
TRACE_MSG("module init");
sub_task();
TRACE_MSG("module ready");
return 0;
}
static void __exit trace_demo_exit(void)
{
TRACE_MSG("module exit");
}
module_init(trace_demo_init);
module_exit(trace_demo_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jerry");
MODULE_DESCRIPTION("Trace printk example module");
三、实操流程
1. 编译 Makefile:
obj-m := trace_demo.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
2. 加载模块:
insmod trace_demo.ko
3. 启用 tracing:
mount -t debugfs none /sys/kernel/debug
cd /sys/kernel/debug/tracing
echo 1 > tracing_on
echo > trace
4. 卸载模块:
rmmod trace_demo
5. 查看 trace buffer:
cat trace | grep gpu-dvfs
输出示例:
<idle>-0 [000] .... [gpu-dvfs] module init
<idle>-0 [000] .... [gpu-dvfs] sub_task: begin
<idle>-0 [000] .... [gpu-dvfs] sub_task: end
<idle>-0 [000] .... [gpu-dvfs] module ready
<idle>-0 [000] .... [gpu-dvfs] module exit
四、配合 function tracer 规范化
trace_printk 最好配合内核调用系统使用:
- 根据使用场景,定点 trace
- 配合
echo xyz > set_ftrace_filter
限制函数 - 不要写成 printk 形式跟踪无限重复
五、trace_printk vs printk 区别
特性 | printk | trace_printk |
---|---|---|
输出目标 | console + dmesg | ftrace buffer only |
性能较程 | 可能阻塞性 | 极低延迟 |
共享通道 | 用户端可观察 | 调试时期给开发者使用 |
无需调试操作 | 否 | 是 |
六、程序经验分析
适用场景:
- 有本地设备的 BSP 调试
- 需要分析 probe/init 流程
- 想输出定点日志,但不想打过滤后 dmesg
- 配合
trace-cmd
进行 timeline 分析
七、软件经验总结
- 在需要的时间节点输出 trace 日志
- 有别于 printk,完全分开 trace 和系统 log
- 使用 grep/调用链分析时帮助极大
支持作者,点击京东购买作者创作书籍《Yocto项目实战教程:高效定制嵌入式Linux系统》