You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 21:00:18