/sys/kernel/tracing/ 是 Linux 内核的 tracefs 挂载点,用来访问 ftrace/tracepoint/eBPF 等内核 tracing 能力。Android 新内核一般在这里;旧设备也可能在 /sys/kernel/debug/tracing/。

它的特点是:trace 逻辑在内核里,提前打开后不需要等目标进程出现再 attach,所以适合验证 fork/clone 后的早期 syscall。

常用文件

  • /sys/kernel/tracing/tracing_on:总开关,1 开始记录,0 停止。
  • /sys/kernel/tracing/trace:当前 trace buffer,可读,也可写空清空。
  • /sys/kernel/tracing/buffer_size_kb:每 CPU ring buffer 大小。
  • /sys/kernel/tracing/events/:可用事件目录。
  • /sys/kernel/tracing/events/<subsystem>/<event>/enable:单个事件开关。
  • /sys/kernel/tracing/per_cpu/cpu*/stats:检查 overrun / dropped events。

Demo:抓 fork 后新进程 syscall

adb shell su -c ‘
TR=/sys/kernel/tracing
[ -d “$TR” ] || TR=/sys/kernel/debug/tracing

echo 0 > $TR/tracing_on
echo > $TR/trace
echo 32768 > $TR/buffer_size_kb

echo 1 > $TR/events/sched/sched_process_fork/enable
echo 1 > $TR/events/raw_syscalls/sys_enter/enable
echo 1 > $TR/events/raw_syscalls/sys_exit/enable

echo 1 > $TR/tracing_on
monkey -p com.SharedAH.GGPUnityDemo -c android.intent.category.LAUNCHER 1
sleep 1
echo 0 > $TR/tracing_on

cat $TR/trace > /data/local/tmp/demo.trace
cat $TR/per_cpu/cpu*/stats > /data/local/tmp/demo.stats
‘

查看 fork 点和目标进程 syscall:

adb pull /data/local/tmp/demo.trace .

adb pull /data/local/tmp/demo.stats .

rg "sched_process_fork|AH.GGPUnityDemo" demo.trace

rg "overrun: [^0]|dropped events: [^0]|commit overrun: [^0]" demo.stats

如果第二条 rg 没输出,说明这次 trace buffer 没记录到丢事件。

常用

1. signal_generate/filter

/sys/kernel/tracing/instances/sigreg/events/signal/signal_generate/filter

过滤“信号生成”事件。

例如:

echo 'sig == 7' > \
/sys/kernel/tracing/instances/sigreg/events/signal/signal_generate/filter

表示只记录生成 SIGBUS 的事件。

signal_generate 常见字段:

sig       信号编号
errno     错误码
code      信号来源/原因
comm      目标任务名
pid       目标任务 PID,很多内核上实际是 TID
group     是否以进程组方式发送
result    生成结果

例如:

echo 'sig == 7 && code == 2' > ...

可以进一步过滤 SIGBUS 且 code == 2 的情况,通常对应 BUS_ADRERR。

2. signal_deliver/filter

/sys/kernel/tracing/instances/sigreg/events/signal/signal_deliver/filter

过滤“信号交付”事件,也就是内核准备把信号交给某个线程处理。

例如:

echo 'sig == 7' > \
/sys/kernel/tracing/instances/sigreg/events/signal/signal_deliver/filter

signal_deliver 常见字段:

sig          信号编号
errno        错误码
code         信号原因
sa_handler   当前信号处理函数地址
sa_flags     信号处理标志
common_pid   当前被交付信号的线程 PID/TID

sa_handler 可以帮助判断当前使用的是:

  • 默认处理:通常是 SIG_DFL
  • 忽略处理:通常是 SIG_IGN
  • 用户自定义 handler:一个实际地址

总结

/sys/kernel/tracing/events/raw_syscalls/sys_enter 和 sys_exit 打开后,可以记录所有进程进入/退出内核 syscall 的事件


pareto

未来什么方向不管,先做自己喜欢做的事情。

0 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注