vitest
vitest copied to clipboard
Importing @node-rs/crc32 results in segfault on Linux
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
- [X] Follow our Code of Conduct
- [X] Read the Contributing Guidelines.
- [X] Read the docs.
- [X] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
- [X] Check that this is a concrete bug. For Q&A open a GitHub Discussion or join our Discord Chat Server.
- [X] The provided reproduction is a minimal reproducible example of the bug.
It's better if you open an issue in Node repo.
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