linux tracepoint用法【转】

时间:2023-03-09 07:33:52
linux tracepoint用法【转】

转自:https://blog.csdn.net/u014089131/article/details/73907995

在kernel中经常会看到trace_XX形式的函数,但是又找不到它的定义。
这个其实是kernel的tracepoint,定义在include/linux/tracepoint.h中。 #define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
extern struct tracepoint __tracepoint_##name;
\
static inline void trace_##name(proto)
\
{ \
if (static_key_false(&__tracepoint_##name.key))
\
__DO_TRACE(&__tracepoint_##name,
\
TP_PROTO(data_proto),
\
TP_ARGS(data_args),
\
TP_CONDITION(cond),,);
\
} \
__DECLARE_TRACE_RCU(name, PARAMS(proto), PARAMS(args),
\
PARAMS(cond), PARAMS(data_proto), PARAMS(data_args))
\
static inline int
\
register_trace_##name(void (*probe)(data_proto), void *data)
\
{ \
return tracepoint_probe_register(#name, (void *)probe,
\
data); \
} \
static inline int
\
unregister_trace_##name(void (*probe)(data_proto), void *data)
\
{ \
return tracepoint_probe_unregister(#name, (void *)probe, \
data); \
} \
static inline void
\
check_trace_callback_type_##name(void (*cb)(data_proto))
\
{ \
} \
static inline bool
\
trace_##name##_enabled(void)
\
{ \
return static_key_false(&__tracepoint_##name.key);
\
}
这些trace_开头的函数是由上面这个宏来定义的。
trace_要想起作用,需要调用register_trace_##name,给他关联一个probe函数,
当调用trace_时就执行probe函数,否则这个trace_不会起实际作用。