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

为何gdbserver附加原生Android应用失败?纯CMake构建无Android Studio环境

问题根因与解决方案

你遇到的报错本质是pid获取逻辑执行上下文错误、ptrace权限拦截两类常见问题,按以下步骤排查即可解决:

第一步:修正命令执行格式

绝大多数情况下报错是因为你把$(pidof my.app.id)放在了本地shell执行,而非Android设备的shell内,本地环境没有对应进程导致pid为空,传递到设备后就会触发pid找不到的报错。
请使用以下任意一种方式修正:

  • 方案1:单引号包裹整段命令,让pid获取逻辑在设备侧执行
    adb shell 'gdbserver64 :5039 --attach $(pidof my.app.id)'
    
  • 方案2:手动获取pid后传递(避免转义问题,更稳妥)
    1. 先执行命令获取应用进程ID:
      adb shell ps -A | grep my.app.id
      
      输出结果第二列即为对应pid,假设返回值为1234
    2. 直接指定pid附加:
      adb shell gdbserver64 :5039 --attach 1234
      

第二步:排查SELinux拦截问题

Android 11的SELinux默认策略会拦截gdbserver对普通应用进程的ptrace操作,哪怕已经获取adb root权限也可能触发拦截,可临时关闭SELinux验证:

adb shell setenforce 0

调试完成后可以执行adb shell setenforce 1恢复默认策略即可。

第三步:校验架构匹配与调试符号保留

  • 如果你的应用构建的是32位版本,替换gdbserver64为32位的gdbserver再尝试附加
  • 请确保你的CMake配置中添加了-g编译参数保留调试符号,不要在构建流程中自动strip原生库的符号表,否则后续gdb连接后无法识别代码逻辑。

后续调试步骤

附加成功后执行本地端口转发,即可用NDK内置的gdb/llvm-gdb连接调试:

adb forward tcp:5039 tcp:5039

本地gdb端执行target remote :5039即可完成连接。

内容的提问来源于stack exchange,提问作者VelvetRebel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 02:21:03