【发布时间】:2014-07-27 20:33:51
【问题描述】:
我尝试调试一个非常基本的示例 Qt 5.3 Android 本机 C++ 项目,我想在不使用 QtCreator 或任何其他 IDE(如 Eclipse)但仅使用 NDK 工具的情况下在目标上调试它。 这个项目是通过 QtCreator 工具使用 Android 平台目标编译的,在调试模式(-O0,-g)下,使用 NDK 工具链,但不是 ndk-build。
因此,我得到了我的 .apk,应用程序本身已安装在目标上并且可以正常工作,到目前为止一切都很好。现在我想使用 NDK 工具在调试模式下执行它。
我想使用 ndk-gdb,因为这似乎是最明显的方法之一,因此: - 我在我的主项目目录下手动创建了所需的文件:
bin
src
res
...
jni
|-- Android.mk
`-- Application.mk
libs
|-- armeabi-v7a
| |-- gdbserver
| |-- gdb.setup
上面的树只在我手动添加的文件下划线,因为它们通常是由 ndk-gdb 创建的。 在“libs”目录下还存储了项目的本地库,由简单的 java 包装器调用。
jni/Android.mk 和 jni/Application.mk 包含相同的单行:
APP_ABI := armeabi-v7a
gdb.setup:
set solib-search-path ./libs/armeabi-v7a
directory <myrootdir>/NDKToolchain/sysroot/usr/include <myrootdir>/NDKToolchain/include/c++/4.6 <myrootdir>/NDKToolchain/include/c++/4.6/arm-linux-androideabi/armv7-a [...]
我通过使用 adb 安装应用程序检查了目标是否已连接并可访问:
% adb install -r bin/QtApp-debug.apk
它有效(“成功”),我可以直接在目标上检查。
然后当我尝试运行 ndk-gdb 时,它失败了:
% ndk-gdb --start --nowait --verbose
WARNING: The shell running this script isn't bash. Although we try to avoid bashism in scripts, things can happen.
ndk-gdb: 84: Bad substitution
Android NDK installation path: [...]
Using default adb command: [...]/sdk/platform-tools//adb
ADB version found: Android Debug Bridge version 1.0.31
Using ADB flags:
Using JDB command:
Using auto-detected project path: .
Found package name: org.qtproject.example.fridgemagnets
ABIs targetted by application: armeabi-v7a
Device API Level: 18
Device CPU ABIs: armeabi-v7a armeabi
[: 564: 1: unexpected operator
Compatible device ABI: armeabi-v7a
Using gdb setup init: ./libs/armeabi-v7a/gdb.setup
Using toolchain prefix: [...]/ndk/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
Using app out directory: ./libs/armeabi-v7a
Found debuggable flag: false
Found gdb.setup under libs/armeabi-v7a, assuming app was built with NDK_DEBUG=1
ERROR: Could not extract package's data directory. Are you sure that
your installed application is debuggable?
之前运行的 ndk-gdb 告诉我,出于某种原因,它想使用 ./obj/local/armeabi-v7a 作为“应用程序输出目录”,而我在 gdb.set 中将其设置为 ./libs/armeabi -v7a,因此我不得不破解 ndk-gdb 脚本以强制它使用我选择的路径。我不相信这与我的真正问题有关(?)
鉴于我没有使用 ndk-build,我相信我尝试使用 ndk-gdb 是没有希望的,或者至少它会要求我做太多的工作和对我不想做的 NDK 脚本进行黑客攻击做。
因此 2 个问题:
- 我在构建或部署过程中是否因为获得 可调试的应用程序?我知道 Manifest 中的可调试标志是 “假”不一定是问题,因为我使用调试构建了我的应用程序 标志。顺便说一句,这似乎得到了错误的证实 我收到的消息与该标志无关,而是与 脚本似乎在某个地方有一个 DATA_DIR 文件夹......
- 有没有 在不使用 ndk-gdb(和任何 IDE)的情况下调试我的应用程序的方法, 但例如只是“gdb”?
提前致谢
【问题讨论】:
-
Nvidia Tegra Development Pack 在 Visual Studio 中提供 NDK 调试。对于我的情况,任何其他调试工具都无法正常工作。
-
ndk-gdb需要 bash 运行,因为它会写信给你。在 Windows 上,您可以使用cygwin。此外,ADT (Eclipse) 使用自己的类似调试。它不是很稳定,但如果它有效,它实际上并不依赖于用于生成本机库的ndk-build命令。 -
(对 Alex)该消息很奇怪,因为在 ndk-gdb 脚本的第一行指定的 shell 是:/bin/sh。问题仍然不是来自这个,脚本无论如何都会执行,它应该被视为警告
标签: android android-ndk remote-debugging native-code