Description
- Version: 12.16.2
- Platform: Darwin 18.7.0 (macOS 10.14.6)
- Subsystem: Node C++ API
What steps will reproduce the bug?
I have a program that manages its own V8 Isolate, UV Event Loop and Node Environments. In Node 12.13.1, it was possible to initialize a V8 Platform via node::InitializeV8Platform(...)
that would provide all that was expected of Node Contexts. I am trying to upgrade to Node 12.16.2, but this function was removed in d77a1b0.
I am looking for a minimal example that allows successful creation of a Node Environment object. To reproduce:
- Checkout v12.16.2
- Do a
configure
thenmake
- Create this sample program named
test.cc
(I omitted cleanup for brevity):
// test.cc
#include <node.h>
#include <uv.h>
#include <v8.h>
#include <libplatform/libplatform.h>
int main()
{
auto platform = v8::platform::NewDefaultPlatform();
v8::V8::InitializePlatform(platform.get());
v8::V8::Initialize();
v8::Isolate::CreateParams isolateParams;
isolateParams.array_buffer_allocator =
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
auto *isolate = v8::Isolate::Allocate();
v8::Isolate::Initialize(isolate, isolateParams);
v8::HandleScope scope(isolate);
auto *isolateData = node::CreateIsolateData(isolate, uv_default_loop());
v8::Global<v8::Context> context(isolate, node::NewContext(isolate));
auto *environment = node::CreateEnvironment(isolateData,
context.Get(isolate),
0, nullptr,
0, nullptr);
}
- Compile with the following command (assuming you cloned the repo to the current directory):
$ c++ -g -std=c++17 -Inode/{src,deps/v8/include,deps/uv} test.cc -lv8_libplatform -lv8_libbase -rpath node/out/Release -Lnode/out/Release -lnode.72
- Run the program in
lldb
; you should see the following segfault:
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x490)
* frame #0: 0x000000010039265b libnode.72.dylib`node::tracing::TraceEventHelper::GetTracingController() [inlined] std::__1::unique_ptr<node::tracing::TracingController, std::__1::default_delete<node::tracing::TracingController> >::get(this=<unavailable>) const at memory:2621:19 [opt]
frame #1: 0x000000010039265b libnode.72.dylib`node::tracing::TraceEventHelper::GetTracingController() [inlined] node::tracing::Agent::GetTracingController(this=0x0000000000000000) at agent.h:90 [opt]
frame #2: 0x000000010039265b libnode.72.dylib`node::tracing::TraceEventHelper::GetTracingController() at trace_event.cc:17 [opt]
frame #3: 0x0000000100340024 libnode.72.dylib`node::performance::performance_state::Mark(this=<unavailable>, milestone=NODE_PERFORMANCE_MILESTONE_ENVIRONMENT, ts=821035848887086) at node_perf.cc:50:3 [opt]
frame #4: 0x00000001002a09a7 libnode.72.dylib`node::Environment::Environment(this=0x0000000105003200, isolate_data=0x0000000107824a00, context=<unavailable>, args=size=0, exec_args=<unavailable>, flags=7, thread_id=18446744073709551615) at env.cc:353:23 [opt]
frame #5: 0x000000010026fe1b libnode.72.dylib`node::CreateEnvironment(isolate_data=<unavailable>, context=<unavailable>, argc=<unavailable>, argv=0x0000000000000000, exec_argc=<unavailable>, exec_argv=<unavailable>) at environment.cc:307:26 [opt]
frame #6: 0x000000010000159a a.out`main at test.cc:25:25
frame #7: 0x00007fff5dfb93d5 libdyld.dylib`start + 1
This is happening because the tracing controller has not been set; as far as I can see, this is only possible to set via the public APIs using a method such as node::Start
, but that is not very friendly for programs that wish to create multiple environments. It's very likely that I have missed something in how to properly create these environments, any pointers are appreciated.
How often does it reproduce? Is there a required condition?
This should be a universal issue when attempting to create environments against Node v12.16.2.
What is the expected behavior?
I would expect the environment to be created, and the context to be usable to execute JavaScript.
What do you see instead?
A segmentation fault.