Android ndk gdb 加载的共享库缺少 *.oat 文件。

98
无论是还是在调试我的设备(oppo r7s)时都缺少了一些共享库。我已经将所有库文件都拷贝到本地
下面是info shared显示的完整库文件列表。
(gdb) info shared
From        To          Syms Read   Shared Object Library
0x40000980  0x40009640  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\linker
0x401c7940  0x401ce6e8  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libutils.so
                        No          libstdc++.so
                        No          libm.so
0x4013bbb0  0x4017329c  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libc.so
                        No          libbinder.so
                        No          liblog.so
                        No          libhardware.so
                        No          libcutils.so
                        No          libc++.so
                        No          libLLVM.so
                        No          libbcinfo.so
                        No          libunwind.so
                        No          libz.so
                        No          libpng.so
                        No          libpowermanager.so
                        No          libcommon_time_client.so
                        No          libstlport.so
                        No          libui.so
                        No          libsync.so
                        No          libgui.so
                        No          libft2.so
                        No          libbcc.so
                        No          libGLESv2.so
                        No          libGLESv1_CM.so
                        No          libEGL.so
                        No          libunwind-ptrace.so
                        No          libgccdemangle.so
                        No          libcrypto.so
                        No          libicuuc.so
                        No          libicui18n.so
                        No          libjpeg.so
                        No          libexpat.so
                        No          libpcre.so
                        No          libharfbuzz_ng.so
                        No          libstagefright_foundation.so
                        No          libsonivox.so
                        No          libnbaio.so
                        No          libcamera_client.so
                        No          libaudioutils.so
                        No          libaudioparameter.so
                        No          libinput.so
                        No          libhardware_legacy.so
                        No          libcamera_metadata.so
                        No          libgabi++.so
                        No          libskia.so
                        No          libRScpp.so
                        No          libRS.so
                        No          libwpa_client.so
                        No          libnetutils.so
                        No          libspeexresampler.so
0x402635b0  0x402724a4  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libandroidfw.so
                        No          libGLES_trace.so
                        No          libbacktrace.so
                        No          libusbhost.so
                        No          libssl.so
                        No          libsqlite.so
                        No          libsoundtrigger.so
                        No          libselinux.so
                        No          libprocessgroup.so
                        No          libpdfium.so
                        No          libnetd_client.so
                        No          libnativehelper.so
                        No          libnativebridge.so
                        No          libminikin.so
                        No          libmemtrack.so
                        No          libmedia.so
                        No          libinputflinger.so
                        No          libimg_utils.so
                        No          libhwui.so
                        No          libassert_tip_service.so
                        No          libETC1.so
0x4006d230  0x400ca9dc  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libandroid_runtime.so
                        No          libNimsWrap.so
                        No          libsigchain.so
                        No          libvendorconn.so
                        No          libbacktrace_libc++.so
0x41d4baa0  0x41f9ee24  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libart.so
                        No          libjavacore.so
                        No          memtrack.msm8916.so
                        No          libqti-perfd-client.so
                        No          libtinyxml.so
                        No          libqservice.so
                        No          libmm-abl-oem.so
                        No          libdiag.so
                        No          libmm-abl.so
                        No          libprotecteyes.so
                        No          libgsl.so
                        No          libadreno_utils.so
                        No          libEGL_adreno.so
                        No          libGLESv1_CM_adreno.so
                        No          libGLESv2_adreno.so
0x68246388  0x68249184  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libandroid.so
                        No          libcompiler_rt.so
                        No          libjnigraphics.so
                        No          libvorbisidec.so
                        No          libstagefright_yuv.so
                        No          libstagefright_omx.so
                        No          libstagefright_enc_common.so
                        No          libstagefright_avc_common.so
                        No          libopus.so
                        No          libdrmframework.so
                        No          libstagefright_amrnb_common.so
                        No          libstagefright.so
                        No          libmtp.so
                        No          libjhead.so
                        No          libexif.so
                        No          libmedia_jni.so
                        No          libjavacrypto.so
                        No          libsoundpool.so
                        No          libaudioeffect_jni.so
                        No          librs_jni.so
                        No          libthwsplit.so
                        No          libwebviewchromium_loader.so
                        No          eglsubAndroid.so
                        No          libsc-a3xx.so
                        No          libqdutils.so
                        No          libqdMetaData.so
                        No          libmemalloc.so
                        No          gralloc.msm8916.so
                        No          libfmodex.so
                        No          libfmodevent.so
                        No          libstagefright_http_support.so
                        No          libeffects.so
                        No          libwilhelm.so
                        No          libOpenSLES.so
0x7f9ceb40  0x8102f72c  Yes         Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libclient.so
                        No          libwebviewchromium.so
                        No          libwebviewchromium_plat_support.so
(*): Shared library is missing debugging information.

但是在调试其他设备(如华为FRD-AL00)时,会加载oat文件。
以下是在此类设备上运行show shared命令的输出摘录。
0x71867000  0x71cc76d6  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\system@framework@boot.oat
0x721dc000  0x725657c4  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\system@framework@boot-core-libart.oat
0x725dc000  0x7262d9cc  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\system@framework@boot-conscrypt.oat
0x726c3000  0x727291ea  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\system@framework@boot-okhttp.oat
0xea0de584  0xea0e5714  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libandroid.so
0xe1b15da0  0xe1cdc3ec  Yes (*)     Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libart-compiler.so
                        No          /system/lib/libvixl.so
0xc2b0ab40  0xc416b72c  Yes         Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libclient.so
                        No          /data/dalvik-cache/arm/system@app@WebViewGoogle@WebViewGoogle.apk@classes.dex

没有加载库的情况下,gdb无法正确地展开堆栈,oppo中的回溯无法进行。
(gdb) bt
#0  0x40168698 in __epoll_pwait () from Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libc.so
#1  0x4013f746 in epoll_pwait () from Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libc.so
#2  0x4013f754 in epoll_wait () from Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libc.so
#3  0x401cdf56 in android::Looper::pollInner(int) () from Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libutils.so
#4  0x401ce180 in android::Looper::pollOnce(int, int*, int*, void**) ()
   from Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libutils.so
#5  0x4009c7dc in android::NativeMessageQueue::pollOnce(_JNIEnv*, int) ()
   from Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\libandroid_runtime.so
#6  0x72403cdc in ?? ()

最后一个地址在 system@framework@boot.oat 中,当加载 oat 文件时,它也能正常工作。
有人能给一些建议吗?

2
你的项目中有多个“flavors”吗?是否遇到过类似的问题,即由于错误地执行gradle同步而导致Android Studio中的“iml”文件出现bug... - ahasbini
你尝试过类似这样的命令吗?"add-symbol-file Z:\program\program\target\android_RelWithDebInfo\obj\local\armeabi-v7a\system@framework@boot.oat" - Christian B
3个回答

0
这个问题很可能是由于您的Oppo设备上一些库缺少调试符号引起的。以下是一些您可以尝试的方法:
获取所有库的完整调试符号文件。缺少的调试符号(在您共享的信息输出中显示为“No”)会阻止gdb完全展开堆栈跟踪。
在您的设备上安装系统库的调试版本。您在华为设备上看到的oat文件包含调试信息,可以让gdb正确展开堆栈。
使用完整的调试信息重新构建您的应用程序。确保使用-g选项进行编译,以包含调试符号。这将确保gdb拥有您的应用程序库所需的所有信息。
将gdb更新到较新的版本。有时较新的gdb发布版本包含了在Android上展开堆栈跟踪的修复程序。
作为最后的办法,您可以在gdb会话期间手动加载.oat文件到您的Oppo设备。这将提供缺失的调试信息,并允许gdb正确展开堆栈。命令可能类似于:
add-symbol-file /path/to/system@framework@boot.oat 0x71867000

你需要以这种方式加载所有相关的 .oat 文件。
总结一下,问题很可能是缺少 gdb 需要正确展开堆栈的调试符号。拉取完整的调试符号,安装系统库的调试版本,并确保你的应用程序具有完整的调试信息是推荐的方法。

-1
如果您在使用 Android Studio 的 Android Native Development Kit(NDK)调试 gdb 时遇到错误,特别是指出“加载的共享库缺少*.oat”,那么可能存在与库的Ahead-Of-Time(AOT)编译有关的问题。
*.oat 文件是由 Android Runtime(ART)在为在设备上执行的 Android 应用程序的字节码编译时生成的。在某些情况下,这些*.oat 文件可能未生成或缺失,尤其是对于您正在尝试调试的共享库。
要解决此问题,您可以尝试以下步骤:
  1. 清理并重新构建项目:在Android Studio中,转到“Build” -> “Clean Project”以清理项目,然后转到“Build” -> “Rebuild Project”以重新构建它。此过程确保正确生成所有必要的文件,包括*.oat文件。

  2. 检查您的构建配置:确保项目的构建配置包括生成*.oat文件所需的必要设置。具体来说,请确保您的build.gradle文件中的“minifyEnabled”标志设置为false,因为启用代码缩小和混淆可能会干扰*.oat文件的生成。

    例如:

    android {
        // ...
        buildTypes {
            release {
                // ...
                minifyEnabled false
                // ...
            }
        }
    }
    
  3. 检查您的设备:如果您正在物理Android设备上进行调试,请确保该设备运行支持AOT编译和*.oat文件的兼容版本的Android。一些自定义ROM或修改的Android版本可能无法正确生成*.oat文件。

  4. 更新您的Android Studio和SDK工具:确保您使用的是最新版本的Android Studio,并将Android SDK工具更新到最新可用版本。这可以确保您拥有与NDK和调试相关的最新错误修复和改进。

如果上述步骤无法解决问题,提供有关项目设置的更具体细节可能会有所帮助,包括Android Studio版本、NDK版本和任何相关的构建配置。

-2
在您的情况下,gdb无法正确展开堆栈的原因是oat文件未加载。Oat文件由Android Runtime(ART)用于优化Java字节码的执行。当oat文件未加载时,gdb无法读取存储在其中的调试信息,这使得展开堆栈变得困难。
要解决此问题,您需要确保正在调试的共享库加载了oat文件。您可以按照以下步骤操作:
  1. 找到您正在调试的共享库的oat文件。您可以在Android设备的data/dalvik-cache目录中找到这些文件。
  2. 将oat文件复制到与共享库相同的目录中。
  3. 重新启动Android设备。
一旦加载了oat文件,gdb就能够正确地展开堆栈。
在您的情况下,system@framework@boot.oat共享库的oat文件未加载。您可以将此文件复制到Android设备的data/dalvik-cache目录中,然后重新启动设备。这样应该可以解决问题并允许gdb正确展开堆栈。
以下是一些额外需要注意的事项:
确保Android设备运行的是支持oat文件的兼容版本。 确保你要调试的共享库是编译带有调试信息的。 如果仍然遇到问题,可以尝试使用不同版本的gdb。

根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接