/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 的事件
0 条评论