linux ftrace追踪一(基本技术结构粗略剖析)


一   文档说明

本文为2.6.32下trace机制(以下简称trace)的调研文档。trace实现的基础为tracepoint机制,存放数据的缓存实现为ring buffer。

阅读代码路径:

samples/tracepoints

kernel/trace

include/trace

二   tracepoint

tracepoint是实现ftrace架构的基础。在内核代码路径samples/tracepoint下对tracepoint有个简单的实例。

struct tracepoint {

       constchar *name;          /* Tracepoint name */

       intstate;                /* State. */

       void(*regfunc)(void);

       void(*unregfunc)(void);

       void**funcs;

} __attribute__((aligned(32)));

2.1 两个宏定义

这两个宏传递的name是一致的。

2.1.1   DEFINE_TRACE(name);

该宏定义如下:

#define DEFINE_TRACE_FN(name, reg,unreg)                            \

       staticconst char __tpstrtab_##name[]                        \

       __attribute__((section("__tracepoints_strings")))= #name; \

       structtracepoint __tracepoint_##name                       \

       __attribute__((section("__tracepoints"),aligned(32))) =     \

              {__tpstrtab_##name, 0, reg, unreg, NULL }

 

#define DEFINE_TRACE(name)                                     \

    DEFINE_TRACE_FN(name, NULL,NULL);

在内核初始化时分配了__tracepoints_strings,__tracepoints这两个section。当利用DEFINE_TRACE定义一个tracepoint后,整个内核将可以看到该tracepoint。

2.1.2   DECLARE_TRACE(name, proto, args)

#define DECLARE_TRACE(name, proto,args)                       \

       externstruct tracepoint __tracepoint_##name;                   \

       staticinline void trace_##name(proto)                       \

       {                                                      \

              if(unlikely(__tracepoint_##name.state))             \

                     __DO_TRACE(&__tracepoint_##name,             \

                            TP_PROTO(proto),TP_ARGS(args));  \

       }                                                      \

       staticinline int register_trace_##name(void (*probe)(proto))     \

       {                                                      \

              returntracepoint_probe_register(#name, (void *)probe);    \

       }                                                      \

       staticinline int unregister_trace_##name(void (*probe)(proto))  \

       {                                                      \

              returntracepoint_probe_unregister(#name, (void *)probe);\

           }

       该宏定义了三个函数:

       trace_##name:放在想抓trace的代码路径中。

       register_trace_##name:注册一个钩子函数,这个钩子函数在trace_##name执行的时候被调用。

       unregister_trace_##name:注销一个钩子函数。

2.2钩子函数是怎样被注册的

当用以上两个宏定义并声明了一个tracepoint之后,在抓取trace之前调用上文的register_trace_##name函数,完成钩子函数的注册。但是如果仅仅是注册了针对某一个tracepoint的钩子函数,目前内核中的处理是更新内核中目前所有的tracepoint。感觉这一点是不合理的。

函数原型:int tracepoint_probe_register(const char *name, void *probe)

tracepoint钩子函数的注册与撤销是通过一个哈希表来维护的。当注册或撤销钩子函数结束后,同步到tracepoint中。至于这个哈希表和tracepoint的联系完全依赖于定义tracepoint时的名字。在哈希表中存放的数据结构:

struct tracepoint_entry {

       structhlist_node hlist;

       void**funcs;

       intrefcount;    /* Number of times armed. 0

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中有两个常用的跟踪工具,分别是strace和ftrace。 strace是一个用户空间的跟踪工具,它可以追踪和记录应用程序的系统调用和信号。通过strace,我们可以了解应用程序在执行过程中与操作系统之间的交互,包括文件操作、网络通信、进程管理等。strace可以帮助开发人员调试和分析应用程序的问题,定位性能瓶颈和错误。 ftraceLinux内核提供的跟踪工具,用于追踪内核中的函数调用和事件。它是内建于Linux内核中的,可以通过配置内核选项来启用和配置。ftrace提供了多个跟踪器,用于不同的场景,比如跟踪函数调用、上下文切换、中断关闭时长等。通过ftrace,我们可以深入了解内核的执行流程和性能瓶颈,帮助开发人员进行内核调试和性能优化。 总结来说,strace用于跟踪用户空间应用程序的系统调用和信号,而ftrace用于跟踪内核中的函数调用和事件。它们都是在Linux系统中进行高级性能分析和调试的重要工具。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [Linux 追踪技术 ftrace 简介(一)](https://blog.csdn.net/weixin_45030965/article/details/125738911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] - *3* [Linux:内核调试方法之strace ,ltrace, ptrace, ftrace, sysrq](https://blog.csdn.net/hhd1988/article/details/129562459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值