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 android-developers+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/android-developers/89bedd2c-2183-4bea-a602-6036de3e17c1n%40googlegroups.com.

Reply via email to