Wow… three months since my last post about my Android Clock Widget Project. While I’ve failed to bring stability to the clock selector during that time, I have figured out that the problem is not actually due to a deadlock. Instead, it appears that my project is tickling a bug in the Dalvik VM’s garbage collector.
Depending on the device and operating system level, there are subtle changes in behavior. In most cases, there is a crash log written to the /data/tombstones folder. The most revealing tombstone file has come from a Samsung Captivate running a version of the AOKP ICS ROM.
Build fingerprint: 'samsung/SGH-I897/SGH-I897:2.3.5/GINGERBREAD/UCKK4:user/release-keys' pid: 1758, tid: 1777 >>> com.seterasoft.mclock <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad r0 deadbaad r1 00000001 r2 40000000 r3 00000000 r4 00000000 r5 00000027 r6 50c53b40 r7 00000064 r8 41338018 r9 00000024 10 50c53a6c fp 50c53ab0 ip ffffffff sp 50c53a30 lr 400fdf79 pc 400fa694 cpsr 60000030 d0 0000000000000000 d1 0000000000000000 d2 0000000000000000 d3 0000000000000000 d4 0000000000000000 d5 0000000000000000 d6 0000000000000000 d7 0000000000000000 d8 0000000000000000 d9 0000000000000000 d10 0000000000000000 d11 0000000000000000 d12 0000000000000000 d13 0000000000000000 d14 0000000000000000 d15 0000000000000000 d16 0000000000000000 d17 0000000000000000 d18 0000000000000000 d19 0000000000000000 d20 0000000000000000 d21 0000000000000000 d22 0000000000000000 d23 0000000000000000 d24 0000000000000000 d25 0000000000000000 d26 0000000000000000 d27 0000000000000000 d28 0100010001000100 d29 0100010001000100 d30 0000000000000000 d31 3ff0000000000000 scr 2800001b #00 pc 00017694 /system/lib/libc.so #01 pc 00007bb0 /system/lib/libcutils.so (mspace_merge_objects) #02 pc 0007b6c8 /system/lib/libdvm.so (_Z21dvmHeapSourceFreeListjPPv) #03 pc 00042ce0 /system/lib/libdvm.so #04 pc 00032f94 /system/lib/libdvm.so (_Z22dvmHeapBitmapSweepWalkPK10HeapBitmapS1_jjPFvjPPvS2_ES2_) #05 pc 00042c9c /system/lib/libdvm.so (_Z27dvmHeapSweepUnmarkedObjectsbbPjS_) #06 pc 000337c0 /system/lib/libdvm.so (_Z25dvmCollectGarbageInternalPK6GcSpec) #07 pc 0005ff6c /system/lib/libdvm.so (_Z17dvmCollectGarbagev) #08 pc 00072a8e /system/lib/libdvm.so #09 pc 00030a8c /system/lib/libdvm.so #10 pc 00034248 /system/lib/libdvm.so (_Z12dvmInterpretP6ThreadPK6MethodP6JValue) #11 pc 0006c692 /system/lib/libdvm.so (_Z14dvmCallMethodVP6ThreadPK6MethodP6ObjectbP6JValueSt9__va_list) #12 pc 0006c6b4 /system/lib/libdvm.so (_Z13dvmCallMethodP6ThreadPK6MethodP6ObjectP6JValuez) #13 pc 0005f7c0 /system/lib/libdvm.so #14 pc 00012c14 /system/lib/libc.so (__thread_entry) #15 pc 00012744 /system/lib/libc.so (pthread_create)
The failing function appears to be implemented in dlmalloc.c in the Android source, but I really don't have any good idea about what might be causing the crash. I also don't appear to be the only one, as there are other references on the web that look similar.
To this point, I've tried a variety of things to try to track down the problem. I've gone so far as to try to build my own version of the Cyanogenmod with the idea that I might be able to add more logging output. So far, I've not had any luck with this approach. I generally have no problem walking away from hobby projects when I lose interest. However, this has turned into a competition of me versus the computer and I'm not quite ready to give up.