trace mechanism in linux

一:tracing目录文件以及创建的代码
root@memory-153:/sys/kernel/debug/tracing# ls
available_events            options              stack_trace_filter
available_filter_functions  per_cpu              trace
available_tracers           printk_formats       trace_clock
buffer_size_kb              README               trace_marker
buffer_total_size_kb        saved_cmdlines       trace_options
current_tracer              saved_cmdlines_size  trace_pipe
dyn_ftrace_total_info       set_event            trace_stat
enabled_functions           set_ftrace_filter    tracing_cpumask
events                      set_ftrace_notrace   tracing_max_latency
free_buffer                 set_ftrace_pid       tracing_on
function_profile_enabled    set_graph_function   tracing_thresh
instances                   set_graph_notrace    uprobe_events
kprobe_events               snapshot             uprobe_profile
kprobe_profile              stack_max_size
max_graph_depth             stack_trace

root@memory-153:/sys/kernel/debug/tracing# cat /boot/System.map-3.12.1 | grep trace | grep __initcall
ffffffff81e482d0 t __initcall_trace_init_flags_sys_exitearly
ffffffff81e482d8 t __initcall_trace_init_flags_sys_enterearly
ffffffff81e482e8 t __initcall_register_trigger_all_cpu_backtraceearly
ffffffff81e48348 t __initcall_tracer_alloc_buffersearly
ffffffff81e48358 t __initcall_init_trace_printkearly
ffffffff81e48360 t __initcall_event_trace_memsetupearly
ffffffff81e48368 t __initcall_init_ftrace_syscallsearly
ffffffff81e48410 t __initcall_ftrace_mod_cmd_init1
ffffffff81e48418 t __initcall_init_function_trace1
ffffffff81e48420 t __initcall_init_wakeup_tracer1
ffffffff81e48428 t __initcall_init_graph_trace1
ffffffff81e48430 t __initcall_event_trace_enable1
ffffffff81e48978 t __initcall_ftrace_init_debugfs5
ffffffff81e48980 t __initcall_tracer_init_debugfs5
ffffffff81e48988 t __initcall_init_trace_printk_function_export5
ffffffff81e48998 t __initcall_event_trace_init5
ffffffff81e489a0 t __initcall_init_kprobe_trace5
ffffffff81e489a8 t __initcall_init_uprobe_trace5
ffffffff81e48c10 t __initcall_init_tracepoints6
ffffffff81e48c20 t __initcall_stack_trace_init6
ffffffff81e48c28 t __initcall_init_mmio_trace6
ffffffff81e48c30 t __initcall_init_blk_tracer6
ffffffff81e494a8 t __initcall_clear_boot_tracer7
ffffffff81e494b0 t __initcall_kdb_ftrace_register7


ftrace_init_debugfs 7
available_filter_functions enabled_functions set_ftrace_filter
set_ftrace_notrace set_graph_function set_ftrace_pid trace_stat function_profile_enabled

tracer_init_debugfs 20

tracing_cpumask trace_options trace trace_pipe buffer_size_kb buffer_total_size_kb free_buffer trace_marker trace_clock tracing_on snapshot per_cpu
available_tracers current_tracer tracing_max_latency tracing_thresh README saved_cmdlines dyn_ftrace_total_info instances options
 
init_trace_printk_function_export 1 printk_formats

event_trace_init 3
available_events set_event events

init_kprobe_trace 2
kprobe_events kprobe_profile

init_uprobe_trace 2
uprobe_events uprobe_profile

stack_trace_init 3
stack_max_size stack_trace stack_trace_filter

not found:
saved_cmdlines_size set_graph_notrace max_graph_depth

二:tracepoint, ftrace event, syscall trace
tracepoint

VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .;  \
*(__tracepoints_ptrs) /* Tracepoints: pointer array */\
VMLINUX_SYMBOL(__stop___tracepoints_ptrs) = .;  \
*(__tracepoints_strings)/* Tracepoints: strings */ \

tracepoint.h
#define DEFINE_TRACE_FN(name, reg, unreg)     \
 static const char __tpstrtab_##name[]     \
 __attribute__((section("__tracepoints_strings"))) = #name;  \
 struct tracepoint __tracepoint_##name     \
 __attribute__((section("__tracepoints"))) =    \
  { __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\
 static struct tracepoint * const __tracepoint_ptr_##name __used  \
 __attribute__((section("__tracepoints_ptrs"))) =   \
  &__tracepoint_##name;
  
 

ftrace event

trace_types  所有tracer链表
nop tracer
function_trace
wakeup_tracer
wakeup_rt_tracer
mmio_tracer
blk_tracer

vmlinux.lds.h
#define FTRACE_EVENTS() . = ALIGN(8);     \
   VMLINUX_SYMBOL(__start_ftrace_events) = .; \
   *(_ftrace_events)    \
   VMLINUX_SYMBOL(__stop_ftrace_events) = .;

ftrace.h   
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, call, proto, args, print)  \
         \
static const char print_fmt_##call[] = print;    \
         \
static struct ftrace_event_call __used event_##call = {   \
 .name   = #call,    \
 .class   = &event_class_##template,  \
 .event.funcs  = &ftrace_event_type_funcs_##call, \
 .print_fmt  = print_fmt_##call,   \
};         \
static struct ftrace_event_call __used     \
__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call

 

syscall trace

#define SYSCALL_TRACE_ENTER_EVENT(sname)    \
 static struct syscall_metadata __syscall_meta_##sname;  \
 static struct ftrace_event_call __used    \
   event_enter_##sname = {     \
  .name                   = "sys_enter"#sname,  \
  .class   = &event_class_syscall_enter, \
  .event.funcs            = &enter_syscall_print_funcs, \
  .data   = (void *)&__syscall_meta_##sname,\
  .flags   = TRACE_EVENT_FL_CAP_ANY, \
 };        \
 static struct ftrace_event_call __used    \
   __attribute__((section("_ftrace_events")))   \
  *__event_enter_##sname = &event_enter_##sname;

#define SYSCALL_TRACE_EXIT_EVENT(sname)     \
 static struct syscall_metadata __syscall_meta_##sname;  \
 static struct ftrace_event_call __used    \
   event_exit_##sname = {     \
  .name                   = "sys_exit"#sname,  \
  .class   = &event_class_syscall_exit, \
  .event.funcs  = &exit_syscall_print_funcs, \
  .data   = (void *)&__syscall_meta_##sname,\
  .flags   = TRACE_EVENT_FL_CAP_ANY, \
 };        \
 static struct ftrace_event_call __used    \
   __attribute__((section("_ftrace_events")))   \
 *__event_exit_##sname = &event_exit_##sname;

#define SYSCALL_METADATA(sname, nb, ...)   \
 static const char *types_##sname[] = {   \
  __MAP(nb,__SC_STR_TDECL,__VA_ARGS__)  \
 };       \
 static const char *args_##sname[] = {   \
  __MAP(nb,__SC_STR_ADECL,__VA_ARGS__)  \
 };       \
 SYSCALL_TRACE_ENTER_EVENT(sname);   \
 SYSCALL_TRACE_EXIT_EVENT(sname);   \
 static struct syscall_metadata __used   \
   __syscall_meta_##sname = {    \
  .name   = "sys"#sname,   \
  .syscall_nr = -1, /* Filled in at boot */ \
  .nb_args  = nb,    \
  .types  = nb ? types_##sname : NULL, \
  .args  = nb ? args_##sname : NULL, \
  .enter_event = &event_enter_##sname,  \
  .exit_event = &event_exit_##sname,  \
  .enter_fields = LIST_HEAD_INIT(__syscall_meta_##sname.enter_fields), \
 };       \
 static struct syscall_metadata __used   \
   __attribute__((section("__syscalls_metadata"))) \
  *__p_syscall_meta_##sname = &__syscall_meta_##sname;
#else
#define SYSCALL_METADATA(sname, nb, ...)
#endif

#define SYSCALL_DEFINE0(sname)     \
 SYSCALL_METADATA(_##sname, 0);    \
 asmlinkage long sys_##sname(void)

#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)

#define SYSCALL_DEFINEx(x, sname, ...)    \
 SYSCALL_METADATA(sname, x, __VA_ARGS__)   \
 __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值