Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 添加共享库的调试符号_Android_C++_Qt_Cmake - Fatal编程技术网

Android 添加共享库的调试符号

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使用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"
        "${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 ??