0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用TRACE_EVENT定义tracepoint的方式

嵌入式与Linux那些事 来源:嵌入式与Linux那些事 2023-03-05 13:44 次阅读

内核的各个子系统已经有大量的跟踪点,如果这些跟踪点无法满足工作中的需求,可以自己手动添加跟踪点。

添加跟踪点有两种方式,一种是仿照events/目录下的跟踪点,使用TRACE_EVENT() 宏添加。另一种是参考内核目录samples/trace_events添加。本文对这两种方式分别进行介绍。

使用 TRACE_EVENT 定义 tracepoint

我们仿照events/timer/timer_start,添加一个timer_stat的跟踪点,获取start_pid和slack参数

首先,需要在include/trace/events/timer.h头文件种添加名为timer_stat的跟踪点。

/**
*timer_stat-ftraceinterfacetimer_stat
*@timer:pointertostructtimer_list
*/
TRACE_EVENT(timer_stat,

TP_PROTO(structtimer_list*timer),

TP_ARGS(timer),

TP_STRUCT__entry(
__field(void*,timer)
__field(int,start_pid)
__field(int,slack)
),

TP_fast_assign(
__entry->timer=timer;
__entry->start_pid=timer->start_pid;
__entry->slack=timer->slack;
),

TP_printk("ftraceinterfacetimer_stat:timer=%ppid=%dslack=%d
",
__entry->timer,__entry->start_pid,__entry->slack)
);

TRACE_EVENT()宏如下

#defineTRACE_EVENT(name,proto,args,struct,assign,print)
DEFINE_TRACE(name)

name:表示跟踪点的名字,如上面的timer_stat。

proto:表示跟踪点调用的入参的原型,比如timer类型为struct timer_list *。

args:表示参数。

struct:定义跟踪器内部使用的__entry数据结构。

assign:把参数复制到__entry数据结构中。

print:定义输出的格式。

接着在kernel/kernel/time/timer.c debug_activate()添加trace_timer_stat()。

staticinlinevoid
debug_activate(structtimer_list*timer,unsignedlongexpires)
{
debug_timer_activate(timer);
trace_timer_start(timer,expires,timer->flags);
trace_timer_stat(timer);
}

重新编译内核后,烧写到设备中,即可看到sys节点已经有了新增的跟踪点。

e39c674e-bb10-11ed-bfe3-dac502259ad0.png

使能跟踪点后,查看trace点的输出。

e3da4168-bb10-11ed-bfe3-dac502259ad0.png

编译为独立的ko文件

内核还提供了一个跟踪点的例子,在samples/trace_events 目录下。

trace_event_init()创建内核线程一个名为event-sample内核线程。

staticint__inittrace_event_init(void)
{
simple_tsk=kthread_run(simple_thread,NULL,"event-sample");
if(IS_ERR(simple_tsk))
return-1;

return0;
}

kthread_should_stop()用于创建的线程检查结束标志,并决定是否退出。

staticintsimple_thread(void*arg)
{
intcnt=0;

while(!kthread_should_stop())
simple_thread_func(cnt++);

return0;
}

set_current_state() 来设置进程的状态,设置为TASK_INTERRUPTIBLE表示是可以被信号和wake_up()唤醒的,当信号到来时,进程会被设置为可运行。

schedule_timeout()将当前task调度出cpu,重新调度间隔为HZ。接着trace_开头的函数就会依次打印跟踪点的信息

staticvoidsimple_thread_func(intcnt)
{
intarray[6];
intlen=cnt%5;
inti;

set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(HZ);

for(i=0;i< len; i++)
  array[i] = i + 1;
 array[i] = 0;

 /* Silly tracepoints */
 trace_foo_bar("hello", cnt, array, random_strings[len],
        tsk_cpus_allowed(current));

 trace_foo_with_template_simple("HELLO", cnt);

 trace_foo_bar_with_cond("Some times print", cnt);

 trace_foo_with_template_cond("prints other times", cnt);

 trace_foo_with_template_print("I have to be different", cnt);
}

trace_foo_with_template_simple跟踪点的实现方式也是使用的TRACE_EVENT ()宏,这里不再赘述。

最后将文件编译为ko拷贝到设备上insmod后,即可看到sys目录下已经有新增的节点。

cd/home/zhongyi/code/rk3399_linux_release_v2.5.1_20210301/kernel/samples/trace_events
make-C/home/zhongyi/code/rk3399_linux_release_v2.5.1_20210301/kernel/M=$(pwd)modules
root@firefly:/sys/kernel/debug/tracing#catavailable_events|grepsample
sample-trace:foo_bar
sample-trace:foo_bar_with_cond
race:foo_bar_with_fn
sample-trace:foo_with_template_simple
sample-trace:foo_with_template_cond
sample-trace:foo_with_template_fn
sample-trace:foo_with_template_print
power:pstate_sample
root@firefly:/sys/kernel/debug/tracing#cdevents/sample-trace/
root@firefly:/sys/kernel/debug/tracing/events/sample-trace#ls
enablefoo_bar_with_condfoo_with_template_fn
filterfoo_bar_with_fnfoo_with_template_print
foo_barfoo_with_template_condfoo_with_templ_simple
root@firefly:/sys/kernel/debug/tracing/events/sample-trace#echo1>enable
root@firefly:/sys/kernel/debug/tracing/events/sample-trace#cat/sys/kernel/debug/tracing/trace
e42b1336-bb10-11ed-bfe3-dac502259ad0.png

TRACE_EVENT_CONDITION()

在某些情况下,跟踪点只有在某个条件发生时才会被调用,类似于

if(cond)
trace_foo();

TRACE_EVENT_CONDITION()宏就是这个作用,它和TRACE_EVENT()相比只是在参数中多加了一个cond条件。TP_CONDITION()会对条件做个判断。

TRACE_EVENT(name,proto,args,struct,assign,printk)
TRACE_EVENT_CONDITION(name,proto,args,cond,struct,assign,printk)

详细使用方法可以参考trace-events-sample.h。

TRACE_EVENT_FN()

TRACE_EVENT_FN()是在跟踪点使能前和使能后分别打印一些信息。相比于TRACE_EVENT(),TRACE_EVENT_FN()多了两个参数reg和unreg,

TRACE_EVENT(name,proto,args,struct,assign,printk)
TRACE_EVENT_FN(name,proto,args,struct,assign,printk,reg,unreg)

reg 和unreg原型为

voidreg(void)

reg函数在跟踪点使能前打印,unreg函数在跟踪点使能后打印。reg 和unreg可以根据实际情况置其中一个为NULL,也可以全部置为NULL。

详细使用方法可以参考trace-events-sample.h。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10442

    浏览量

    206564
  • Trace
    +关注

    关注

    0

    文章

    18

    浏览量

    10517
  • 跟踪器
    +关注

    关注

    0

    文章

    123

    浏览量

    19901

原文标题:ftrace(二)新增tracepoint

文章出处:【微信号:嵌入式与Linux那些事,微信公众号:嵌入式与Linux那些事】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    怎样通过trace生成系统cpu的loading图

    1)打开调度相关的的event:其他event一次类推[root@k8s-node2 ~]# echo 1 > /sys/kernel/debug/tracing/events/sched
    发表于 06-28 09:05

    浅析openat系统调用在arm64下的实现及使用原理

    1. 简介这篇文章主要介绍系统调用在arm64下的实现及使用原理,考虑到目前bpf在系统调试和调优工作中被大量使用,在文章的最后也简单介绍一下系统调用相关的bpf工具。系统调用在每个平台的实现方式
    发表于 06-02 17:48

    heap_trace_init_tohost 的 sysviewtrace_proc解析错误如何解决?

    event ID 463!或者代码:全选File "~/esp_app_trace/espytrace/sysview.py", line 368, in _read_payload
    发表于 03-02 06:15

    Trace thickness

    Trace thickness The thickness of a trace is usually .0014 per ounce of copper. Our standard material is 1/2 ounce copper that is plate
    发表于 12-29 09:20 1405次阅读

    TRACE32多核策略

      劳特巴赫的长期目标之一是促使TRACE32的硬件和软件尽可能灵活。各种内核组合、各种多核拓扑结构、各种多核操作方式,即使是最复杂的调试和跟踪的基础结构,均可由TRACE32支持。
    发表于 09-12 18:58 9次下载

    利用tracepoint梳理调度器框架及主要流程

    : $ sudo perf list | grep sched: sched:sched_kthread_stop [Tracepoint event] sched
    的头像 发表于 10-30 14:36 1929次阅读

    Trace - Deembed Files

    Trace - Deembed Files
    发表于 02-01 09:47 0次下载
    <b class='flag-5'>Trace</b> - Deembed Files

    劳特巴赫trace32使用介绍(一)

    劳德巴赫trace32使用介绍安装trace32使用带有光驱的电脑把光盘中的安装文件拷贝到u盘,然后就可以使用u盘安装了。打开文件夹,双击安装文件,一路next就可以安装成功了。trace32连接
    发表于 12-28 19:22 13次下载
    劳特巴赫<b class='flag-5'>trace</b>32使用介绍(一)

    ThreadX(八)------事件集Event

    事件集Event
    发表于 12-28 19:26 9次下载
    ThreadX(八)------事件集<b class='flag-5'>Event</b>

    ThreadX(四)------TraceX使用

    TraceX使用简介TraceX 软件生成跟踪bufTrace APItx_trace_enabletx_trace_enabletx_trace_event_filtertx_trace_event_unfiltertx_trace_disabletx_trace_isr_enter_inserttx_trace_isr
    发表于 12-28 19:33 1次下载
    ThreadX(四)------TraceX使用

    Spring Event对解耦业务的重要性

    Spring Event(Application Event)其实就是一个观察者设计模式,一个 Bean 处理完成任务后希望通知其它 Bean 或者说一个 Bean 想观察监听另一个Bean 的行为。
    发表于 07-25 10:12 431次阅读

    Systemverilog event的示例

    event是SystemVerilog语言中的一个强大特性,可以支持多个并发进程之间的同步。
    的头像 发表于 10-17 10:21 1092次阅读

    Ftrace使用tracefs文件系统保存控制文件

    Ftrace是Linux Kernel的官方tracing系统,支持Function trace、静态tracepoint、动态Tracepoint的跟踪,还提供各种Tracer,用于统计最大irq延迟、最大函数调用栈大小、调度
    的头像 发表于 02-22 14:34 867次阅读

    Trace功能的添加、组态及测试

    本节为工程添加Trace曲线,在Trace中配置Diagram,并为每个Diagram组态变量监控。 具体操作介绍 1.在Application下添加Object,选择Trace。添加Trac
    发表于 03-08 14:42 587次阅读

    如何对基于μTraceTrace32的LPC86x进行边界扫描

    电子发烧友网站提供《如何对基于μTraceTrace32的LPC86x进行边界扫描.pdf》资料免费下载
    发表于 08-17 10:22 4次下载
    如何对基于μ<b class='flag-5'>Trace</b>和<b class='flag-5'>Trace</b>32的LPC86x进行边界扫描