在 kprobes 支持 ftrace 之后,跟踪点在 Linux 内核中是多余的吗?
Are tracepoints redundant in Linux kernel after kprobes support for ftrace?
当 Linux 内核中提供对 ftrace 的 kprobe 事件支持时,使用跟踪点事件的用例是什么?使用 kprobe 事件似乎可以使用 'tracepoint events' 完成所有可能的事情,因为可以在跟踪点事件可用的同一点设置 kprobe 事件。
我错过了什么吗?
由于 kprobes 跟踪任意函数,依赖它们的工具 可能很容易从一个 Linux 版本中断到下一个 版本。例如,可以更改函数的名称或其参数之一,或者可以删除整个函数。这种变化经常发生并且会破坏基于 kprobe 的工具。
相反,跟踪点更稳定。它们应该保持基本相同并提供相同的信息。此外,它们 已记录 ;您可以在 /sys/kernel/debug/tracing
:
中找到跟踪点提供的信息的类型和位置
# 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
当 Linux 内核中提供对 ftrace 的 kprobe 事件支持时,使用跟踪点事件的用例是什么?使用 kprobe 事件似乎可以使用 'tracepoint events' 完成所有可能的事情,因为可以在跟踪点事件可用的同一点设置 kprobe 事件。
我错过了什么吗?
由于 kprobes 跟踪任意函数,依赖它们的工具 可能很容易从一个 Linux 版本中断到下一个 版本。例如,可以更改函数的名称或其参数之一,或者可以删除整个函数。这种变化经常发生并且会破坏基于 kprobe 的工具。
相反,跟踪点更稳定。它们应该保持基本相同并提供相同的信息。此外,它们 已记录 ;您可以在 /sys/kernel/debug/tracing
:
# 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