androidkotlinexceptionsegmentation-faultnative

How can I handle native exception in *.so library in my Android application?


I am developing Android application to work with a network printers. Atol printers have their own native library (*.so) for printing text. Under certain circumstances (for example, when specifying an incorrect ip-address), this library throws native exceptions and my app crashes even when my code is wrapped in try { } catch (t: Throwable) { } !

The following information is displayed in the logcat:

Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x630000005d in tid 29523 (RxCachedThreadS), pid 27187 (my.app.package)

How can I handle this native exception in my Kotlin code?

This is my full logcat message:

#00 pc 0000000000654930  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/lib/arm64/libfptr10.so (BuildId: 796f36babce130ad8c1d171dab3c2c061ec463bb)
#01 pc 00000000003f8fb4  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/lib/arm64/libfptr10.so (Fptr10::Ports::TcpPort::tag() const+20) (BuildId: 796f36babce130ad8c1d171dab3c2c061ec463bb)
#02 pc 0000000000453ad0  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/lib/arm64/libfptr10.so (Fptr10::Ports::PosixFastTcpPort::open()+4280) (BuildId: 796f36babce130ad8c1d171dab3c2c061ec463bb)
#03 pc 00000000002d7958  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/lib/arm64/libfptr10.so (Fptr10::FiscalPrinter::Atol::AtolProtocolDetector::open()+1600) (BuildId: 796f36babce130ad8c1d171dab3c2c061ec463bb)
#04 pc 000000000026ae60  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/lib/arm64/libfptr10.so (Fptr10::FiscalPrinter::FiscalPrinterHandle::open()+84) (BuildId: 796f36babce130ad8c1d171dab3c2c061ec463bb)
#05 pc 000000000021cb9c  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/lib/arm64/libfptr10.so (doOpen(void*)+36) (BuildId: 796f36babce130ad8c1d171dab3c2c061ec463bb)
#06 pc 00000000002208b4  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/lib/arm64/libfptr10.so (libfptr_open+200) (BuildId: 796f36babce130ad8c1d171dab3c2c061ec463bb)
#07 pc 0000000000351230  /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+144) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#08 pc 000000000033a7a4  /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+612) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#09 pc 0000000000510a3c  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+1976) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#10 pc 00000000004904b8  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+1012) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#11 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#12 pc 0000000001b23090  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#13 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#14 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#15 pc 00000000004904b8  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+1012) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#16 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#17 pc 0000000000a87dfc  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#18 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#19 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#20 pc 0000000000491368  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+4772) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#21 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#22 pc 00000000004a6534  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#23 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#24 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#25 pc 0000000000490828  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+1892) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#26 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#27 pc 0000000000a62bb0  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#28 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#29 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#30 pc 0000000000490828  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+1892) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#31 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#32 pc 0000000000a62b94  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#33 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#34 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#35 pc 0000000000490828  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+1892) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#36 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#37 pc 0000000000a62b58  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#38 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#39 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#40 pc 0000000000491368  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+4772) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#41 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#42 pc 000000000181908c  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#43 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#44 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#45 pc 00000000004904b8  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+1012) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#46 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#47 pc 0000000000488de8  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#48 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#49 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#50 pc 0000000000491368  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+4772) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#51 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#52 pc 0000000001825c2c  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#53 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#54 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#55 pc 00000000004904b8  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+1012) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#56 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#57 pc 0000000000488de8  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#58 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#59 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#60 pc 0000000000491368  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+4772) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#61 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#62 pc 0000000001823288  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#63 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#64 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#65 pc 0000000000491368  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+4772) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#66 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#67 pc 0000000000488ef8  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#68 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#69 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#70 pc 0000000000491368  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+4772) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#71 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#72 pc 0000000001835688  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#73 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#74 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#75 pc 00000000004904b8  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+1012) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#76 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#77 pc 0000000001835468  /data/app/~~M6zM9JK5PqEGK-hMsQq8qw==/my.app.package-4mOPtsiz1G0iT3vRcop3Vw==/oat/arm64/base.vdex
#78 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#79 pc 0000000000511708  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+5252) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#80 pc 0000000000491368  /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp<false>(art::interpreter::SwitchImplContext*)+4772) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#81 pc 00000000003539d8  /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+8) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#82 pc 000000000023a008  /apex/com.android.art/javalib/core-oj.jar
#83 pc 000000000036daec  /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238.llvm.18012138979834229341)+232) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#84 pc 000000000036d3e4  /apex/com.android.art/lib64/libart.so (artQuickToInterpreterBridge+964) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#85 pc 0000000000351368  /apex/com.android.art/lib64/libart.so (art_quick_to_interpreter_bridge+88) (BuildId: 2452917c4ff69cbb6e75e5512260946b)
#86 pc 000000000201789c  /memfd:jit-cache (deleted)

Solution

  • Not sure which JNI wrapper you are using, but the documentation covers this:
    https://integration.atol.ru/api-en/?java--android#error-handling

    if (fptr.printText() < 0) {
        Log.d(TAG, String.format("%d [%s]", fptr.errorCode(), fptr.errorDescription()));
    }
    

    And if you want to prevent native exceptions, this can only be done in the source code:
    https://github.com/farafonov-alexey/node-atol-wrapper/blob/master/src/fptr10.cc