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
; tracepoint
bpf 代码里获取__data_loc
的方法:char *msg = (void *)(__u64) ((void *) ctx + (__u64) ((ctx->msg) & 0xFFFF));
。
一切尽在源代码里,只是源代码并不好看明白。
文章作者 Leon Hwang
上次更新 2024-04-05