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