我正在尝试使用 NDK r6b 在 2.3.6 设备上调试多线程 Android 应用程序。我也尝试过使用 NDK r8 得到相同的结果。每当我遇到断点时,应用程序就会崩溃。我似乎遇到了“线程支持”部分的 NDK r5b 文档中描述的案例:
这实际上意味着: - 如果您使用的是 Android 2.3 或之前的平台版本 平台错误修复向后移植到它,您将能够调试本机 自动线程。 - 如果你不是,你将只能调试主线程 (与以前的 NDK 版本一样)。您还将看到以下消息 启动 ndk-gdb 时(就在 gdb 提示符之前): 此安卓平台不支持线程调试! 如果在非主线程上执行的函数上放置断点,则 程序将在 GDB 中退出并显示以下消息: 程序以信号 SIGTRAP、跟踪/断点陷阱终止。 该程序不再存在。
我得到了提到的确切错误。我相信我正在处理这种情况,因为我Thread debugging is unsupported on this Android platform!
在运行 ndk-gdb 时看到了。正如我所提到的,我在 Gingerbread 设备上,并且我<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="9"/>
在清单中有,所以我不应该进入这个案例。
以下是有关我为达到崩溃所遵循的步骤的更多详细信息:
- 使用 Eclipse 中的 Debug 启动我的应用程序
- 命中我在 System.loadLibrary 之后设置的断点,在该断点我的本地库被加载
- 在我的项目目录中,运行 ndk-gdb --force --verbose --start
- gdb 启动成功并已附加
- 在 gdb 中设置断点,在 Eclipse 中继续,然后在 gdb 中继续
- 碰撞!
请参阅下面的编辑控制台转储。
对于为什么会发生这种情况的任何反馈,我将不胜感激!
$ ndk-gdb --force --verbose --start Android NDK安装路径:/Users/tony/Documents/android-ndk-r8 使用默认的 adb 命令:/Users/tony/Documents/android-sdk-mac_86/platform-tools/adb 找到 ADB 版本:Android Debug Bridge 版本 1.0.29 使用亚行标志: 使用自动检测的项目路径:. 找到包名:com.mycompany.myapp 应用程序针对的 ABI:armeabi 设备 API 级别:10 设备 CPU ABI:armeabi-v7a armeabi 兼容设备 ABI:armeabi 使用 gdb 设置初始化:./libs/armeabi/gdb.setup 使用工具链前缀:/Users/tony/Documents/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi- 使用应用程序输出目录:./obj/local/armeabi 找到可调试标志:true 找到设备 gdbserver:/data/data/com.appMobi.applab/lib/gdbserver 找到数据目录:'/data/data/com.mycompany.myapp' 找到第一个可启动的活动:.MainActivity 启动活动:com.mycompany.myapp/.MainActivity ## 命令:/Users/tony/Documents/android-sdk-mac_86/platform-tools/adb shell am start -n com.mycompany.myapp/.MainActivity 开始:意图 { cmp=com.mycompany.myapp/.MainActivity } 警告:活动未启动,意图已交付给当前正在运行的最顶层实例。 ## 命令:/Users/tony/Documents/android-sdk-mac_86/platform-tools/adb shell sleep 2 发现运行PID:7341 成功启动 gdbserver。 设置网络重定向 ## 命令:/Users/tony/Documents/android-sdk-mac_86/platform-tools/adb forward tcp:5039 localfilesystem:/data/data/com.mycompany.myapp/debug-socket ## 命令:/Users/tony/Documents/android-sdk-mac_86/platform-tools/adb shell run-as com.appMobi.applab lib/gdbserver +debug-socket --attach 7341 ## 命令:/Users/tony/Documents/android-sdk-mac_86/platform-tools/adb pull /system/bin/app_process ./obj/local/armeabi/app_process 随附的; PID = 7341 监听 sockaddr 套接字调试套接字 184 KB/s(0.030 秒内 5720 字节) 从设备/模拟器中提取 app_process。 ## 命令:/Users/tony/Documents/android-sdk-mac_86/platform-tools/adb pull /system/lib/libc.so ./obj/local/armeabi/libc.so 4347 KB/s(0.061s 内 273940 字节) 从设备/模拟器中提取 libc.so。 GNU gdb 6.6 版权所有 (C) 2006 Free Software Foundation, Inc. GDB 是自由软件,受 GNU 通用公共许可证保护,您是 欢迎在某些条件下更改和/或分发它的副本。 键入“显示复制”以查看条件。 GDB 绝对没有任何保证。键入“显示保修”以获取详细信息。 此 GDB 配置为“--host=x86_64-apple-darwin --target=arm-elf-linux”。 (未找到调试符号) 映射共享库部分时出错: ...省略了共享库映射错误... 此安卓平台不支持线程调试! 此安卓平台不支持线程调试! 警告:无法找到动态链接器断点函数。 GDB 将无法调试共享库初始化程序 并跟踪显式加载的动态代码。 警告:共享库处理程序未能启用断点 来自/Developer/AppMobiAndroid/AppLab/obj/local/armeabi/libc.so的epoll_wait()中的0xafd0c5ac 此安卓平台不支持线程调试! (gdb) 中断 dcanvas.cpp:544 0x81833c8a 处的断点 1:文件 /Developer/AppMobiAndroid/AppLab/jni/dcanvas.cpp,第 544 行。 (gdb) c 继续。 孩子以信号终止 = 5 程序以信号 SIGTRAP、跟踪/断点陷阱终止。 该程序不再存在。 (gdb) 子进程以信号 = 0x5 (SIGTRAP) 终止 GDBserver 退出