Android外部进程异常终止(退出码159,疑为SIGSYS)排查求助
确认Android上外部进程违反seccomp-bpf策略的方法
背景
我开发了一款可启动外部进程的应用,该外部进程是移植后的OCaml静态编译Linux应用,自身还会启动子进程。测试阶段从UI线程启动该进程(输出处理在独立线程):
- 在Android 7的Anbox中可正常运行;
- 在LineageOS 18.1(Android 11)真机上,进程启动后输出部分内容,几秒后以退出码159终止,对应信号31(推测为
SIGSYS,因Android 8+引入seccomp-bpf,违规操作会触发该信号)。
但logcat未提供终止原因的线索,需确认是否违反seccomp-bpf策略并获取详情。
确认及排查方法
1. 启用系统seccomp日志输出
Android 8及以上版本支持通过系统属性开启seccomp日志,步骤如下:
- 连接设备执行:
adb shell setprop log.seccomp 1 - 重启你的外部进程,然后抓取logcat日志:
adb logcat -v time | grep -i seccomp - 日志中会包含违规的系统调用名称、进程PID、信号类型等信息,可直接定位触发
SIGSYS的具体操作。
2. 用strace追踪系统调用
通过strace可以实时监控进程的所有系统调用,找到触发终止的关键操作:
- 启动时追踪:执行
adb shell strace -f -o /sdcard/strace.log ./你的二进制文件路径(-f参数会追踪子进程) - 附加到运行中的进程:先获取进程PID(
adb shell ps | grep 你的进程名),再执行adb shell strace -p <PID> - 查看生成的
strace.log,重点关注日志末尾的系统调用,触发SIGSYS的调用会被标记,直接定位违规的syscall。
注意:该操作需要设备拥有root权限,或你的应用已获得调试权限。
3. 对比Android seccomp规则集
不同Android版本的seccomp-bpf规则不同,可通过以下方式确认:
- 若设备有root权限,使用
seccomp-tools等工具导出当前zygote的seccomp规则,对比你的进程调用的系统调用是否在允许列表内; - 参考对应Android版本的源码(如LineageOS 18.1的zygote seccomp配置),检查是否存在被禁止的syscall。
内容的提问来源于stack exchange,提问作者user149408
相关产品推荐
相关产品推荐

