Android 添加共享库的调试符号
我使用add_qt_android_apk使用qt 5构建apk:Android 添加共享库的调试符号,android,c++,qt,cmake,Android,C++,Qt,Cmake,我使用add_qt_android_apk使用qt 5构建apk: add_qt_android_apk(my_app_apk gustavsfairyland NAME "@string/ApplicationName" DEPENDS ${QTAV_LIBRARIES} ) QTAV_库是在以下情况之前定义的: set(QTAV_LIBRARIES "${QTAV_FFMPEG_LIB_DIR}/libavcodec.so"
add_qt_android_apk(my_app_apk gustavsfairyland NAME "@string/ApplicationName"
DEPENDS
${QTAV_LIBRARIES}
)
QTAV_库是在以下情况之前定义的:
set(QTAV_LIBRARIES
"${QTAV_FFMPEG_LIB_DIR}/libavcodec.so"
"${QTAV_FFMPEG_LIB_DIR}/libavfilter.so"
"${QTAV_FFMPEG_LIB_DIR}/libavformat.so"
"${QTAV_FFMPEG_LIB_DIR}/libavresample.so"
"${QTAV_FFMPEG_LIB_DIR}/libavutil.so"
"${QTAV_FFMPEG_LIB_DIR}/libswresample.so"
"${QTAV_FFMPEG_LIB_DIR}/libswscale.so"
"${CMAKE_BINARY_DIR}/buildqtav/${QTAV_LIB_DIR}/libQtAV.so"
"${CMAKE_BINARY_DIR}/buildqtav/${QTAV_LIB_DIR}/libQtAVWidgets.so"
)
我使用调试模式(user.conf)构建libQtAV.so:
当我使用nm检查符号时,我得到许多符号:
nm ../buildqtav/lib_android_arm/libQtAV.so
00062884 t $a
00061d88 t $a
0005f9d0 t $a
...
但当我在libs目录中复制的库上使用nm时,我什么也得不到:
bash-4.3$ nm armeabi-v7a/libQtAV.so
nm: armeabi-v7a/libQtAV.so: no symbols
add_qt_android_apk是否删除调试符号
在Qt APK的CMake模块中,我发现:
if(EXTRA_LIBS)
set(EXTRA_LIBS "${EXTRA_LIBS},${LIB}")
else()
set(EXTRA_LIBS "${LIB}")
endif()
endforeach()
set(QT_ANDROID_APP_EXTRA_LIBS "\"android-extra-libs\": \"${EXTRA_LIBS}\",")
所以它使用指定的外部.so路径。然后将其添加到CMake变量QT_ANDROID_APP_EXTRA_LIBS中的qtdeploy.json中。哪个有条目
buildandroidarmeabi-v7a/buildqtav/lib_android_arm/libQtAV.so
在“android额外库”中:
因此,它实际上有正确的条目,但不知何故删除了调试符号。“libs”文件夹中的库大小为1.1兆字节,而“lib_android_arm”中的原始库大小为1.6兆字节
我想看看目前使用ndk堆栈打印的例程:
Stack frame #05 pc 000b714f /data/app/org.qtproject.gustavsfairyland-1/lib/arm/libQtAV.so: Routine ??
编辑:
我使用以下CMake模块:
编辑2:
看起来androiddeployqt总是会剥离库的符号:
stripLibraries()总是在构建应用程序时被调用。嗯,androiddeployqt总是剥离库以减小其大小。我已经为Qt打开了一个bug报告:正如编辑的问题和答案中已经提到的,androiddeployqt是从.so文件中删除debuginfo的工具 我相信这里最重要的一点是androiddeployqt不会修改文件,它会在生成apk的过程中创建一个副本,只有这个副本才会删除调试信息。在构建输出中仍然存在未修改的.so文件,该文件包含调试信息,可用于调试应用程序(Qt creator AFAIK),并可用于获取符号信息-我使用该文件创建带有breakpad crashdump文件的可读堆栈跟踪
我认为这也是被拒绝为不完整的原因:只要使用Qt creator调试应用程序与当前构建过程配合使用(并证明使用正确配置的工具链进行调试是可能的),Qt维护人员认为没有充分的理由在设备上提供符号我能够通过这个帖子的建议在Android工作室(没有Qt Creator)中实现我的C++ QT应用程序的源代码级调试:对于那些想要直接使用Android工作室(没有Qt Creator)的人,这个其他答案显示了如何说服安卓工作室“注意”未剥离的“SO”文件:
Stack frame #05 pc 000b714f /data/app/org.qtproject.gustavsfairyland-1/lib/arm/libQtAV.so: Routine ??