/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 没记录到丢事件。

总结

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

分类: llvm

pareto

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

0 条评论

发表回复

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