-
Notifications
You must be signed in to change notification settings - Fork 290
Description
Hi!
Thank you for the project! On some of our servers, we started getting the segfault recently.
Our JS initialisation:
java = require('java');
java.asyncOptions = {
asyncSuffix: 'Async',
syncSuffix: 'Sync'
};
const closureCompilerPath = path.parse(require.resolve('google-closure-compiler')).dir;
java.classpath.push(path.join(closureCompilerPath, 'compiler.jar'));
classPaths.forEach(classPath => {
java.classpath.push(classPath);
});
ArrayList = java.import('java.util.ArrayList'); // here segfault happensgdb with debugging symbols shows that the following code from javaObject.cpp:116 causes the problem:
v8::Local<v8::Function> ctor = funcTemplate->GetFunction();
v8::Local<v8::Object> javaObjectObj = ctor->NewInstance();GetFunction call seems to be returning empty Local in some cases (gdb shows ctor = {val_ = 0x0} in locals). v8 headers suggest using maybe version instead, so I can conclude that the Local(0) might be expected and it's not a v8 problem.
/** Returns the unique function instance in the current execution context.*/
V8_DEPRECATE_SOON("Use maybe version", Local<Function> GetFunction());
V8_WARN_UNUSED_RESULT MaybeLocal<Function> GetFunction(
Local<Context> context);Calling NewInstance on an empty local then causes V8 to crash in OS::Abort because of a failed assertion.
Full gdb output with locals:
#0 v8::base::OS::Abort () at ../deps/v8/src/base/platform/platform-posix.cc:255
No locals.
#1 0x0000000002afeb60 in V8_Fatal (file=0x2c798b9 "../deps/v8/src/api.h", line=349, format=0x2c78ded "Check failed: %s.") at ../deps/v8/src/base/logging.cc:74
arguments = {{gp_offset = 32, fp_offset = 48, overflow_arg_area = 0xffeffd4c0, reg_save_area = 0xffeffd400}}
#2 0x0000000001a706c5 in v8::Utils::OpenHandle (that=0x0, allow_empty_handle=false) at ../deps/v8/src/api.h:349
No locals.
#3 0x0000000001a9915d in v8::Function::NewInstance (this=0x0, context=..., argc=0, argv=0x0) at ../deps/v8/src/api.cc:5186
trace_event_unique_atomic5184 = 65754077
__state__ = {isolate_ = 0x60514c0, previous_tag_ = v8::EXTERNAL}
isolate = 0x60514c0
timer_scope = {isolate_ = 0x60514c0}
self = {<v8::internal::HandleBase> = {location_ = 0xffeffd550}, <No data fields>}
trace_event_unique_category_group_enabled5184 = 0x3eb53dd <v8::platform::DefaultPlatform::GetCategoryGroupEnabled(char const*)::no> ""
trace_event_unique_tracer5184 = {has_parent_scope_ = 177, p_data_ = 0x0, data_ = {category_group_enabled = 0xffeffd620 "",
name = 0x1a6f2e0 <v8::Utils::ToLocal(v8::internal::Handle<v8::internal::Context>)+24> "\311\303UH\211\345H\203\354\020H\211}\360H\213E\360H\211\307\350F/\004",
isolate = 0x60c4c18}}
handle_scope = {<v8::EscapableHandleScope> = {<v8::HandleScope> = {isolate_ = 0x60514c0, prev_next_ = 0x60c4c28, prev_limit_ = 0x60c5150},
escape_slot_ = 0x60c4c20}, <No data fields>}
call_depth_scope = {isolate_ = 0x60514c0, context_ = {val_ = 0x0}, escaped_ = false, do_callback_ = 214}
_runtime_timer = {stats_ = 0x0, timer_ = {counter_ = 0x0, parent_ = {value_ = 0}, start_ticks_ = {<v8::base::time_internal::TimeBase<v8::base::TimeTicks>> = {
static kHoursPerDay = <optimized out>, static kMillisecondsPerSecond = <optimized out>, static kMillisecondsPerDay = <optimized out>,
static kMicrosecondsPerMillisecond = <optimized out>, static kMicrosecondsPerSecond = <optimized out>, static kMicrosecondsPerMinute = <optimized out>,
static kMicrosecondsPerHour = <optimized out>, static kMicrosecondsPerDay = <optimized out>, static kMicrosecondsPerWeek = <optimized out>,
static kNanosecondsPerMicrosecond = <optimized out>, static kNanosecondsPerSecond = <optimized out>, us_ = 0}, <No data fields>}, elapsed_ = {delta_ = 0}}}
has_pending_exception = false
args = 0xffeffd5d0
result = {val_ = 0xffeffd570}
#4 0x0000000001a98f50 in v8::Function::NewInstance (this=0x0) at ../deps/v8/src/api.cc:5176
No locals.
#5 0x0000000009c82903 in JavaObject::New (java=0x8c56a70, obj=0x9750e90) at ../src/javaObject.cpp:116
scope = {scope = {<v8::HandleScope> = {isolate_ = 0x60514c0, prev_next_ = 0x60c3c88, prev_limit_ = 0x60c5150}, escape_slot_ = 0x60c3c80}}
env = 0x935e210
className = "nodeJava_java_lang_Class"
__PRETTY_FUNCTION__ = "static v8::Local<v8::Object> JavaObject::New(Java*, jobject)"
javaScope = {m_env = 0x935e210, m_result = 0x0}
objClazz = 0x9868c30
classNameJava = 0x9868c40
ctor = {val_ = 0x0}
javaObjectObj = {val_ = 0xffeffd880}
self = 0x9c54468
classClazz = 0x9868c38
class_getName = 0x1e809c18
promisify = {val_ = 0x0}
funcTemplate = {val_ = 0x60c3c88}
#6 0x0000000009c8d660 in javaToV8 (java=0x8c56a70, env=0x935e210, obj=0x9750e90, dynamicProxyData=0x0) at ../src/utils.cpp:756
objClazz = 0x9750e98
resultType = TYPE_OBJECT
__PRETTY_FUNCTION__ = "v8::Local<v8::Value> javaToV8(Java*, JNIEnv*, jobject, DynamicProxyData*)"
#7 0x0000000009c8ccf0 in javaToV8 (java=0x8c56a70, env=0x935e210, obj=0x9750e90) at ../src/utils.cpp:657
No locals.
#8 0x0000000009c7899c in Java::findClassSync (info=...) at ../src/java.cpp:721
scope = {scope = {isolate_ = 0x60514c0, prev_next_ = 0x60c3a90, prev_limit_ = 0x60c5150}}
env = 0x935e210
className = "java.util.ArrayList"
self = 0x8c56a70
javaScope = {m_env = 0x935e210, m_result = 0x0}
_className_val = {str_ = 0x62664d0 "java.util.ArrayList", length_ = 19}
ensureJvmResults = {val_ = 0x6051538}
argsStart = 1
_className_obj = {val_ = 0xffeffe0b0}
clazz = 0x9750e90
result = {val_ = 0x4258afb9}
#9 0x0000000009c71c93 in Nan::imp::FunctionCallbackWrapper (info=...) at ../../nan/nan_callbacks_12_inl.h:174
obj = {val_ = 0xffeffded8}
callback = 0x9c785ee <Java::findClassSync(Nan::FunctionCallbackInfo<v8::Value> const&)>
cbinfo = {info_ = @0xffeffdd50, data_ = {val_ = 0x60c3a88}, static kHolderIndex = <optimized out>, static kIsolateIndex = <optimized out>,
static kReturnValueDefaultValueIndex = <optimized out>, static kReturnValueIndex = <optimized out>, static kDataIndex = <optimized out>,
static kCalleeIndex = <optimized out>, static kContextSaveIndex = <optimized out>, static kArgsLength = <optimized out>}
#10 0x0000000001acd746 in v8::internal::FunctionCallbackArguments::Call (this=0xffeffdea0,
f=0x9c71be6 <Nan::imp::FunctionCallbackWrapper(v8::FunctionCallbackInfo<v8::Value> const&)>) at ../deps/v8/src/api-arguments.cc:25
isolate = 0x60514c0
timer = {stats_ = 0x0, timer_ = {counter_ = 0x0, parent_ = {value_ = 0}, start_ticks_ = {<v8::base::time_internal::TimeBase<v8::base::TimeTicks>> = {
static kHoursPerDay = <optimized out>, static kMillisecondsPerSecond = <optimized out>, static kMillisecondsPerDay = <optimized out>,
static kMicrosecondsPerMillisecond = <optimized out>, static kMicrosecondsPerSecond = <optimized out>, static kMicrosecondsPerMinute = <optimized out>,
static kMicrosecondsPerHour = <optimized out>, static kMicrosecondsPerDay = <optimized out>, static kMicrosecondsPerWeek = <optimized out>,
static kNanosecondsPerMicrosecond = <optimized out>, static kNanosecondsPerSecond = <optimized out>, us_ = 0}, <No data fields>}, elapsed_ = {delta_ = 0}}}
state = {isolate_ = 0x60514c0, previous_tag_ = v8::JS}
info = {static kArgsLength = <optimized out>, static kHolderIndex = <optimized out>, static kIsolateIndex = <optimized out>,
static kReturnValueDefaultValueIndex = <optimized out>, static kReturnValueIndex = <optimized out>, static kDataIndex = <optimized out>,
static kCalleeIndex = <optimized out>, static kContextSaveIndex = <optimized out>, static kNewTargetIndex = <optimized out>, implicit_args_ = 0xffeffdeb8,
values_ = 0xffeffe0b0, length_ = 1}
call_scope = {isolate_ = 0x60514c0,
callback_ = 0x9c71be6 <Nan::imp::FunctionCallbackWrapper(v8::FunctionCallbackInfo<v8::Value> const&)> "UH\211\345H\203\354@H\211}\310H\213E\310H\211\307\350\262\320\377\377H\211E\360H\215E\360H\211\307\350b\362\377\377H\211E\320H\215E\320H\211\307\350\302\334\377\377\276\001", previous_scope_ = 0x0}
#11 0x0000000001bd97c3 in v8::internal::(anonymous namespace)::HandleApiCallHelper<false> (isolate=0x60514c0, function=..., new_target=..., fun_data=..., receiver=..., args=...)
at ../deps/v8/src/builtins/builtins-api.cc:111
call_data = 0x3eacfab78219
data_obj = 0x23db30e4cfe1
callback_obj = 0x23db30e4cfd1
callback = 0x9c71be6 <Nan::imp::FunctionCallbackWrapper(v8::FunctionCallbackInfo<v8::Value> const&)>
custom = {<v8::internal::CustomArguments<v8::FunctionCallbackInfo<v8::Value> >> = {<v8::internal::CustomArgumentsBase<8>> = {<v8::internal::Relocatable> = {
_vptr.Relocatable = 0x2ca40b0 <vtable for v8::internal::FunctionCallbackArguments+16>, isolate_ = 0x60514c0, prev_ = 0x0}, values_ = {0x23db30e0a901, 0x60514c0,
0xabca0f02351, 0xabca0f02351, 0x23db30e4cfe1, 0x3eacfab7a9e1, 0xabca0f02351, 0xabca0f02311}}, static kReturnValueOffset = 3}, static kArgsLength = 8,
static kHolderIndex = 0, static kDataIndex = 4, static kReturnValueDefaultValueIndex = 2, static kIsolateIndex = 1, static kCalleeIndex = 5,
static kContextSaveIndex = 6, static kNewTargetIndex = 7, argv_ = 0xffeffe0b0, argc_ = 1}
result = {<v8::internal::HandleBase> = {location_ = 0x60c3a78}, <No data fields>}
js_receiver = {<v8::internal::HandleBase> = {location_ = 0xffeffe0b8}, <No data fields>}
raw_holder = 0x23db30e0a901
raw_call_data = 0x3eacfab78219
#12 0x0000000001bd7a2f in v8::internal::Builtin_Impl_HandleApiCall (args=..., isolate=0x60514c0) at ../deps/v8/src/builtins/builtins-api.cc:140
__result__ = {<v8::internal::HandleBase> = {location_ = 0x0}, <No data fields>}
__isolate__ = 0x60514c0
function = {<v8::internal::HandleBase> = {location_ = 0xffeffe0a0}, <No data fields>}
new_target = {<v8::internal::HandleBase> = {location_ = 0xffeffe098}, <No data fields>}
fun_data = {<v8::internal::HandleBase> = {location_ = 0x60c3a78}, <No data fields>}
scope = {static kCheckHandleThreshold = 30720, isolate_ = 0x60514c0, prev_next_ = 0x60c3a78, prev_limit_ = 0x60c3a78}
receiver = {<v8::internal::HandleBase> = {location_ = 0xffeffe0b8}, <No data fields>}
#13 0x0000000001bd77db in v8::internal::Builtin_HandleApiCall (args_length=5, args_object=0xffeffe0b8, isolate=0x60514c0) at ../deps/v8/src/builtins/builtins-api.cc:128
args = {<v8::internal::Arguments> = {length_ = 5, arguments_ = 0xffeffe0b8}, static kNewTargetOffset = 0, static kTargetOffset = 1, static kArgcOffset = 2,
static kNumExtraArgs = 3, static kNumExtraArgsWithReceiver = 4}
#14 0x00001881e3d04264 in ?? ()
No symbol table info available.
#15 0x00001881e3d04181 in ?? ()
No symbol table info available.
#16 0x0000000ffeffe070 in ?? ()
No symbol table info available.
#17 0x0000000000000006 in ?? ()
No symbol table info available.
#18 0x0000000ffeffe0e0 in ?? ()
No symbol table info available.
#19 0x00001881e3e6ba0a in ?? ()
No symbol table info available.
#20 0x00000abca0f02311 in ?? ()
No symbol table info available.
#21 0x00003eacfab7a9e1 in ?? ()
No symbol table info available.
#22 0x0000000500000000 in ?? ()
No symbol table info available.
#23 0x00003c61323aaef1 in ?? ()
No symbol table info available.
#24 0x000023db30e0a901 in ?? ()
No symbol table info available.
Unfortunately, I don't have much context about the intended logic of the JavaObject::New method, maybe you could provide more context or some suggestions on how to fix it?