当Linux内核中已经支持ftrace的kprobe事件时,使用tracepoint事件有哪些用例呢?似乎所有可以使用“tracepoint事件”完成的操作都可以使用kprobe事件完成,因为可以在与tracepoint事件相同的位置设置kprobe事件。
我是否漏掉了什么?
当Linux内核中已经支持ftrace的kprobe事件时,使用tracepoint事件有哪些用例呢?似乎所有可以使用“tracepoint事件”完成的操作都可以使用kprobe事件完成,因为可以在与tracepoint事件相同的位置设置kprobe事件。
我是否漏掉了什么?
由于kprobes可以跟踪任意函数,依赖它们的工具可能会在Linux版本之间轻易地出现问题。例如,函数的名称或其参数之一可能会更改,或者整个函数可能会被删除。这种变化经常发生,可能会破坏基于kprobe的工具。
相反,tracepoints更加稳定。它们应该保持大致相同并提供相同的信息。此外,它们是有文档记录的;您可以在/sys/kernel/debug/tracing
中找到tracepoints提供的信息类型和位置:
# cat /sys/kernel/debug/tracing/events/skb/kfree_skb/format
name: kfree_skb
ID: 1122
format:
field:unsigned short common_type; offset:0; size:2; signed:0;
field:unsigned char common_flags; offset:2; size:1; signed:0;
field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
field:int common_pid; offset:4; size:4; signed:1;
field:void * skbaddr; offset:8; size:8; signed:0;
field:void * location; offset:16; size:8; signed:0;
field:unsigned short protocol; offset:24; size:2; signed:0;
print fmt: "skbaddr=%p protocol=%u location=%p", REC->skbaddr, REC->protocol, REC->location