ftrace 全面入门和实战指南 (Part 2 - 为内核代码添加专用 trace 点)

支持作者,点击京东购买作者创作书籍《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 区别

特性printktrace_printk
输出目标console + dmesgftrace buffer only
性能较程可能阻塞性极低延迟
共享通道用户端可观察调试时期给开发者使用
无需调试操作

六、程序经验分析

适用场景:

  • 有本地设备的 BSP 调试
  • 需要分析 probe/init 流程
  • 想输出定点日志,但不想打过滤后 dmesg
  • 配合 trace-cmd 进行 timeline 分析

七、软件经验总结

  • 在需要的时间节点输出 trace 日志
  • 有别于 printk,完全分开 trace 和系统 log
  • 使用 grep/调用链分析时帮助极大

支持作者,点击京东购买作者创作书籍《Yocto项目实战教程:高效定制嵌入式Linux系统》


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值