vitest icon indicating copy to clipboard operation
vitest copied to clipboard

Importing @node-rs/crc32 results in segfault on Linux

Open flunderpero opened this issue 3 years ago • 1 comments

Describe the bug

Merely importing @node-rs/crc32 leads to a segfault after tests are finished.

vitest-dev-vitest-hkkxno llnode `which node` -c core.node.5641                                                                                                    [main ✗] [97c6c0a7b131]
(lldb) target create "/usr/bin/node" --core "core.node.5641"
Core file '/tmp/vitest-dev-vitest-hkkxno/core.node.5641' (x86_64) was loaded.
(lldb) plugin load '/root/llnode/llnode.so'
(lldb) settings set prompt '(llnode) '
(llnode) bt all
* thread #1, name = 'node', stop reason = signal SIGSEGV
  * frame #0: 0x00007f905d38bd40
    frame #1: 0x00007f90663ba5a1 libpthread.so.0`__nptl_deallocate_tsd.part.0 + 145
    frame #2: 0x00007f90663bb62a libpthread.so.0`start_thread + 250
    frame #3: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #2, stop reason = signal 0
    frame #0: 0x00007f90663c2376 libpthread.so.0`__pthread_cond_wait + 534
    frame #1: 0x000000000164ca09 node`uv_cond_wait at thread.c:780
    frame #2: 0x0000000001638d04 node`worker(arg=<unavailable>) at threadpool.c:76
    frame #3: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #4: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #3, stop reason = signal 0
    frame #0: 0x00007f90663c5454 libpthread.so.0`do_futex_wait.constprop.0 + 52
    frame #1: 0x00007f90663c5548 libpthread.so.0`__new_sem_wait_slow.constprop.0 + 152
    frame #2: 0x000000000164c842 node`uv_sem_wait at thread.c:626
    frame #3: 0x000000000164c830 node`uv_sem_wait(sem=0x0000000004e15180) at thread.c:682
    frame #4: 0x0000000000c5e515 node`node::inspector::(anonymous namespace)::StartIoThreadMain(void*) + 53
    frame #5: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #6: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #4, stop reason = signal 0
    frame #0: 0x00007f90662e046e libc.so.6`epoll_wait + 94
    frame #1: 0x0000000001650623 node`uv__io_poll at epoll.c:236
    frame #2: 0x000000000163e498 node`uv_run(loop=0x00000000054545c8, mode=UV_RUN_DEFAULT) at core.c:389
    frame #3: 0x0000000000bd13fb node`node::WorkerThreadsTaskRunner::DelayedTaskScheduler::Start()::'lambda'(void*)::_FUN(void*) + 123
    frame #4: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #5: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #5, stop reason = signal 0
    frame #0: 0x00007f90663c2376 libpthread.so.0`__pthread_cond_wait + 534
    frame #1: 0x000000000164ca09 node`uv_cond_wait at thread.c:780
    frame #2: 0x0000000000bcc26b node`node::(anonymous namespace)::PlatformWorkerThread(void*) + 267
    frame #3: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #4: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #6, stop reason = signal 0
    frame #0: 0x00007f90663c2376 libpthread.so.0`__pthread_cond_wait + 534
    frame #1: 0x000000000164ca09 node`uv_cond_wait at thread.c:780
    frame #2: 0x0000000001638d04 node`worker(arg=<unavailable>) at threadpool.c:76
    frame #3: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #4: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #7, stop reason = signal 0
    frame #0: 0x00007f90663c2376 libpthread.so.0`__pthread_cond_wait + 534
    frame #1: 0x000000000164ca09 node`uv_cond_wait at thread.c:780
    frame #2: 0x0000000000bcc26b node`node::(anonymous namespace)::PlatformWorkerThread(void*) + 267
    frame #3: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #4: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #8, stop reason = signal 0
    frame #0: 0x00007f90663c2376 libpthread.so.0`__pthread_cond_wait + 534
    frame #1: 0x000000000164ca09 node`uv_cond_wait at thread.c:780
    frame #2: 0x0000000001638d04 node`worker(arg=<unavailable>) at threadpool.c:76
    frame #3: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #4: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #9, stop reason = signal 0
    frame #0: 0x0000000000d74e20 node`v8::internal::(anonymous namespace)::UpdateNeedsHoleCheck(v8::internal::Variable*, v8::internal::VariableProxy*, v8::internal::Scope*)
    frame #1: 0x0000000000d7feb8 node`v8::internal::Scope::ResolveVariablesRecursively(v8::internal::Scope*) + 136
    frame #2: 0x0000000000d81551 node`v8::internal::DeclarationScope::Analyze(v8::internal::ParseInfo*) + 193
    frame #3: 0x00000000011d54b8 node`void v8::internal::Parser::PostProcessParseResult<v8::internal::Isolate>(v8::internal::Isolate*, v8::internal::ParseInfo*, v8::internal::FunctionLiteral*) + 152
    frame #4: 0x00000000011f807e node`v8::internal::Parser::ParseFunction(v8::internal::Isolate*, v8::internal::ParseInfo*, v8::internal::Handle<v8::internal::SharedFunctionInfo>) + 1118
    frame #5: 0x00000000011fccb1 node`v8::internal::parsing::ParseFunction(v8::internal::ParseInfo*, v8::internal::Handle<v8::internal::SharedFunctionInfo>, v8::internal::Isolate*, v8::internal::parsing::ReportStatisticsMode) + 337
    frame #6: 0x00000000011fd0a5 node`v8::internal::parsing::ParseAny(v8::internal::ParseInfo*, v8::internal::Handle<v8::internal::SharedFunctionInfo>, v8::internal::Isolate*, v8::internal::parsing::ReportStatisticsMode) + 437
    frame #7: 0x0000000000de917e node`v8::internal::Compiler::Compile(v8::internal::Isolate*, v8::internal::Handle<v8::internal::SharedFunctionInfo>, v8::internal::Compiler::ClearExceptionFlag, v8::internal::IsCompiledScope*, v8::internal::CreateSourcePositions) + 510
    frame #8: 0x0000000000de96d4 node`v8::internal::Compiler::Compile(v8::internal::Isolate*, v8::internal::Handle<v8::internal::JSFunction>, v8::internal::Compiler::ClearExceptionFlag, v8::internal::IsCompiledScope*) + 212
    frame #9: 0x000000000129fc75 node`v8::internal::Runtime_CompileLazy(int, unsigned long*, v8::internal::Isolate*) + 117
    frame #10: 0x00000000016daab9 node`Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit + 57
    frame #11: 0x000000000165fe91 node`Builtins_CompileLazy + 1041
    frame #12: 0x000000000165eb10 node`Builtins_InterpreterEntryTrampoline + 208
    frame #13: 0x000000000165eb10 node`Builtins_InterpreterEntryTrampoline + 208
    frame #14: 0x000000000165eb10 node`Builtins_InterpreterEntryTrampoline + 208
    frame #15: 0x000000000165eb10 node`Builtins_InterpreterEntryTrampoline + 208
    frame #16: 0x000000000165eb10 node`Builtins_InterpreterEntryTrampoline + 208
    frame #17: 0x000000000165eb10 node`Builtins_InterpreterEntryTrampoline + 208
    frame #18: 0x00000000016927ff node`Builtins_AsyncFunctionAwaitResolveClosure + 63
    frame #19: 0x000000000172b0b1 node`Builtins_PromiseFulfillReactionJob + 49
    frame #20: 0x0000000001683f7b node`Builtins_RunMicrotasks + 635
    frame #21: 0x000000000165d043 node`Builtins_JSRunMicrotasksEntry + 131
    frame #22: 0x0000000000e79a4a node`v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) + 1546
    frame #23: 0x0000000000e7a650 node`v8::internal::(anonymous namespace)::InvokeWithTryCatch(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) (.constprop.84) + 80
    frame #24: 0x0000000000e7ad5a node`v8::internal::Execution::TryRunMicrotasks(v8::internal::Isolate*, v8::internal::MicrotaskQueue*, v8::internal::MaybeHandle<v8::internal::Object>*) + 90
    frame #25: 0x0000000000ea814a node`v8::internal::MicrotaskQueue::RunMicrotasks(v8::internal::Isolate*) (.part.50) + 138
    frame #26: 0x0000000000ea8522 node`v8::internal::MicrotaskQueue::PerformCheckpoint(v8::Isolate*) + 66
    frame #27: 0x0000000000d972d0 node`v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::FunctionTemplateInfo>, v8::internal::Handle<v8::internal::Object>, v8::internal::BuiltinArguments) + 896
    frame #28: 0x0000000000d9880f node`v8::internal::Builtin_HandleApiCall(int, unsigned long*, v8::internal::Isolate*) + 175
    frame #29: 0x00000000016dabb9 node`Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit + 57
    frame #30: 0x000000000573b11b
    frame #31: 0x000000000165d11c node`Builtins_JSEntryTrampoline + 92
    frame #32: 0x000000000165ce43 node`Builtins_JSEntry + 131
    frame #33: 0x0000000000e7957e node`v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) + 318
    frame #34: 0x0000000000e7a76f node`v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*) + 95
    frame #35: 0x0000000000d54f93 node`v8::Function::Call(v8::Local<v8::Context>, v8::Local<v8::Value>, int, v8::Local<v8::Value>*) + 227
    frame #36: 0x0000000000aa2d6f node`node::InternalCallbackScope::Close() + 591
    frame #37: 0x0000000000aa3115 node`node::InternalMakeCallback(node::Environment*, v8::Local<v8::Object>, v8::Local<v8::Object>, v8::Local<v8::Function>, int, v8::Local<v8::Value>*, node::async_context) + 677
    frame #38: 0x0000000000ab4419 node`node::AsyncWrap::MakeCallback(v8::Local<v8::Function>, int, v8::Local<v8::Value>*) + 121
    frame #39: 0x0000000000ba7357 node`node::worker::MessagePort::OnMessage(node::worker::MessagePort::MessageProcessingMode) + 519
    frame #40: 0x000000000163db46 node`uv__async_io.part.1 at async.c:163
    frame #41: 0x0000000001650284 node`uv__io_poll at epoll.c:374
    frame #42: 0x000000000163e498 node`uv_run(loop=0x0000000004e1ebe0, mode=UV_RUN_DEFAULT) at core.c:389
    frame #43: 0x0000000000aa3aa5 node`node::SpinEventLoop(node::Environment*) + 325
    frame #44: 0x0000000000ba18a6 node`node::NodeMainInstance::Run() + 390
    frame #45: 0x0000000000b27352 node`node::Start(int, char**) + 162
    frame #46: 0x00007f90661e5083 libc.so.6`__libc_start_main + 243
    frame #47: 0x0000000000aa1dde node`_start + 46
  thread #10, stop reason = signal 0
    frame #0: 0x00007f90663c2376 libpthread.so.0`__pthread_cond_wait + 534
    frame #1: 0x000000000164ca09 node`uv_cond_wait at thread.c:780
    frame #2: 0x0000000001638d04 node`worker(arg=<unavailable>) at threadpool.c:76
    frame #3: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #4: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #11, stop reason = signal 0
    frame #0: 0x00007f90663c2376 libpthread.so.0`__pthread_cond_wait + 534
    frame #1: 0x000000000164ca09 node`uv_cond_wait at thread.c:780
    frame #2: 0x0000000000bcc26b node`node::(anonymous namespace)::PlatformWorkerThread(void*) + 267
    frame #3: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #4: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #12, stop reason = signal 0
    frame #0: 0x00007f90663c2376 libpthread.so.0`__pthread_cond_wait + 534
    frame #1: 0x000000000164ca09 node`uv_cond_wait at thread.c:780
    frame #2: 0x0000000000bcc26b node`node::(anonymous namespace)::PlatformWorkerThread(void*) + 267
    frame #3: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #4: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #13, stop reason = signal 0
    frame #0: 0x00000000012e5f3a node`v8::internal::Deserializer<v8::internal::Isolate>::ReadObject(v8::internal::SnapshotSpace) + 202
    frame #1: 0x00000000012e5323 node`int v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject>(unsigned char, v8::internal::SlotAccessorForHeapObject) + 2115
    frame #2: 0x00000000012e5e31 node`v8::internal::Deserializer<v8::internal::Isolate>::ReadData(v8::internal::Handle<v8::internal::HeapObject>, int, int) + 97
    frame #3: 0x00000000012e5fa2 node`v8::internal::Deserializer<v8::internal::Isolate>::ReadObject(v8::internal::SnapshotSpace) + 306
    frame #4: 0x00000000012e5323 node`int v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForHeapObject>(unsigned char, v8::internal::SlotAccessorForHeapObject) + 2115
    frame #5: 0x00000000012e5e31 node`v8::internal::Deserializer<v8::internal::Isolate>::ReadData(v8::internal::Handle<v8::internal::HeapObject>, int, int) + 97
    frame #6: 0x00000000012e5fa2 node`v8::internal::Deserializer<v8::internal::Isolate>::ReadObject(v8::internal::SnapshotSpace) + 306
    frame #7: 0x00000000012e694e node`int v8::internal::Deserializer<v8::internal::Isolate>::ReadSingleBytecodeData<v8::internal::SlotAccessorForRootSlots>(unsigned char, v8::internal::SlotAccessorForRootSlots) + 1790
    frame #8: 0x00000000012e6e5e node`v8::internal::Deserializer<v8::internal::Isolate>::ReadData(v8::internal::FullMaybeObjectSlot, v8::internal::FullMaybeObjectSlot) + 62
    frame #9: 0x0000000000f13920 node`v8::internal::Heap::IterateRoots(v8::internal::RootVisitor*, v8::base::EnumSet<v8::internal::SkipRoot, int>) + 64
    frame #10: 0x000000000130ce0d node`v8::internal::StartupDeserializer::DeserializeIntoIsolate() + 93
    frame #11: 0x0000000000ea13dd node`v8::internal::Isolate::Init(v8::internal::SnapshotData*, v8::internal::SnapshotData*, v8::internal::SnapshotData*, bool) + 3021
    frame #12: 0x000000000130932e node`v8::internal::Snapshot::Initialize(v8::internal::Isolate*) (.part.48) + 526
    frame #13: 0x0000000000d5d8da node`v8::Isolate::Initialize(v8::Isolate*, v8::Isolate::CreateParams const&) + 362
    frame #14: 0x0000000000c21386 node`node::worker::Worker::Run() + 1030
    frame #15: 0x0000000000c224b8 node`node::worker::Worker::StartThread(v8::FunctionCallbackInfo<v8::Value> const&)::'lambda'(void*)::_FUN(void*) + 56
    frame #16: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #17: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #14, stop reason = signal 0
    frame #0: 0x0000000001e08937 node`Cr_z_inflate_fast + 2215
    frame #1: 0x0000000001e04a77 node`Cr_z_inflate + 711
    frame #2: 0x0000000001e03866 node`zlib_internal::UncompressHelper(zlib_internal::WrapperType, unsigned char*, unsigned long*, unsigned char const*, unsigned long) + 150
    frame #3: 0x0000000001308461 node`v8::internal::SnapshotCompression::Decompress(v8::base::Vector<unsigned char const>) + 113
    frame #4: 0x0000000001309014 node`v8::internal::MaybeDecompress(v8::internal::Isolate*, v8::base::Vector<unsigned char const> const&) (.constprop.206) + 68
    frame #5: 0x00000000013092d6 node`v8::internal::Snapshot::Initialize(v8::internal::Isolate*) (.part.48) + 438
    frame #6: 0x0000000000d5d8da node`v8::Isolate::Initialize(v8::Isolate*, v8::Isolate::CreateParams const&) + 362
    frame #7: 0x0000000000c21386 node`node::worker::Worker::Run() + 1030
    frame #8: 0x0000000000c224b8 node`node::worker::Worker::StartThread(v8::FunctionCallbackInfo<v8::Value> const&)::'lambda'(void*)::_FUN(void*) + 56
    frame #9: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #10: 0x00007f90662e0133 libc.so.6`clone + 67
  thread #15, stop reason = signal 0
    frame #0: 0x00007f90662d99ab libc.so.6`mprotect + 11
    frame #1: 0x0000000001df4bf6 node`v8::base::OS::SetPermissions(void*, unsigned long, v8::base::OS::MemoryPermission) + 38
    frame #2: 0x0000000000f7b7cf node`v8::internal::MemoryAllocator::Unmapper::PerformFreeMemoryOnQueuedChunks(v8::internal::MemoryAllocator::Unmapper::FreeMode, v8::JobDelegate*) + 63
    frame #3: 0x0000000000f7baac node`v8::internal::MemoryAllocator::Unmapper::FreeQueuedChunks() + 108
    frame #4: 0x0000000000f82160 node`v8::internal::SemiSpace::Uncommit() + 256
    frame #5: 0x0000000000f82225 node`v8::internal::NewSpace::~NewSpace() + 69
    frame #6: 0x0000000000f82521 node`v8::internal::NewSpace::~NewSpace() + 17
    frame #7: 0x0000000000f2cf3e node`v8::internal::Heap::TearDown() + 1982
    frame #8: 0x0000000000ea052a node`v8::internal::Isolate::Deinit() + 874
    frame #9: 0x0000000000ea2868 node`v8::internal::Isolate::Delete(v8::internal::Isolate*) + 88
    frame #10: 0x0000000000c22081 node`node::worker::Worker::Run() + 4353
    frame #11: 0x0000000000c224b8 node`node::worker::Worker::StartThread(v8::FunctionCallbackInfo<v8::Value> const&)::'lambda'(void*)::_FUN(void*) + 56
    frame #12: 0x00007f90663bb609 libpthread.so.0`start_thread + 217
    frame #13: 0x00007f90662e0133 libc.so.6`clone + 67

Reproduction

I cannot reproduce this on MacOS or on Stackblitz, but on Ubuntu 20.04 with this repo:

https://github.com/flunderpero/vitest-dev-vitest-hkkxno.git

System Info

System:
    OS: Linux 5.10 Ubuntu 20.04.3 LTS (Focal Fossa)
    CPU: (4) x64 Intel(R) Xeon(R) CPU @ 2.20GHz
    Memory: 2.66 GB / 3.84 GB
    Container: Yes
    Shell: 5.0.17 - /bin/bash
  Binaries:
    Node: 18.7.0 - /usr/bin/node
    Yarn: 1.22.19 - /usr/bin/yarn
    npm: 8.15.0 - /usr/bin/npm
  npmPackages:
    vite: ^2.9.9 => 2.9.14
    vitest: latest => 0.21.0

Used Package Manager

npm

Validations

flunderpero avatar Aug 08 '22 11:08 flunderpero

It's better if you open an issue in Node repo.

sheremet-va avatar Aug 08 '22 11:08 sheremet-va

Disabling threads should help with this. @node-rs/crc32 is probably not meant to run inside a worker thread.

# vitest 0.34.6
vitest --no-threads

# vitest 1.0.0-beta.0
vitest --pool=forks

sheremet-va avatar Oct 04 '23 09:10 sheremet-va