2

最近,我正在跟踪 Linux 内核中的 io_uring。我发现在io_uring.ctrace_io_uring_submit_sqe中调用了一个函数。通过在 Github 镜像仓库或elixir.bootlin上搜索符号,我找不到它的定义。有没有其他方法可以找到它,或者它根本不存在?

4

1 回答 1

3

此符号是使用宏动态创建的,这就是您在源代码中找不到它的原因。

文件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 上搜索,您会发现多个类似的宏,这些宏可以让您了解正在发生的事情。

于 2021-08-20T08:35:20.767 回答