eBPF Talk: tracepoint __data_loc
文章目录
书接上回:eBPF Talk: trace tracepoint 程序,本文将介绍在 bpf 里如何处理 tracepoint 中 __data_loc 描述的字段。
关于 tracepoint __data_loc 的资料超级少,网络上能找到的资料如下:
- tracepoint arguments are missing __data_loc char strings
- tracepoint: Support __data_loc fields in tracepoints
不过,我深入研究了一下 kernel 里相关的源代码,发现了 __data_loc 的秘密。
tracepoint 中 string 类型的参数定义
P.S. 本文以 netlink:netlink_extack 为例。
|
|
由上 tracepoint 的定义可知:
tracepoint的原型包括const char *msg参数;tracepoint的参数是msg;tracepoint的 entry struct 里有一个__string类型的msg字段;tracepoint使用 “msg=%s” 进行输出。
__string 类型
__string 类型的定义如下:
|
|
其中使用了 __data_loc 前缀。
__get_str() 宏
__get_str() 的定义如下:
|
|
tracepoint bpf 代码里获取 __data_loc 的方法
参考 __get_str() 的定义,tracepoint bpf 代码里获取 __data_loc 的方法如下:
|
|
小结
tracepoint中 string 类型的参数定义:__string(msg, msg);- 实际上是
__data_loc_msg字段; - 用
bpftrace -lv命令查看:__data_loc char[] msg; tracepointbpf 代码里获取__data_loc的方法:char *msg = (void *)(__u64) ((void *) ctx + (__u64) ((ctx->msg) & 0xFFFF));。
一切尽在源代码里,只是源代码并不好看明白。
文章作者 Leon Hwang
上次更新 2024-04-05