2

我正在尝试使用 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"/>在清单中有,所以我不应该进入这个案例。

以下是有关我为达到崩溃所遵循的步骤的更多详细信息:

  1. 使用 Eclipse 中的 Debug 启动我的应用程序
  2. 命中我在 System.loadLibrary 之后设置的断点,在该断点我的本地库被加载
  3. 在我的项目目录中,运行 ndk-gdb --force --verbose --start
  4. gdb 启动成功并已附加
  5. 在 gdb 中设置断点,在 Eclipse 中继续,然后在 gdb 中继续
  6. 碰撞!

请参阅下面的编辑控制台转储。

对于为什么会发生这种情况的任何反馈,我将不胜感激!

$ 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 退出
4

1 回答 1

0

我怀疑它在达到断点时崩溃的原因是bionicAndroid 2.3.6版本附带的lib版本。很可能,该库无法支持线程或已损坏。

bioniclib 是为 Android 平台提供原生标准 C 代码 API 的核心运行时库。如果你能想到glibc,你就离题不远了。

相反,您可以做的最好的事情是修改您的本机代码并向 logcat 发送垃圾邮件以查看执行期间采用的路径并取消它。

于 2012-06-25T22:49:03.640 回答