ftrace学习 —— user_events的用法

发布时间 2023-06-11 17:09:37作者: 摩斯电码

参考

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__));

比如以下面的代码为例:

	struct user_reg reg = {0};
	struct user_unreg unreg = {0};

	reg.size = sizeof(reg);
	reg.name_args = (__u64)"__test_event u32 field1; u32 field2";
	reg.enable_bit = 31;
	reg.enable_addr = (__u64)&self->check;
	reg.enable_size = sizeof(self->check);