最近,我正在跟踪 Linux 内核中的 io_uring。我发现在io_uring.ctrace_io_uring_submit_sqe
中调用了一个函数。通过在 Github 镜像仓库或elixir.bootlin上搜索符号,我找不到它的定义。有没有其他方法可以找到它,或者它根本不存在?
1 回答
此符号是使用宏动态创建的,这就是您在源代码中找不到它的原因。
文件trace/events/io_uring.h包含在第 84 行,它包含以下宏的用法TRACE_EVENT
:
TRACE_EVENT(io_uring_submit_sqe, //(...more code)
该TRACE_EVENT
宏在linux/tracepoint.h中使用另一个宏定义,DECLARE_TRACE
. DECLARE_TRACE
在第 418 行的同一文件中定义,并根据第 162 行的宏的值在第241行或第341__DECLARE_TRACE
行再次使用在同一文件中定义的。TRACEPOINTS_ENABLED
__DECLARE_TRACE
宏开始于:
#define __DECLARE_TRACE(name, proto, args, cond, data_proto) \
extern int __traceiter_##name(data_proto); \
DECLARE_STATIC_CALL(tp_func_##name, __traceiter_##name); \
extern struct tracepoint __tracepoint_##name; \
static inline void trace_##name(proto) \
//(... more code)
这一行具体:
static inline void trace_##name(proto)
扩展为一个函数的声明,该static inline void
函数的名称是name
从前面传递TRACE_EVENT
的前缀trace_
(##
用于宏中的字符串连接),在您的情况下,这会导致名称为trace_io_uring_submit_sqe
.
在这里您可以找到追踪文档。
如何使用宏识别动态代码生成?
如果您查看整个io_uring.c
文件,您会发现一些函数的名称遵循trace_ + some_function
. 同时,在源代码中都找不到它们。这通常意味着这些符号是使用宏生成的。在这种情况下,您可以尝试寻找公共前缀而不是整个符号。trace_
如果您在 github 上搜索,您会发现多个类似的宏,这些宏可以让您了解正在发生的事情。