*Issue Summary:* Framework reboot due to native crash in zygote crash with 
SIGSEGV error.

 

*Reproduction:*  Long duration test with multiple apps and reproduction 
rate – 1/100.

 

*Description:*

 

Below is the tombstone for zygote:

 

        Line 56603:07-08 10:19:39.605 26565 26565 F DEBUG   : Build 
fingerprint: 
------------------------------------------------------------------
        Line 56604: 07-08 10:19:39.605 26565 26565 F DEBUG   : Revision: '0'
        Line 56605: 07-08 10:19:39.605 26565 26565 F DEBUG   : ABI: 'arm'
        Line 56608: 07-08 10:19:39.606 26565 26565 F DEBUG   : pid: 652, 
tid: 26546, name: HeapTaskDaemon  >>> zygote <<<
        Line 56609: 07-08 10:19:39.606 26565 26565 F DEBUG   : signal 11 
(SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x130
        Line 56610: 07-08 10:19:39.606 26565 26565 F DEBUG   : Cause: null 
pointer dereference
        Line 56611: 07-08 10:19:39.606 26565 26565 F DEBUG   :     r0 
 dec0b000  r1  5616eb84  r2  00000007  r3  00000000
        Line 56612: 07-08 10:19:39.606 26565 26565 F DEBUG   :     r4 
 00000130  r5  cd7929c8  r6  00000000  r7  e4fdc380
        Line 56613: 07-08 10:19:39.606 26565 26565 F DEBUG   :     r8 
 cd7924bc  r9  00000000  r10 00000002  r11 00008a0c
        Line 56614: 07-08 10:19:39.607 26565 26565 F DEBUG   :     ip 
 e49b8974  sp  cd7924b0  lr  e45e1507  pc  e45ec316
        Line 56712: 07-08 10:19:39.730 26565 26565 F DEBUG   : 
        Line 56713: 07-08 10:19:39.730 26565 26565 F DEBUG   : backtrace:
        Line 56715: 07-08 10:19:39.730 26565 26565 F DEBUG   :     #00 pc 
000aa316  /system/lib/libart.so (art::TimingLogger::Reset()+106)
        Line 56716: 07-08 10:19:39.730 26565 26565 F DEBUG   :     #01 pc 
0016663b  /system/lib/libart.so 
(art::gc::collector::GarbageCollector::Run(art::gc::GcCause, bool)+178)
        Line 56717: 07-08 10:19:39.730 26565 26565 F DEBUG   :     #02 pc 
0018035d  /system/lib/libart.so 
(art::gc::Heap::CollectGarbageInternal(art::gc::collector::GcType, 
art::gc::GcCause, bool)+2420)
        Line 56718: 07-08 10:19:39.730 26565 26565 F DEBUG   :     #03 pc 
0018dbeb  /system/lib/libart.so (art::gc::Heap::ConcurrentGC(art::Thread*, 
art::gc::GcCause, bool)+182)
        Line 56719: 07-08 10:19:39.730 26565 26565 F DEBUG   :     #04 pc 
00191b11  /system/lib/libart.so 
(art::gc::Heap::ConcurrentGCTask::Run(art::Thread*)+20)
        Line 56720: 07-08 10:19:39.730 26565 26565 F DEBUG   :     #05 pc 
001aa957  /system/lib/libart.so 
(art::gc::TaskProcessor::RunAllTasks(art::Thread*)+34)
        Line 56721: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #06 pc 
0007463b  /system/framework/arm/boot-core-libart.oat (offset 0x73000) 
(dalvik.system.VMRuntime.clampGrowthLimit [DEDUPED]+74)
        Line 56722: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #07 pc 
0014a85d  /system/framework/arm/boot-core-libart.oat (offset 0x73000) 
(java.lang.Daemons$HeapTaskDaemon.runInternal+172)
        Line 56723: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #08 pc 
000ec963  /system/framework/arm/boot-core-libart.oat (offset 0x73000) 
(java.lang.Daemons$Daemon.run+66)
        Line 56724: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #09 pc 
002151b1  /system/framework/arm/boot-core-oj.oat (offset 0x106000) 
(java.lang.Thread.run+64)
        Line 56725: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #10 pc 
00411575  /system/lib/libart.so (art_quick_invoke_stub_internal+68)
        Line 56726: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #11 pc 
003eb045  /system/lib/libart.so (art_quick_invoke_stub+224)
        Line 56727: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #12 pc 
000a183d  /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, 
unsigned int*, unsigned int, art::JValue*, char const*)+136)
        Line 56728: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #13 pc 
003498d5  /system/lib/libart.so (art::(anonymous 
namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable 
const&, art::ArtMethod*, art::(anonymous namespace)::ArgArray*, 
art::JValue*, char const*)+52)
        Line 56729: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #14 pc 
0034a62d  /system/lib/libart.so 
(art::InvokeVirtualOrInterfaceWithJValues(art::ScopedObjectAccessAlreadyRunnable
 
const&, _jobject*, _jmethodID*, jvalue*)+320)
        Line 56730: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #15 pc 
0036d0a3  /system/lib/libart.so (art::Thread::CreateCallback(void*)+866)
        Line 56731: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #16 pc 
00072dcd  /system/lib/libc.so (__pthread_start(void*)+22)
        Line 56732: 07-08 10:19:39.731 26565 26565 F DEBUG   :     #17 pc 
0001e3b1  /system/lib/libc.so (__start_thread+24)

 

 

One more observation is that we saw few app crashes prior to zygote crash 
in the path of zygote forking these apps.

 

pid: 17395, tid: 17395, name: o.android.imoi  >>> zygote <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4
Cause: null pointer dereference
    r0  00000000  r1  8b148311  r2  00000000  r3  00000000
    r4  e4bdc424  r5  e4bdc420  r6  e4b97a64  r7  e4bdc3c8
    r8  e4bc8000  r9  e4bdc448  r10 00003000  r11 00000003
    ip  000000ff  sp  ffbe1230  lr  e41e7dd5  pc  e41e7de8

backtrace:
    #00 pc 000a8de8  /system/lib/libart.so 
(art::CumulativeLogger::Reset()+68)
    #01 pc 00166901  /system/lib/libart.so 
(art::gc::collector::GarbageCollector::      ()+192)
    #02 pc 0017d853  /system/lib/libart.so 
(art::gc::Heap::ResetGcPerformanceInfo()+34)
    #03 pc 003570db  /system/lib/libart.so 
(art::Runtime::InitNonZygoteOrPostFork(_JNIEnv*, bool, 
art::Runtime::NativeBridgeAction, char const*, bool)+74)
    #04 pc 002e8fb7  /system/lib/libart.so 
(art::ZygoteHooks_nativePostForkChild(_JNIEnv*, _jclass*, long long, int, 
unsigned char, unsigned char, _jstring*)+3146)
    #05 pc 00074c63  /system/framework/arm/boot-core-libart.oat (offset 
0x73000) (dalvik.system.ZygoteHooks.nativePostForkChild+154)
    #06 pc 000eba15  /system/framework/arm/boot-core-libart.oat (offset 
0x73000) (dalvik.system.ZygoteHooks.postForkChild+68)
    #07 pc 00ba0ab9  /system/framework/arm/boot-framework.oat (offset 
0x393000) (com.android.internal.os.Zygote.callPostForkChildHooks+80)
    #08 pc 00412975  /system/lib/libart.so 
(art_quick_invoke_stub_internal+68)
    #09 pc 003eaec7  /system/lib/libart.so 
(art_quick_invoke_static_stub+222)
    #10 pc 000a184f  /system/lib/libart.so 
(art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, 
art::JValue*, char const*)+154)
    #11 pc 00349655  /system/lib/libart.so (art::(anonymous 
namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable 
const&, art::ArtMethod*, art::(anonymous namespace)::ArgArray*, 
art::JValue*, char const*)+52)
    #12 pc 0034947f  /system/lib/libart.so 
(art::InvokeWithVarArgs(art::ScopedObjectAccessAlreadyRunnable const&, 
_jobject*, _jmethodID*, std::__va_list)+310)
    #13 pc 00290219  /system/lib/libart.so 
(art::JNI::CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, 
std::__va_list)+444)
    #14 pc 0006e579  /system/lib/libandroid_runtime.so 
(_JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, ...)+28)
    #15 pc 0011c2ed  /system/lib/libandroid_runtime.so ((anonymous 
namespace)::ForkAndSpecializeCommon(_JNIEnv*, unsigned int, unsigned int, 
_jintArray*, int, _jobjectArray*, long long, long long, int, _jstring*, 
_jstring*, bool, _jintArray*, _jintArray*, bool, _jstring*, _jstring*)+4052)
    #16 pc 0011ab37  /system/lib/libandroid_runtime.so 
(android::com_android_internal_os_Zygote_nativeForkAndSpecialize(_JNIEnv*, 
_jclass*, int, int, _jintArray*, int, _jobjectArray*, int, _jstring*, 
_jstring*, _jintArray*, _jintArray*, unsigned char, _jstring*, 
_jstring*)+470)
    #17 pc 003b8ba3  /system/framework/arm/boot-framework.oat (offset 
0x393000) (com.android.internal.os.Zygote.nativeForkAndSpecialize+338)
    #18 pc 00ba3a8b  /system/framework/arm/boot-framework.oat (offset 
0x393000) (com.android.internal.os.ZygoteConnection.processOneCommand+1450)
    #19 pc 00ba7a5b  /system/framework/arm/boot-framework.oat (offset 
0x393000) (com.android.internal.os.ZygoteServer.runSelectLoop+770)
    #20 pc 00ba5269  /system/framework/arm/boot-framework.oat (offset 
0x393000) (com.android.internal.os.ZygoteInit.main+1696)
    #21 pc 00412975  /system/lib/libart.so 
(art_quick_invoke_stub_internal+68)
    #22 pc 003eaec7  /system/lib/libart.so 
(art_quick_invoke_static_stub+222)
    #23 pc 000a184f  /system/lib/libart.so 
(art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, 
art::JValue*, char const*)+154)
    #24 pc 00349655  /system/lib/libart.so (art::(anonymous 
namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable 
const&, art::ArtMethod*, art::(anonymous namespace)::ArgArray*, 
art::JValue*, char const*)+52)
    #25 pc 0034947f  /system/lib/libart.so 
(art::InvokeWithVarArgs(art::ScopedObjectAccessAlreadyRunnable const&, 
_jobject*, _jmethodID*, std::__va_list)+310)
    #26 pc 00290219  /system/lib/libart.so 
(art::JNI::CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, 
std::__va_list)+444)
    #27 pc 0006e579  /system/lib/libandroid_runtime.so 
(_JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, ...)+28)
    #28 pc 0007073b  /system/lib/libandroid_runtime.so 
(android::AndroidRuntime::start(char const*, 
android::Vector<android::String8> const&, bool)+462)
    #29 pc 00001c8f  /system/bin/app_process32 (main+1122)
    #30 pc 000a2245  /system/lib/libc.so (__libc_init+48)
    #31 pc 000017eb  /system/bin/app_process32 (_start_main+38)
    #32 pc 000000c4  <unknown>

 

 

*Analysis:*

 

Loaded coredump in GDB:

 

#0  art::TimingLogger::Reset (this=0x130) at 
art/runtime/base/timing_logger.cc:148
No locals.
#1  0xe46a863e in Reset (this=0x120, gc_cause=<optimized out>, 
clear_soft_references=<optimized out>) at 
art/runtime/gc/collector/garbage_collector.cc:49
No locals.
#2  art::gc::collector::GarbageCollector::Run (this=0xe4fdc380, 
gc_cause=art::gc::kGcCauseBackground, clear_soft_references=true) at 
art/runtime/gc/collector/garbage_collector.cc:92
        start_time = 151785656375586
        current_iteration = 0x120
        end_time = <optimized out>
        self = <optimized out>
#3  0xe46c2360 in art::gc::Heap::CollectGarbageInternal (this=0xe4f3c800, 
gc_type=art::gc::collector::kGcTypeFull, 
gc_cause=art::gc::kGcCauseBackground, clear_soft_references=<optimized out>)
    at art/runtime/gc/heap.cc:2648
        runtime = 0xe4f3c400
        self = 0xe42acc00
        collector = 0xe4fdc380
#4  0xe46cfbee in art::gc::Heap::ConcurrentGC (this=0xe4f3c800, 
self=0xe42acc00, cause=art::gc::kGcCauseBackground, force_full=<optimized 
out>) at art/runtime/gc/heap.cc:3675
        next_gc_type = art::gc::collector::kGcTypeSticky
        tid = 26546
#5  0xe46d3b14 in art::gc::Heap::ConcurrentGCTask::Run (this=<optimized 
out>, self=0x5616eb84) at art/runtime/gc/heap.cc:3620
        heap = 0xe4f3c800
#6  0xe46ec958 in art::gc::TaskProcessor::RunAllTasks (this=0xe4f30200, 
self=0xe42acc00) at art/runtime/gc/task_processor.cc:129
        task = 0xdec08000
#7  0x720bc63c in ?? ()

 

>From here, we see that at frame 2, current_iteration = 0x120 is holding 
invalid address, which is a member of garbage collector class, see below 
code for reference.

 

In file -- art/runtime/gc/collector/garbage_collector.cc

 

91   Iteration* current_iteration = GetCurrentIteration();
92   current_iteration->Reset(gc_cause, clear_soft_references);

 

 

429   const collector::Iteration* GetCurrentGcIteration() const {
430     return &current_gc_iteration_;
431   }

 

1254   collector::Iteration current_gc_iteration_;

 

And we see the collector object being zeroed out, which seems to be the 
reason for our crash.

 

gdb) f 2
#2  art::gc::collector::GarbageCollector::Run (this=0xe4fdc380, 
gc_cause=art::gc::kGcCauseBackground, clear_soft_references=true) at 
art/runtime/gc/collector/garbage_collector.cc:92
92      in art/runtime/gc/collector/garbage_collector.cc
(gdb) x/100 this
0xe4fdc380:     0       0       0       0
0xe4fdc390:     0       0       0       0
0xe4fdc3a0:     0       0       0       0
0xe4fdc3b0:     0       0       0       0
0xe4fdc3c0:     0       0       0       0
0xe4fdc3d0:     0       0       0       0
0xe4fdc3e0:     0       0       0       0
0xe4fdc3f0:     0       0       0       0
0xe4fdc400:     0       0       0       0
0xe4fdc410:     0       0       0       0
0xe4fdc420:     0       0       0       0
0xe4fdc430:     0       0       0       0
0xe4fdc440:     0       0       0       0
0xe4fdc450:     0       0       0       0
0xe4fdc460:     0       0       0       0
0xe4fdc470:     0       0       0       0
0xe4fdc480:     0       0       0       0
0xe4fdc490:     0       0       0       0
0xe4fdc4a0:     0       0       0       0
0xe4fdc4b0:     0       0       0       0
0xe4fdc4c0:     0       0       0       0
0xe4fdc4d0:     0       0       0       0
0xe4fdc4e0:     0       0       0       0
0xe4fdc4f0:     0       0       0       0

The app crashes seen prior to this zygote crash also seem be to due to 
similar reason, collector object being NULL.

Can you please help to provide any debug suggestions/ share any similar 
instances of this issue ?



Debug approaches we pursued: 
We have internally tried to use ASAN and malloc_debug to check is such 
corruptions can be caught.
Unfortunately, after enabling malloc_debug, issue was not reproducible.
And with ASAN enablement, device runs slow, and results in other unrelated 
issues.


Regards,

Deepika

-- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to android-developers+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/android-developers/ebe1f5f3-fcf0-488e-b087-378dbf7313de%40googlegroups.com.

Reply via email to