簡體   English   中英

add_qt_android_apk剝離共享庫的調試符號

[英]add_qt_android_apk strips debug symbols of shared library

我使用add_qt_android_apk使用Qt 5構建APK:

add_qt_android_apk(my_app_apk gustavsfairyland NAME "@string/ApplicationName"
        DEPENDS
        ${QTAV_LIBRARIES}
    )

QTAV_LIBRARIES在以下位置定義:

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:

CONFIG += no_config_tests
CONFIG += config_avutil config_avformat config_avcodec config_swscale config_swresample

CONFIG -= release
CONFIG += debug

當我使用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-extra-libs”中:因此它實際上具有正確的條目,但是以某種方式剝離了調試符號。 “ libs”文件夾中的庫的大小為1.1 MiBytes,而“ lib_android_arm”文件夾中的原始庫的大小為1.6 MiBytes。

我想看看使用ndk-stack的例程,它現在可以打印:

Stack frame #05 pc 000b714f  /data/app/org.qtproject.gustavsfairyland-1/lib/arm/libQtAV.so: Routine ??

編輯:我使用以下CMake模塊: https : //github.com/LaurentGomila/qt-android-cmake

edit2:看起來androiddeployqt總是會刪除庫的符號: http : //code.qt.io/cgit/qt/qttools.git/tree/src/androiddeployqt/main.cpp

在構建應用程序時,始終調用stripLibraries()。

好吧,androiddeployqt確實總是剝離庫以減小它們的大小。 我已經打開了Qt的錯誤報告: https//bugreports.qt.io/browse/QTBUG-57771

正如在已編輯的問題和答案中已經提到的,androiddeployqt是從.so文件中剝離debuginfo的東西。

我相信這里的重點是androiddeployqt不會修改文件,它會在生成apk的過程中創建一個副本,並且只有該副本會刪除調試信息。 在生成的輸出中,仍然有一個未修改的.so文件,其中包含調試信息,可用於調試應用程序(Qt創建者執行AFAIK),並且可用於獲取符號信息-我使用它來創建可讀的堆棧跟蹤與breakpad crashdump文件。

我認為這也是為什么QTBUG-57771被拒絕為不完整的原因:只要使用Qt Creator調試應用程序,Qt維護人員就沒有充分的理由使符號在設備上可用(並演示了使用正確配置的工具鏈可以進行調試)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM