草庐IT

Android dalvik 垃圾收集可能会崩溃?

coder 2023-12-04 原文

我们正在为 Android jelly bean 开发一个项目。我们的平台是arm-based,内核版本是3.1.10。在我们的开发过程中,我们发现在dalvik中发生应用崩溃的概率非常低。根据以下回溯日志,崩溃出现在垃圾收集功能期间。使用addr2line分析pc地址后,发现问题发生时obj->clazz变成了违规地址。

代码流程是: (dvmHeapScanMarkedObjects -> processMarkStack->scanObject->(IS_CLASS_FLAG_SET(obj->clazz,CLASS_ISARRAY)))

现在我们卡在这里,找不到解决的办法。所以我们需要更多的建议和帮助。

有谁知道这个问题或如何继续检查它?

回溯日志如下:

F/libc    (  912): Fatal signal 11 (SIGSEGV) at 0x00000025 (code=1), thread 912 (zygote)
I/DEBUG   (  910): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***I/DEBUG   (  910): Revision: '32'
I/DEBUG   (  910): pid: 912, tid: 912, name: zygote  >>> zygote <<<
I/DEBUG   (  910): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000025
I/DEBUG   (  910):     r0 00000005  r1 41246df0  r2 44208890  r3 412471e8
I/DEBUG   (  910):     r4 40e3c1b8  r5 412569c0  r6 40e3c1b8  r7 41246df0
I/DEBUG   (  910):     r8 0000154c  r9 00000000  sl 000798e4  fp 7fffffff
I/DEBUG   (  910):     ip 51b2c044  sp bee580c0  lr 40dc5b88  pc 40dc598c  cpsr 80000010
I/DEBUG   (  910):     d0  6e69737275636567  d1  6f7268540000fa2e
I/DEBUG   (  910):     d2  573752085737512e  d3  573752785737522e
I/DEBUG   (  910):     d4  5737527857375240  d5  573841a0573752b0
I/DEBUG   (  910):     d6  00010000573841d8  d7  000000614ac3ff00
I/DEBUG   (  910):     d8  0000000000000000  d9  0000000000000000
I/DEBUG   (  910):     d10 0000000000000000  d11 0000000000000000
I/DEBUG   (  910):     d12 0000000000000000  d13 0000000000000000
I/DEBUG   (  910):     d14 0000000000000000  d15 0000000000000000
I/DEBUG   (  910):     d16 0000000000019a5c  d17 0000000000019a5c
I/DEBUG   (  910):     d18 0000000000000000  d19 3fe8000000000000
I/DEBUG   (  910):     d20 0000000000000000  d21 0000000000000000
I/DEBUG   (  910):     d22 0000000000000000  d23 0000000000000000
I/DEBUG   (  910):     d24 0000000000000000  d25 0000000000000000
I/DEBUG   (  910):     d26 0000000000000000  d27 0000000000000000
I/DEBUG   (  910):     d28 0000000000000000  d29 0000000000000000
I/DEBUG   (  910):     d30 0000000000000000  d31 0000000000000000
I/DEBUG   (  910):     scr 60000010
I/DEBUG   (  910):
I/DEBUG   (  910): backtrace:
I/DEBUG   (  910):     #00  pc 0003798c  /system/lib/libdvm.so
I/DEBUG   (  910):     #01  pc 00037b84  /system/lib/libdvm.so
I/DEBUG   (  910):     #02  pc 000298c0  /system/lib/libdvm.so (dvmCollectGarbageInternal(GcSpec const*)+196)
I/DEBUG   (  910):     #03  pc 0002a0bc  /system/lib/libdvm.so (dvmMalloc(unsigned int, int)+152)
I/DEBUG   (  910):     #04  pc 00054f57  /system/lib/libdvm.so (dvmAllocObject+6)
I/DEBUG   (  910):     #05  pc 0001ecb0  /system/lib/libdvm.so
I/DEBUG   (  910):     #06  pc 0002b754  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
I/DEBUG   (  910):     #07  pc 0005fe09  /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
I/DEBUG   (  910):     #08  pc 0005fe33  /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
I/DEBUG   (  910):     #09  pc 000539c9  /system/lib/libdvm.so (dvmPrepMainThread()+188)
I/DEBUG   (  910):     #10  pc 00047c65  /system/lib/libdvm.so (dvmStartup(int, char const* const*, bool, _JNIEnv*)+1108)
I/DEBUG   (  910):     #11  pc 0004dd8d  /system/lib/libdvm.so (JNI_CreateJavaVM+544)
I/DEBUG   (  910):     #12  pc 00047227  /system/lib/libandroid_runtime.so (android::AndroidRuntime::startVm(_JavaVM**, _JNIEnv**)+1626)
I/DEBUG   (  910):     #13  pc 000476bd  /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+176)
I/DEBUG   (  910):     #14  pc 00000db7  /system/bin/app_process
I/DEBUG   (  910):
I/DEBUG   (  910): stack:
I/DEBUG   (  910):          bee58080  00000000
I/DEBUG   (  910):          bee58084  40dc599c  /system/lib/libdvm.so
I/DEBUG   (  910):          bee58088  41247f38  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (  910):          bee5808c  000003f0
I/DEBUG   (  910):          bee58090  000000fd
I/DEBUG   (  910):          bee58094  00000000
I/DEBUG   (  910):          bee58098  41246ebc  [heap]
I/DEBUG   (  910):          bee5809c  40db7578  /system/lib/libdvm.so (dvmHeapBitmapScanWalk(HeapBitmap*, void (*)(Object*, void*, void*), void*)+128)
I/DEBUG   (  910):          bee580a0  40dc5b9c  /system/lib/libdvm.so
I/DEBUG   (  910):          bee580a4  41247f38  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (  910):          bee580a8  40e3c1b8  /system/lib/libdvm.so
I/DEBUG   (  910):          bee580ac  412569a0  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (  910):          bee580b0  40e3c1b8  /system/lib/libdvm.so
I/DEBUG   (  910):          bee580b4  41246df0  [heap]
I/DEBUG   (  910):          bee580b8  df0027ad
I/DEBUG   (  910):          bee580bc  00000000
I/DEBUG   (  910):     #00  bee580c0  51b2c048  /dev/ashmem/dalvik-mark-stack (deleted)
I/DEBUG   (  910):          bee580c4  41246df0  [heap]
I/DEBUG   (  910):          bee580c8  41246dd8  [heap]
I/DEBUG   (  910):          bee580cc  40e3c1b8  /system/lib/libdvm.so
I/DEBUG   (  910):          bee580d0  00000001
I/DEBUG   (  910):          bee580d4  40dc5b88  /system/lib/libdvm.so
I/DEBUG   (  910):     #01  bee580d8  40e34aa8  /system/lib/libdvm.so
I/DEBUG   (  910):          bee580dc  40db78c4  /system/lib/libdvm.so (dvmCollectGarbageInternal(GcSpec const*)+200)
I/DEBUG   (  910):     #02  bee580e0  bee58124  [stack]
I/DEBUG   (  910):          bee580e4  40df9095  /system/lib/libdvm.so
I/DEBUG   (  910):          bee580e8  5855879e  /data/dalvik-cache/system@framework@core.jar@classes.dex
I/DEBUG   (  910):          bee580ec  40087010
I/DEBUG   (  910):          bee580f0  5855879e  /data/dalvik-cache/system@framework@core.jar@classes.dex
I/DEBUG   (  910):          bee580f4  410be000  /dev/ashmem/dalvik-aux-structure (deleted)
I/DEBUG   (  910):          bee580f8  00000000
I/DEBUG   (  910):          bee580fc  00000000
I/DEBUG   (  910):          bee58100  000006db
I/DEBUG   (  910):          bee58104  410be000  /dev/ashmem/dalvik-aux-structure (deleted)
I/DEBUG   (  910):          bee58108  00000000
I/DEBUG   (  910):          bee5810c  410f55cc  /dev/ashmem/dalvik-aux-structure (deleted)
I/DEBUG   (  910):          bee58110  412569d8  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (  910):          bee58114  41248338  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (  910):          bee58118  41248338  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (  910):          bee5811c  40e3c1b8  /system/lib/libdvm.so
I/DEBUG   (  910):          ........  ........

最佳答案

啊,遇到类似问题,我花了很长时间分析情况。希望我的分析对你有帮助。

对于我的问题,问题是因为编译器对内存重新排序。在 dalvik 中,多个线程共享公共(public)内存 ASHMEM 。由于编译器为优化而重新排序内存,此 ASHMEM 可能已损坏。 为避免在特定点执行内存屏障(AKA membar)的内存重新排序。 Check this link for executing membar

只需在垃圾收集内存分配器(如 dalvik/vm/alloc/alloc.cpp)和 class.cpp 数组中的对象分配和对象释放之前放置一个内存屏障 ANDROID_MEMBAR_BARRIER()。 android源码dalvik目录下的cpp和proxy.cpp。这应该可以解决问题。

有关内存屏障的更多信息,请查看以下链接

memory barrier

example

关于 Hardware View of Memory Barriers 的白皮书

关于Android dalvik 垃圾收集可能会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15069920/

有关Android dalvik 垃圾收集可能会崩溃?的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  4. Ruby Regex,获取所有可能的匹配项(不截断字符串) - 2

    我遇到了ruby​​正则表达式的问题。我需要找到所有(可能重叠的)匹配项。这是问题的简化:#Simpleexample"Hey".scan(/../)=>["He"]#Actualresults#Withoverlappingmatchestheresultshouldbe=>["He"],["ey"]我尝试执行并获得所有结果的正则表达式如下所示:"aaaaaa".scan(/^(..+)\1+$/)#Thislooksformultiplesof(here)"a"biggerthanonethat"fills"theentirestring."aa"*3=>true,"aaa"*2=

  5. ruby - 在 Ruby 数组中收集重复项的最快/单行方法? - 2

    像这样转换数组的最快/单行方法是什么:[1,1,1,1,2,2,3,5,5,5,8,13,21,21,21]...进入像这样的对象数组:[{1=>4},{2=>2},{3=>1},{5=>3},{8=>1},{13=>1},{21=>3}] 最佳答案 要获得所需的格式,您可以附加一个调用以映射到您的解决方案:array.inject({}){|h,v|h[v]||=0;h[v]+=1;h}.map{|k,v|{k=>v}}虽然它仍然是单行的,但它开始变得凌乱了。 关于ruby-在Ruby

  6. ruby - 在多个线程中引用类方法会导致自动加载循环依赖崩溃 - 2

    代码:threads=[]Thread.abort_on_exception=truebegin#throwexceptionsinthreadssowecanseethemthreadseputs"EXCEPTION:#{e.inspect}"puts"MESSAGE:#{e.message}"end崩溃:.rvm/gems/ruby-2.1.3@req/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:478:inload_missing_constant':自动加载常量MyClass时检测到循环依赖稍加研究后,

  7. ruby-on-rails - 为什么 Devise/Omniauth 会向 URL 添加垃圾? - 2

    使用facebook登录后,我被重定向到/#_=_,其中显示主页。这种垃圾也出现在其他URL中,例如当注册失败并被重定向到/users/sign_in#_=_为什么会发生这种情况,我该如何解决? 最佳答案 如果你真的不想要它,一些简单的javascript就可以了:if(window.location.hash=="#_=_"){window.location.hash="";} 关于ruby-on-rails-为什么Devise/Omniauth会向URL添加垃圾?,我们在StackO

  8. ruby-on-rails - ActionMailer HTML 编码 hell - 特殊字符替换为垃圾 - 2

    我有UTF-8字符串:Website•Facebook那是中间的一颗子弹又名•或0xE20x800xA2此值已正确存储在数据库中,并使用默认设置使用Rails3和ruby​​1.9.3正确显示在屏幕上。我正在尝试通过HTML电子邮件发送此邮件,但是当一切都说完之后,接收端看到的是垃圾:这背后的代码很简单,我有一个ActionMailer子类(默认使用UTF-8)设置以在布局中发送带有UTF-8内容编码的HTML电子邮件:email.html.erb布局文件:"all"%>内容使用与呈现网页相同的View,重要的一行是:我已经尝试了很多很多force_encoding的排列,e

  9. ruby-on-rails - 是否有可能发现 Ruby on Rails 应用程序中未使用哪些类? - 2

    在我们的项目中,我们有一些“被遗忘的”类存在了很长一段时间。那些类已被其他类替代,但我们忘记删除它们。是否有一些自动化的方法/工具可以发现Ruby{onRails}应用程序中没有使用哪些类?谢谢! 最佳答案 这个问题已经被提出了很多次,但是最好的答案都在这里:FindunusedcodeinaRailsapp我个人喜欢日志解析:https://stackoverflow.com/a/14161807但在任何情况下,您都可以创建自己的记录器,扩展ActiveRecord::Base以创建一个观察器,该观察器将最常用的模块存储在数据库中

  10. ruby - Class 怎么可能属于 Class 类而没有 Class 实例方法呢? - 2

    我正在研究Ruby解释器是如何实现的,并且出现了一个问题,但我还没有得到答案。这就是标题中的那个:因为Class(r_cClass)将super设置为自身(忽略元类,因为实际上super是r_cClass的元类),如果我向Class对象发送一个方法,这将在Class的方法表中查找'类(class)。但是Class的类是Class,所以我不应该最终寻找Class的实例方法吗?但事实并非如此,因为在文档中Class类方法和Class实例方法是分开的。在Ruby的eval.c中的search_method中,我没有发现对Class类有什么特别的检查。任何人都可以阐明这一点吗?

随机推荐