I've been unsuccessfully trying to debug a sporadic crash in Emacs,
which only occurs on two specific devices running Android 8.0.0 and
8.1.0:
Build fingerprint:
'vivo/PD1818G/PD1818G:8.1.0/OPM1.171019.026/compil08012129:user/release-keys'
and:
Build fingerprint:
'docomo/SO-04H/SO-04H:8.0.0/41.3.B.1.41/762327233:user/release-keys'
where, in both cases, the backtrace ends in a worker thread,
apparently created by Skia:
#00 pc 00000000005ec0c0 /system/lib64/libskia.so
(_Z13blitRect_corePN8SkShader7ContextEiiiiPjmbbP10SkXfermodePFvS2_PKjijES2_+768)
#01 pc 00000000005ec1b0 /system/lib64/libskia.so
(_Z15worker_blitRectPv+128)
#02 pc 00000000000668a0 /system/lib64/libc.so
(_ZL15__pthread_startPv+36)
#03 pc 000000000001f374 /system/lib64/libc.so (__start_thread+68)
in response to a call to `Canvas.drawBitmap':
#0 0x0000007b9ee67868 in (anonymous namespace)::Sk4pxXfermode<(anonymous
namespace)::SrcIn>::xfer32(unsigned int*, unsigned int const*, int,
unsigned char const*) const () from target:/system/lib64/libskia.so
#1 0x0000007b9eeceda0 in Sprite_D32_S32A_Xfer::blitRect(int, int, int,
int) () from target:/system/lib64/libskia.so
#2 0x0000007b9eeb580c in SkScan::FillIRect(SkIRect const&, SkRegion
const*, SkBlitter*) () from target:/system/lib64/libskia.so
#3 0x0000007b9eeb5a1c in SkScan::FillIRect(SkIRect const&, SkRasterClip
const&, SkBlitter*) () from target:/system/lib64/libskia.so
#4 0x0000007b9ee1204c in SkDraw::drawBitmap(SkBitmap const&, SkMatrix
const&, SkRect const*, SkPaint const&) const () from
target:/system/lib64/libskia.so
#5 0x0000007b9ed6cc54 in SkBitmapDevice::drawBitmapRect(SkBitmap const&,
SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint)
() from target:/system/lib64/libskia.so
#6 0x0000007b9ee0b5d0 in SkBaseDevice::drawImageRect(SkImage const*,
SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint)
() from target:/system/lib64/libskia.so
#7 0x0000007b9ed8ca78 in SkCanvas::onDrawImageRect(SkImage const*, SkRect
const*, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) () from
target:/system/lib64/libskia.so
#8 0x0000007b9edf86a4 in SkColorSpaceXformCanvas::onDrawImageRect(SkImage
const*, SkRect const*, SkRect const&, SkPaint const*,
SkCanvas::SrcRectConstraint) () from target:/system/lib64/libskia.so
#9 0x0000007b9c211ea8 in android::SkiaCanvas::drawBitmap(android::Bitmap&,
float, float, float, float, float, float, float, float, SkPaint const*) ()
from target:/system/lib64/libhwui.so
#10 0x0000007b9be65940 in android::CanvasJNI::drawBitmapRect(_JNIEnv*,
_jobject*, long, _jobject*, float, float, float, float, float, float,
float, float, long, int, int) () from
target:/system/lib64/libandroid_runtime.so
#11 0x0000000071626b00 in android.graphics.BaseCanvas.nDrawBitmap () from
target:/system/framework/arm64/boot-framework.oat
#12 0x0000007b1b028a50 in art_quick_invoke_static_stub () from
target:/system/lib64/libart.so
#13 0x0000007b1abbcfb4 in art::ArtMethod::Invoke(art::Thread*, unsigned
int*, unsigned int, art::JValue*, char const*) () from
target:/system/lib64/libart.so
#14 0x0000007b1ad7a294 in
art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*,
art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*) () from
target:/system/lib64/libart.so
#15 0x0000007b1ad757c0 in bool art::interpreter::DoCall<true,
false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction
const*, unsigned short, art::JValue*) () from target:/system/lib64/libart.so
#16 0x0000007b1b0133bc in MterpInvokeStaticRange () from
target:/system/lib64/libart.so
#17 0x0000007b1b01aa18 in artMterpAsmInstructionStart () from
target:/system/lib64/libart.so
#18 0x0000007b1ad54ce0 in art::interpreter::Execute(art::Thread*,
art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue, bool) ()
from target:/system/lib64/libart.so
#19 0x0000007b1ad5a8e8 in
art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*,
art::DexFile::CodeItem const*, art::ShadowFrame*, art::JValue*) () from
target:/system/lib64/libart.so
#20 0x0000007b1ad7485c in bool art::interpreter::DoCall<false,
false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction
const*, unsigned short, art::JValue*) () from target:/system/lib64/libart.so
#21 0x0000007b1b0110a8 in MterpInvokeSuper () from
target:/system/lib64/libart.so
#22 0x0000007b1b01a618 in artMterpAsmInstructionStart () from
target:/system/lib64/libart.so
#23 0x0000007b1ad54ce0 in art::interpreter::Execute(art::Thread*,
art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue, bool) ()
from target:/system/lib64/libart.so
#24 0x0000007b1ad5a8e8 in
art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*,
art::DexFile::CodeItem const*, art::ShadowFrame*, art::JValue*) () from
target:/system/lib64/libart.so
#25 0x0000007b1ad7485c in bool art::interpreter::DoCall<false,
false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction
const*, unsigned short, art::JValue*) () from target:/system/lib64/libart.so
#26 0x0000007b1b010a60 in MterpInvokeVirtual () from
target:/system/lib64/libart.so
#27 0x0000007b1b01a598 in artMterpAsmInstructionStart () from
target:/system/lib64/libart.so
#28 0x0000007b1ad54ce0 in art::interpreter::Execute(art::Thread*,
art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue, bool) ()
from target:/system/lib64/libart.so
#29 0x0000007b1ad5a8e8 in
art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*,
art::DexFile::CodeItem const*, art::ShadowFrame*, art::JValue*) () from
target:/system/lib64/libart.so
#30 0x0000007b1ad75f28 in bool art::interpreter::DoCall<true,
true>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction
const*, unsigned short, art::JValue*) () from target:/system/lib64/libart.so
#31 0x0000007b1ad94094 in bool
art::interpreter::DoInvoke<(art::InvokeType)0, true, true>(art::Thread*,
art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)
() from target:/system/lib64/libart.so
#32 0x0000007b1ad8ad64 in art::JValue
art::interpreter::ExecuteSwitchImpl<true, false>(art::Thread*,
art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue, bool) ()
from target:/system/lib64/libart.so
#33 0x0000007b1ad54de0 in art::interpreter::Execute(art::Thread*,
art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue, bool) ()
from target:/system/lib64/libart.so
#34 0x0000007b1b00363c in artQuickToInterpreterBridge () from
target:/system/lib64/libart.so
#35 0x0000007b1b031910 in art_quick_to_interpreter_bridge () from
target:/system/lib64/libart.so
#36 0x0000007b1b02878c in art_quick_invoke_stub () from
target:/system/lib64/libart.so
#37 0x0000007b1abbcf78 in art::ArtMethod::Invoke(art::Thread*, unsigned
int*, unsigned int, art::JValue*, char const*) () from
target:/system/lib64/libart.so
#38 0x0000007b1af4cd38 in
art::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&,
art::ArtMethod*, art::ArgArray*, art::JValue*, char const*) () from
target:/system/lib64/libart.so
#39 0x0000007b1af4c964 in
art::InvokeWithVarArgs(art::ScopedObjectAccessAlreadyRunnable const&,
_jobject*, _jmethodID*, std::__va_list) () from
target:/system/lib64/libart.so
#40 0x0000007b1ae3f140 in art::JNI::CallNonvirtualVoidMethodV(_JNIEnv*,
_jobject*, _jclass*, _jmethodID*, std::__va_list) () from
target:/system/lib64/libart.so
#41 0x0000007b1abf1288 in art::CheckJNI::CallMethodV(char const*, _JNIEnv*,
_jobject*, _jclass*, _jmethodID*, std::__va_list, art::Primitive::Type,
art::InvokeType) () from target:/system/lib64/libart.so
#42 0x0000007b1abe0494 in art::CheckJNI::CallNonvirtualVoidMethod(_JNIEnv*,
_jobject*, _jclass*, _jmethodID*, ...) () from
target:/system/lib64/libart.so
#43 0x0000007af7da1208 in android_copy_area (src=<optimized out>,
dest=<optimized out>, gc=<optimized out>, src_x=-1623016232,
src_y=-1623016232, src_y@entry=140, width=599, height=2665904160,
dest_x=<optimized out>, dest_y=92) at
/home/staff/emacs-dev/emacs-android/src/android.c:3931
#44 0x0000007af7d6dac0 in android_scroll_run (w=0x5294fda228,
run=<optimized out>) at
/home/staff/emacs-dev/emacs-android/src/androidterm.c:2330
#45 0x0000007af789503c in scrolling_window (w=0x5294fda228,
tab_line_p=<optimized out>) at
/home/staff/emacs-dev/emacs-android/src/dispnew.c:4808
#46 update_window (w=<optimized out>, force_p=<optimized out>) at
/home/staff/emacs-dev/emacs-android/src/dispnew.c:3713
#47 0x0000007af78987b8 in update_window_tree (w=w@entry=0x5294fda228,
force_p=<optimized out>) at
/home/staff/emacs-dev/emacs-android/src/dispnew.c:3469
#48 0x0000007af7892c4c in update_frame (f=f@entry=0x5294fd9f98,
force_p=true, inhibit_hairy_id_p=<optimized out>) at
/home/staff/emacs-dev/emacs-android/src/dispnew.c:3304
#49 0x0000007af78fbb08 in redisplay_internal () at
/home/staff/emacs-dev/emacs-android/src/xdisp.c:17147
#50 0x0000007af7909cb8 in redisplay_preserve_echo_area
(from_where=from_where@entry=12) at
/home/staff/emacs-dev/emacs-android/src/xdisp.c:17430
#51 0x0000007af7cac744 in wait_reading_process_output
(time_limit=<optimized out>, nsecs=<optimized out>, read_kbd=<optimized
out>, do_display=<optimized out>, wait_for_cell=<optimized out>,
wait_proc=<optimized out>, just_wait_proc=<optimized out>) at
/home/staff/emacs-dev/emacs-android/src/process.c:5922
#52 0x0000007af7ab5f80 in kbd_buffer_get_event (end_time=0x0,
kbp=<optimized out>, used_mouse_menu=<optimized out>) at
/home/staff/emacs-dev/emacs-android/src/keyboard.c:4046
#53 read_event_from_main_queue (end_time=0x0, local_getcjmp=0x7af5ffe5d0,
used_mouse_menu=<optimized out>) at
/home/staff/emacs-dev/emacs-android/src/keyboard.c:2292
#54 read_decoded_event_from_main_queue (end_time=0x0,
local_getcjmp=0x7af5ffe5d0, prev_event=0x0, used_mouse_menu=<optimized
out>) at /home/staff/emacs-dev/emacs-android/src/keyboard.c:2356
#55 read_char (commandflag=commandflag@entry=1, map=map@entry=0x7af3d97593,
prev_event=0x0, used_mouse_menu=used_mouse_menu@entry=0x7af5ffea80,
end_time=0x0) at /home/staff/emacs-dev/emacs-android/src/keyboard.c:2986
#56 0x0000007af7aae81c in read_key_sequence (keybuf=<optimized out>,
prompt=<optimized out>, dont_downcase_last=<optimized out>,
can_return_switch_frame=<optimized out>, fix_current_buffer=<optimized
out>, prevent_redisplay=<optimized out>) at
/home/staff/emacs-dev/emacs-android/src/keyboard.c:10374
#57 0x0000007af7aaa078 in command_loop_1 () at
/home/staff/emacs-dev/emacs-android/src/keyboard.c:1397
#58 0x0000007af7bea660 in internal_condition_case
(bfun=bfun@entry=0x7af7aa97a0 <command_loop_1>, handlers=<optimized out>,
handlers@entry=0x90, hfun=hfun@entry=0x7af7aacf3c <cmd_error>) at
/home/staff/emacs-dev/emacs-android/src/eval.c:1486
#59 0x0000007af7aa978c in command_loop_2 (handlers=handlers@entry=0x90) at
/home/staff/emacs-dev/emacs-android/src/keyboard.c:1146
#60 0x0000007af7be94d8 in internal_catch (tag=tag@entry=0xf270,
func=func@entry=0x7af7aa9758 <command_loop_2>, arg=arg@entry=0x90) at
/home/staff/emacs-dev/emacs-android/src/eval.c:1209
#61 0x0000007af7aa858c in command_loop () at
/home/staff/emacs-dev/emacs-android/src/keyboard.c:1124
#62 0x0000007af7aa8270 in recursive_edit_1 () at
/home/staff/emacs-dev/emacs-android/src/keyboard.c:733
#63 0x0000007af7aa8a38 in Frecursive_edit () at
/home/staff/emacs-dev/emacs-android/src/keyboard.c:816
#64 0x0000007af7aa5ef0 in android_emacs_init (argc=<optimized out>,
argv=0x7af5fff880, dump_file=dump_file@entry=0x4194f00040
"/data/user/0/org.gnu.emacs/files/emacs-c2a575c8b8fbdcdf6c4fc8d697d391f36272cc41f023c519dc467a79c25a7d02.pdmp")
at /home/staff/emacs-dev/emacs-android/src/emacs.c:2633
#65 0x0000007af7d99308 in Java_org_gnu_emacs_EmacsNative_initEmacs
(env=0x7b1b7e20c0, object=<optimized out>, argv=0x7af5fff9a8,
dump_file_object=0x7af5fff9ac, api_level=<optimized out>) at
/home/staff/emacs-dev/emacs-android/src/android.c:2482
#66 0x0000007b0c9873e4 in oatexec () from
target:/data/app/org.gnu.emacs-4nlXnkbG14zdXIKlt5hhjg==/oat/arm64/base.odex
Emacs runs its own main loop in a second thread; this thread maintains
a Bitmap containing the contents of the Emacs frame (which is our
terminology for a GUI ``window''.) Each time drawing completes, Emacs
copies the contents of that Bitmap to a second bitmap maintained by
the View displaying the frame, and invalidates that view. This
copying is interlocked with the View's `onDraw' function, so that
`drawBitmap' never reads from the view's bitmap in the UI thread while
Emacs is writing to the bitmap from the main loop.
The Bitmap containing the contents of the Emacs frame is never drawn
to outside of the Emacs main loop.
Do any of you see a problem with the above strategy? I've never
seriously worked with Android prior to porting Emacs, and the
documentation regarding Bitmap interlocking seems to be non-existent,
so I'm really at a loss here...
TIA.
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/android-developers/89bedd2c-2183-4bea-a602-6036de3e17c1n%40googlegroups.com.