Skip to content

Crash when calling Intl.NumberFormat during module init #513

@janicduplessis

Description

@janicduplessis

Bug Description

Calling Intl.NumberFormat during module initialization causes the following crash. I noticed this issue when including the formatjs numberformat polyfill (https://github.com/formatjs/formatjs/blob/main/packages/intl-numberformat/should-polyfill.ts#L21).

********** Crash dump: **********
Build fingerprint: 'google/volantis/flounder:7.1.1/N9F27M/4333998:user/release-keys'
Abort message: 'terminating with uncaught exception of type std::runtime_error: Unable to retrieve jni environment. Is the thread attached?'
#00 0x000000000006b330 /system/lib64/libc.so (tgkill+8)
#01 0x00000000000687cc /system/lib64/libc.so (pthread_kill+64)
#02 0x0000000000023d2c /system/lib64/libc.so (raise+24)
#03 0x000000000001c7b0 /system/lib64/libc.so (abort+52)
#04 0x00000000000a01bc /data/app/com.th3rdwave-1/lib/arm64/libc++_shared.so
#05 0x00000000000a03b0 /data/app/com.th3rdwave-1/lib/arm64/libc++_shared.so
#06 0x00000000000b4208 /data/app/com.th3rdwave-1/lib/arm64/libc++_shared.so
#07 0x00000000000b41a0 /data/app/com.th3rdwave-1/lib/arm64/libc++_shared.so (_ZSt9terminatev+36)
#08 0x000000000003828c /data/app/com.th3rdwave-1/lib/arm64/libhermes.so
__clang_call_terminate
??:0:0
#09 0x000000000014991c /data/app/com.th3rdwave-1/lib/arm64/libhermes.so
facebook::jni::GlobalReferenceAllocator::deleteReference(_jobject*) const
/home/circleci/project/first-party/fbjni/cxx/fbjni/detail/ReferenceAllocators-inl.h:87:3
facebook::jni::base_owned_ref<hermes::platform_intl::(anonymous namespace)::JNumberFormat, facebook::jni::GlobalReferenceAllocator>::reset(facebook::jni::detail::JTypeFor<hermes::platform_intl::(anonymous namespace)::JNumberFormat, facebook::jni::JObject, void>::_javaobject*)
/home/circleci/project/first-party/fbjni/cxx/fbjni/detail/References-inl.h:289:0
facebook::jni::base_owned_ref<hermes::platform_intl::(anonymous namespace)::JNumberFormat, facebook::jni::GlobalReferenceAllocator>::reset()
/home/circleci/project/first-party/fbjni/cxx/fbjni/detail/References-inl.h:282:0
facebook::jni::base_owned_ref<hermes::platform_intl::(anonymous namespace)::JNumberFormat, facebook::jni::GlobalReferenceAllocator>::~base_owned_ref()
/home/circleci/project/first-party/fbjni/cxx/fbjni/detail/References-inl.h:268:0
hermes::platform_intl::NumberFormat::Impl::~Impl()
/home/circleci/project/lib/Platform/Intl/PlatformIntlAndroid.cpp:505:0
std::__ndk1::default_delete<hermes::platform_intl::NumberFormat::Impl>::operator()(hermes::platform_intl::NumberFormat::Impl*) const
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/memory:2339:0
std::__ndk1::unique_ptr<hermes::platform_intl::NumberFormat::Impl, std::__ndk1::default_delete<hermes::platform_intl::NumberFormat::Impl> >::reset(hermes::platform_intl::NumberFormat::Impl*)
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/memory:2652:0
std::__ndk1::unique_ptr<hermes::platform_intl::NumberFormat::Impl, std::__ndk1::default_delete<hermes::platform_intl::NumberFormat::Impl> >::~unique_ptr()
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/memory:2606:0
hermes::platform_intl::NumberFormat::~NumberFormat()
/home/circleci/project/lib/Platform/Intl/PlatformIntlAndroid.cpp:511:0
hermes::platform_intl::NumberFormat::~NumberFormat()
/home/circleci/project/lib/Platform/Intl/PlatformIntlAndroid.cpp:511:0
#10 0x000000000011efcc /data/app/com.th3rdwave-1/lib/arm64/libhermes.so
hermes::vm::VTable::finalizeIfExists(hermes::vm::GCCell*, hermes::vm::HadesGC*) const
/home/circleci/project/include/hermes/VM/VTable.h:167:7
hermes::vm::HadesGC::OldGen::sweepNext(bool)
/home/circleci/project/lib/VM/gcs/HadesGC.cpp:1165:0
#11 0x000000000012214c /data/app/com.th3rdwave-1/lib/arm64/libhermes.so
hermes::vm::HadesGC::incrementalCollect(bool)
/home/circleci/project/lib/VM/gcs/HadesGC.cpp:1672:20
#12 0x000000000012a144 /data/app/com.th3rdwave-1/lib/arm64/libhermes.so
hermes::vm::HadesGC::collectOGInBackground()::$_1::operator()() const
/home/circleci/project/lib/VM/gcs/HadesGC.cpp:1633:7
decltype(std::__ndk1::forward<hermes::vm::HadesGC::collectOGInBackground()::$_1&>(fp)()) std::__ndk1::__invoke<hermes::vm::HadesGC::collectOGInBackground()::$_1&>(hermes::vm::HadesGC::collectOGInBackground()::$_1&)
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/type_traits:4353:0
void std::__ndk1::__invoke_void_return_wrapper<void>::__call<hermes::vm::HadesGC::collectOGInBackground()::$_1&>(hermes::vm::HadesGC::collectOGInBackground()::$_1&)
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/__functional_base:349:0
std::__ndk1::__function::__alloc_func<hermes::vm::HadesGC::collectOGInBackground()::$_1, std::__ndk1::allocator<hermes::vm::HadesGC::collectOGInBackground()::$_1>, void ()>::operator()()
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/functional:1527:0
std::__ndk1::__function::__func<hermes::vm::HadesGC::collectOGInBackground()::$_1, std::__ndk1::allocator<hermes::vm::HadesGC::collectOGInBackground()::$_1>, void ()>::operator()()
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/functional:1651:0
#13 0x0000000000128974 /data/app/com.th3rdwave-1/lib/arm64/libhermes.so
std::__ndk1::__function::__value_func<void ()>::operator()() const
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/functional:1799:16
std::__ndk1::function<void ()>::operator()() const
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/functional:2347:0
hermes::vm::HadesGC::Executor::add(std::__ndk1::function<void ()>)::'lambda'()::operator()() const
/home/circleci/project/lib/VM/gcs/HadesGC.cpp:1045:0
decltype(std::__ndk1::forward<hermes::vm::HadesGC::Executor::add(std::__ndk1::function<void ()>)::'lambda'()&>(fp)()) std::__ndk1::__invoke<hermes::vm::HadesGC::Executor::add(std::__ndk1::function<void ()>)::'lambda'()&>(hermes::vm::HadesGC::Executor::add(std::__ndk1::function<void ()>)::'lambda'()&)
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/type_traits:4353:0
void std::__ndk1::__invoke_void_return_wrapper<void>::__call<hermes::vm::HadesGC::Executor::add(std::__ndk1::function<void ()>)::'lambda'()&>(hermes::vm::HadesGC::Executor::add(std::__ndk1::function<void ()>)::'lambda'()&)
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/__functional_base:349:0
std::__ndk1::__function::__alloc_func<hermes::vm::HadesGC::Executor::add(std::__ndk1::function<void ()>)::'lambda'(), std::__ndk1::allocator<hermes::vm::HadesGC::Executor::add(std::__ndk1::function<void ()>)::'lambda'()>, void ()>::operator()()
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/functional:1527:0
std::__ndk1::__function::__func<hermes::vm::HadesGC::Executor::add(std::__ndk1::function<void ()>)::'lambda'(), std::__ndk1::allocator<hermes::vm::HadesGC::Executor::add(std::__ndk1::function<void ()>)::'lambda'()>, void ()>::operator()()
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/functional:1651:0
#14 0x000000000012998c /data/app/com.th3rdwave-1/lib/arm64/libhermes.so
std::__ndk1::__function::__value_func<void ()>::operator()() const
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/functional:1799:16
std::__ndk1::function<void ()>::operator()() const
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/functional:2347:0
hermes::vm::HadesGC::Executor::worker()
/home/circleci/project/lib/VM/gcs/HadesGC.cpp:1066:0
#15 0x0000000000129790 /data/app/com.th3rdwave-1/lib/arm64/libhermes.so
hermes::vm::HadesGC::Executor::Executor()::'lambda'()::operator()() const
/home/circleci/project/lib/VM/gcs/HadesGC.cpp:1028:33
decltype(std::__ndk1::forward<hermes::vm::HadesGC::Executor::Executor()::'lambda'()>(fp)()) std::__ndk1::__invoke<hermes::vm::HadesGC::Executor::Executor()::'lambda'()>(hermes::vm::HadesGC::Executor::Executor()::'lambda'()&&)
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/type_traits:4353:0
void std::__ndk1::__thread_execute<std::__ndk1::unique_ptr<std::__ndk1::__thread_struct, std::__ndk1::default_delete<std::__ndk1::__thread_struct> >, hermes::vm::HadesGC::Executor::Executor()::'lambda'()>(std::__ndk1::tuple<std::__ndk1::unique_ptr<std::__ndk1::__thread_struct, std::__ndk1::default_delete<std::__ndk1::__thread_struct> >, hermes::vm::HadesGC::Executor::Executor()::'lambda'()>&, std::__ndk1::__tuple_indices<>)
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/thread:342:0
void* std::__ndk1::__thread_proxy<std::__ndk1::tuple<std::__ndk1::unique_ptr<std::__ndk1::__thread_struct, std::__ndk1::default_delete<std::__ndk1::__thread_struct> >, hermes::vm::HadesGC::Executor::Executor()::'lambda'()> >(void*)
/opt/android/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/thread:352:0
#16 0x0000000000067fd4 /system/lib64/libc.so (_ZL15__pthread_startPv+196)
#17 0x000000000001d9c4 /system/lib64/libc.so (__start_thread+16)
  • I have run gradle clean and confirmed this bug does not occur with JSC

Hermes version: 0.8.0
React Native version (if any): master@b2dbde36b8f9cb69b1a1f9061c7f19c895d0c317
OS version (if any): Android 7.1.1
Platform: arm64-v8a

Steps To Reproduce

I was only able to reproduce the crash on a physical device, not on the emulator. The crash happens both in debug and release builds.

React Native index.js

const s = new Intl.NumberFormat('en', {
    style: 'unit',
    unit: 'bit',
    unitDisplay: 'long',
    notation: 'scientific',
  }).format(10000);

  console.log(s);
  
  AppRegistry.registerComponent(...)

Running the same code inside setTimeout(..., 0) does not crash.

The Expected Behavior

No crash

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions