当前位置: 首页 > 知识库问答 >
问题:

本地应用程序崩溃-获取内存地址问题-com.android.runtime/lib64/libart.so

寇夜洛
2023-03-14

我正在研究32位NDK项目向64位的迁移。我们在项目中调用了这么多库:比如-libssl.so、libcrypto.so、libc.so、liblog.so、libcrashlytics.so

在这个项目中,我将通过fopen读取内核进程,但不知怎的,我得到了致命的信号错误和Android logcat,如下所示

A/libc:tid 12462(eradocs.android)中的致命信号11(SIGSEGV)、代码1(SEGV_MAPERR)、故障地址0xafef03c4、pid 12462(eradocs.android)

==========================================在堆栈跟踪中找到以下崩溃转储

#00 0x00000000afef03c4-此内存地址与上述致命信号错误匹配。

#06 0x000000000013f350/apex/com.Androidruntime/lib64/libart。so(art_quick_generic_jni_蹦床144)(构建ID:d700c52998d7d76cb39e2001d670e654)

#07 0x00000000001365b8/apex/com.Androidruntime/lib64/libart。so(art_quick_invoke_static_stub 568)(构建ID:d700c52998d7d76cb39e2001d670e654)

#08 0x000000000014500c /apex/com.android.runtime/lib64/libart.so(艺术::Art方法d::调用(艺术::线程*,无符号int*,无符号int,艺术::JValue*,char const*)276)(BuildId: d700c52998d7d76cb39e2001d670e654)

#09 0x00000000002e2928 /apex/com.android.runtime/lib64/libart.so(艺术::解释器::Art解释器ToCompiledCodeBridge(艺术::线程*,艺术::Art方法*,艺术::ShadowFrame*,无符号短,艺术::JValue*)384)(BuildId: d700c52998d7d76cb39e2001d670e654)

#10 0x00000000002ddb88/apex/com.Androidruntime/lib64/libart。所以(bool艺术::解释器::DoCall)

#11 0x00000000005a28ac /apex/com.android.runtime/lib64/libart.so(MterpInvokeStatic 372)(BuildId: d700c52998d7d76cb39e2001d670e654)

#12 0x0000000000130994/apex/com.Androidruntime/lib64/libart。so(mterp_op_invoke_static 20)(构建ID:d700c52998d7d76cb39e2001d670e654)

#14 0x00000000002b3c3c /apex/com.android.runtime/lib64/libart.so

有人能帮我查一下这个stacktrace吗?有没有办法找到根本原因?

共有1个答案

闾丘朗
2023-03-14

我敢打赌,你的一个库利用了funopen技巧,能够从本地代码中读取资产。这个技巧曾经奏效,但是随着Android和NDK的发展,这个黑客很快变得或多或少过时了。我一直使用它,直到我升级了NDK,并遇到了类似的崩溃。

请参见NDK问题#562和这篇旧博客文章。两者都提到了这个SIGSEGV错误。

一些快速提示包括:

  • 检查是否定义了源代码
  • 你升级了NDK吗
  • 您是否更改了minSdkVersion
  • 您是否从gcc更改为Clang

我对这次崩溃的解决方案是完全避免funopen

 类似资料:
  • 在谷歌Play上部署我的Flitter应用程序后,它在启动时崩溃。它为2台设备(Google Test devices on Play)工作,并为其他设备提供以下错误。 问题:java.lang.不满意LinkError:dalvik.system.PathClassLoader[DexPathList[[[zip file"/data/app/abc.pota.tallxy-1/base.apk

  • 下面给出的错误 process:com.example.rahul.maptask,pid:21986 java.lang.runtimeException:无法启动活动ComponentInfo{com.example.rahul.maptask/com.example.rahul.maptask.mainactivity}:java.lang.nullpointerException:试图在A

  • 这是一个用于x86处理器的简单dos汇编程序。这是一个简单的helloworld程序。 我不明白的是图像中下面的连续内存地址。程序似乎从十六进制中的地址0100开始,即256。下一个地址是258。差异似乎是2个字节。是不是这样指令(操作码地址)是2个字节? 然后再往下-mov dx指令似乎占用3个字节(0117-011A),而mov ah指令占用2个字节。 我以为指令(操作码地址)应该在内存中占用

  • 我正在尝试使用地址消毒剂与MSVC。 Visual Studio安装程序说我有“Visual Studio Community 2019”16.9.0版。 我有最基本的C++程序: cmakelists.txt也是非常基本的: 程序在调试和发布模式下都能正确地编译和链接。在发布模式下,我有以下警告,这似乎是完全合法的: LINK:warning LNK4302:请将“/debug”添加到LINK命

  • 问题内容: 最近,我一直在从事我的一个小项目,该项目是使用Java为本地游戏(C / C ++ / etc)进行内存读取/写入。 目前,我有一个可以读写游戏内存的基址,但是现在我需要一种方法来获取正在运行的应用程序的基址。例如: 我有使用作弊引擎及其指针搜索器收集的指针列表。这些是稳定的,并且在每次游戏重新加载时都能正常工作。 我现在面临的问题是,第一个指针使用程序的基址(每次重新启动程序时都会更