我尝试调试一个非常基本的示例Qt 5.3 Android原生C ++项目,我想在目标上调试它,而不使用QtCreator或任何其他IDE,如Eclipse,但只使用NDK工具。 这个项目是使用Android平台目标通过QtCreator工具编译的,在调试模式下(-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用作“app out directory”,而我将它设置为gdb.set为./libs/armeabi -v7a,因此我不得不破解ndk-gdb脚本以强制它使用我选择的路径。我不相信这与我的真实问题有关(?)
鉴于我没有使用ndk-build,我相信我尝试使用ndk-gdb是没有希望的,或者至少它会问我太多的工作和黑客攻击我不想要的NDK脚本做。
因此有两个问题:
提前致谢
答案 0 :(得分:0)
问题1:
我知道从SDK r8开始,您可以使用release
或debug
调用ant。使用debug标志构建可能会以不同方式打包或运行应用程序。允许或禁止调试?这似乎可能是问题所在。
问题2:
根据我的理解,ndk-gdb会对adb进行大量设置和通信,以便调试应用程序,就像您从脚本中看到的那样。我不建议不要使用兔子洞。