参考
https://docs.kernel.org/trace/user_events.html
测试程序
samples/user_events/example.c
tools/testing/selftests/user_events/ftrace_test.c
正文
通过user_event可以实现对应用程序的跟踪,类似linux内核中的tracepoint那样。相似的方法还有借助/sys/kernel/debug/tracing/trace_marker
,不过,user_event提供的方法功能更加强大,可以配合perf等工具使用。
要使用user_event,大致要经过:注册、使能跟踪、写入跟踪信息、读取跟踪信息、关闭跟踪、反注册、删除。需要用到的文件节点主要是:/sys/kernel/tracing/user_events_data
。
注册和反注册
注册阶段用到的结构体是user_reg:
struct user_reg {
/* Input:固定为sizeof(user_reg)*/
__u32 size;
/* Input: 使用下面的enable_addr的哪个bit来显示使能状态 */
__u8 enable_bit;
/* Input: 下面的enable_addr的字节长度,4或者8 */
__u8 enable_size;
/* Input: 目前还用不到,设置为0即可 */
__u16 flags;
/* Input: 应用通过这个地址来查看该user_event事件是否使能*/
__u64 enable_addr;
/* Input: 事件描述信息*/
__u64 name_args;
/* Output: 应用通过该事件索引向内核中写入事件内容 */
__u32 write_index;
} __attribute__((__packed__));
反注册用到的结构体是:
struct user_unreg {
/* Input: 固定为sizeof(user_unreg) */
__u32 size;
/* Input: Bit to unregister */
__u8 disable_bit;
/* Input: Reserved, set to 0 */
__u8 __reserved;
/* Input: Reserved, set to 0 */
__u16 __reserved2;
/* Input: Address to unregister */
__u64 disable_addr;
} __attribute__((__packed__));
比如以下面的代码为例:
// 这两个结构体必须初始化为0
struct user_reg reg = {0};
struct user_unreg unreg = {0};
u32 check;
reg.size = sizeof(reg);
reg.name_args = (__u64)"__test_event0 u32 id; u32 age; char type; char[32] name";
reg.enable_bit = 31; // 通过check的bit31来查看使能状态
reg.enable_addr = (__u64)✓
reg.enable_size = sizeof(check);
unreg.size = sizeof(unreg);
unreg.disable_bit = 31;
unreg.disable_addr = (__u64)✓
reg.size = sizeof(reg);
reg.name_args = (__u64)"__test_event1 u32 id";
reg.enable_bit = 30; // 通过check的bit30来查看使能状态
reg.enable_addr = (__u64)check;
reg.enable_size = sizeof(check);
unreg.size = sizeof(unreg);
unreg.disable_bit = 30;
unreg.disable_addr = (__u64)✓
标签:__,ftrace,events,unreg,enable,user,Input,reg
From: https://www.cnblogs.com/pengdonglin137/p/17473199.html