Pixel 6的Android13 5.15自定义aarch64内核缺失syscall tracepoints
问题:Android 13 5.15 aarch64(Pixel 6)内核syscall tracepoints无法启用
我为搭载Android 13的Pixel 6重新编译了启用事件跟踪(重点是syscall tracepoints)的5.15自定义内核,但启动后出现以下异常:
/sys/kernel/tracing/events/syscalls目录不存在- syscall tracepoints未在
/sys/kernel/debug/tracing/available_events中注册
已知正常场景:
- x86_64架构(Cuttlefish)编译同版本5.15内核可正常启用syscall tracepoints
- Android 14、6.1版本的aarch64内核也能正常工作
失效场景编译步骤
- 基于分支
gs-android13-gs-raviole-5.15 - 执行配置命令:
BUILD_CONFIG=common/build.config.gki.aarch64 build/config.sh - 启用以下内核配置项:
CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO_BTF=y CONFIG_SECURITY=y CONFIG_SECURITYFS=y CONFIG_SECURITY_NETWORK=y # 注:原配置存在拼写错误,应为NETWORK而非NEWORK CONFIG_FUNCTION_TRACER=y CONFIG_FTRACE_SYSCALLS=y
- 执行编译命令:
tools/bazel run --lto=thin //gs/google-modules/soc-modules:slider_dist(尝试去掉--lto=thin参数仍无效) - 按官方文档刷入boot.img、dtbo.img等镜像
已通过/proc/config.gz确认上述配置项均已正确启用,怀疑预构建元素导致问题,但无法理解为何x86_64通用GKI内核正常,而Pixel 6的aarch64内核失效。
排查方向与解决方案
1. 确认配置项拼写修正
首先修正配置中的拼写错误:CONFIG_SECURITY_NEWORK=y 改为 CONFIG_SECURITY_NETWORK=y。虽然你已通过/proc/config.gz确认配置无误,但仍需验证该错误是否在实际编译流程中已被修正——错误的配置项可能导致相关依赖模块未正确编译,间接影响tracepoint功能。
2. 排查Pixel 6专属分支的定制补丁影响
gs-android13-gs-raviole-5.15分支包含Google为Raviole平台(Pixel 6系列)定制的SOC补丁与模块,这些内容可能干扰tracepoint功能:
- 对比该分支与正常工作的
common-android13-5.15分支,重点查看kernel/trace/、arch/arm64/kernel/syscall/目录下的提交差异,确认是否存在禁用syscall tracepoints的补丁 - 尝试编译纯GKI内核(不含SOC模块)测试:执行
BUILD_CONFIG=common/build.config.gki.aarch64 build/config.sh后,用tools/bazel run //common:kernel_aarch64编译纯GKI镜像,刷入后检查tracepoints是否恢复正常
3. 检查Bazel编译的预构建依赖
Pixel 6的SOC模块编译可能依赖预构建内核组件,这些预构建元素可能未启用CONFIG_FTRACE_SYSCALLS:
- 查看
//gs/google-modules/soc-modules:slider_dist的Bazel配置文件,确认是否引用了预构建内核片段,尝试修改构建规则跳过预构建依赖,强制全量编译 - 在build.config中添加
CONFIG_PREBUILT_KERNEL=n(若存在该配置),禁用预构建内核依赖后重新编译测试
4. 验证arm64架构tracepoint初始化逻辑
x86_64与aarch64的syscall tracepoint初始化逻辑存在差异,Android 13 5.15的arm64分支可能存在bug:
- 启动后执行
dmesg | grep ftrace,查看Ftrace初始化阶段是否存在报错信息 - 对比Android 14 6.1分支的
arch/arm64/kernel/syscall.c实现,确认当前分支是否正确注册了syscall tracepoints - 手动尝试加载syscall tracepoints:执行
echo syscalls > /sys/kernel/debug/tracing/set_event,观察是否报错或生成对应目录
5. 排查SELinux策略限制
Android 13的SELinux策略可能限制tracepoint目录的访问:
- 执行
getenforce确认SELinux状态,若为Enforcing模式,临时切换为Permissive(setenforce 0)后检查tracepoints是否出现 - 执行
dmesg | grep avc查看是否有SELinux拒绝访问tracepoint节点的日志,若存在需调整SELinux策略允许相关访问
内容的提问来源于stack exchange,提问作者Pete1234
相关产品推荐
相关产品推荐

