MacOS环境下如何用Android Studio调试Native代码中fork的子进程
调试Android Native Fork出的子进程方法
嘿,这个场景我之前踩过不少坑,给你整理几个亲测有效的调试方法:
一、先做好准备工作
- 确保你的Android Studio已经配好NDK、CMake环境,项目能正常编译Native代码
- 目标设备得是root过的,或者能成功执行
adb root,调试子进程需要较高权限 - 要调试的可执行文件必须带调试符号编译,也就是编译时加
-g参数(用CMake的话直接设CMAKE_BUILD_TYPE=Debug就行)
二、方法1:手动用GDB附加调试
这是最直接的路子,步骤清晰:
- 先启动你的App,让它fork出子进程并跑起来目标可执行文件
- 连adb进设备shell:
adb shell - 找子进程的PID:
ps | grep 你的可执行文件名,把PID记下来 - 退出shell,启动gdbserver挂住进程:
adb shell gdbserver :1234 --attach 刚才的PID - 做端口转发:
adb forward tcp:1234 tcp:1234 - 回到Android Studio,打开
Run > Edit Configurations,新建一个Native配置,在Debugger标签页里把Debug type改成GDB,然后在GDB commands里加一行target remote :1234 - 启动调试,就能正常断点调试子进程的代码了
三、方法2:让子进程启动时自动等调试器
如果子进程启动太快,手动附加赶不上,可以改Native代码让它暂停等你:
- 在fork完、调用exec执行可执行文件之前,加这段代码:
#include <unistd.h> #include <sys/ptrace.h> // 让子进程暂停,等着调试器连接 ptrace(PTRACE_TRACEME, 0, NULL, NULL); kill(getpid(), SIGSTOP);
- 重新编译安装App,启动后子进程会卡在暂停状态
- 用
ps找到PID后,照着方法1的步骤3-7操作就行
四、方法3:用Android Studio自带的LLDB附加
Android Studio默认用LLDB,操作更简便:
- 启动App,fork出子进程后,要么在Logcat里找PID,要么用
adb shell ps查 - 打开
Run > Attach Debugger to Android Process,选对应的设备,勾选Show all processes就能看到子进程了 - 点
OK,LLDB会自动连上子进程,之后就能正常设断点调试
几个要注意的点
- 如果子进程启动后调试连不上,试试关SELinux:
adb shell setenforce 0(仅限root设备) - 确保可执行文件有执行权限:
adb shell chmod +x /你的可执行文件路径 - 调试符号必须和可执行文件对应,不然断点会无效
内容的提问来源于stack exchange,提问作者joker
相关产品推荐
相关产品推荐

