北京哪有治白癜风的医院 http://m.39.net/pf/a_4781959.htmlTraceEvent是内核中一种探测的机制,据说在不使能的时候是没有损耗的。据说使用起来挺简单,但是要看懂着实需要花些力气。
例子
从例子中学习,一般都是比较好的方法。内核开发者也比较nice,在内核源码samples/trace_events目录下就有这么一个例子。
其中文件一共有三个:
这个例子以内核模块的形式存在,所以只要执行make就可以编译完成。
总的来说,要定义和使用tracepoint,只要做两点。
用TRACE_EVENT来定义一个新的tracepoint
在需要的地方,使用函数trace_XXX打印输出
有了例子我们就要跑一跑,来看看如何使用的。
首先我们要编译出我们的例子,这时候需要加上打开两个编译配置
CONFIG_SAMPLES
CONFIGSAMPLETRACE_EVENTS
编译
makeM=samples/trace_events
然后加载这个例子模块
modprobetrace-events-sample
因为用户接口在debugfs上,所以还要确保debugfs挂载了。
mount-tdebugfsnone/sys/kernel/debug/
此时我们就能在/sys/kernel/debug/tracing/events/sample-trace/目录下看到该模块创建好的traceevent了。
接下来,我们就可以打开这个探测时间,并且查看探测的输出了。
cd/sys/kernel/debug/tracing
echo1events/sample-trace/enable
cattrace
echo0events/sample-trace/enable
通过cattrace观察,可以看出系统运行时的一些状态。
让我们进一步再来看看events/sample-trace这个目录:
可以看到
目录名称sample-trace由TRACE_SYSTEM这个宏定义,所以通过查找这个宏,就能知道有多少events的大类
每一个TRACE_EVENT都有一个自己的目录
源文件中trace_XXX的函数就是执行探测记录的地方了。那么这些函数是怎么定义的呢?
TRACE_EVENT定义
看完了例子,我们就该看代码实现了。讲真,这是我见过的最长的宏展开了。之前在qemu上看到的那个hmp-