v8 JavaScript函数执行在运行时挂起\u TryInstallOptimizedCode

v8 JavaScript函数执行在运行时挂起\u TryInstallOptimizedCode,javascript,node.js,v8,embedded-v8,Javascript,Node.js,V8,Embedded V8,在将嵌入式V8库从3.28.4升级到6.1.534.47(与当前的node.js 8.9.1相同)之后,我注意到了一个奇怪的问题。我有一些将事件分派到JavaScript代码的代码(基本上归结为调用v8::Function::Call())。这可以运行数千次,但最终v8::Function::Call()不会返回,挂起在v8::internal::Runtime\u TryInstallOptimizedCode()中 以下是堆栈跟踪: frame #0: 0x0000000104f43cfc

在将嵌入式V8库从3.28.4升级到6.1.534.47(与当前的node.js 8.9.1相同)之后,我注意到了一个奇怪的问题。我有一些将事件分派到JavaScript代码的代码(基本上归结为调用
v8::Function::Call()
)。这可以运行数千次,但最终
v8::Function::Call()
不会返回,挂起在
v8::internal::Runtime\u TryInstallOptimizedCode()

以下是堆栈跟踪:

frame #0: 0x0000000104f43cfc libv8.dylib`v8::internal::Runtime_TryInstallOptimizedCode(int, v8::internal::Object**, v8::internal::Isolate*) [inlined] v8::internal::__RT_impl_Runtime_TryInstallOptimizedCode(v8::internal::Arguments, v8::internal::Isolate*) at runtime-compiler.cc:374 [opt]
frame #1: 0x0000000104f43cd5 libv8.dylib`v8::internal::Runtime_TryInstallOptimizedCode(args_length=1, args_object=0x0000700001d1a0f0, isolate=0x000000010182d200) at runtime-compiler.cc:371 [opt]
frame #2: 0x000028715ea040bd
frame #3: 0x000028715ea15b12
frame #4: 0x000028715ea12cf0
frame #5: 0x000028715eadea2d
frame #6: 0x0000000104cb5ba3 libv8.dylib`v8::internal::(anonymous namespace)::Invoke(isolate=0x000000010182d2c8, is_construct=<unavailable>, target=<unavailable>, receiver=<unavailable>, argc=1, args=0x0000700001d1ad10, new_target=<unavailable>, message_handling=<unavailable>) at execution.cc:145 [opt]
frame #7: 0x0000000104cb58cc libv8.dylib`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>*) [inlined] v8::internal::(anonymous namespace)::CallInternal(message_handling=kReport) at execution.cc:181 [opt]
frame #8: 0x0000000104cb585d libv8.dylib`v8::internal::Execution::Call(isolate=0x000000010182d200, callable=Handle<v8::internal::Object> @ r12, receiver=<unavailable>, argc=1, argv=0x0000700001d1ad10) at execution.cc:191 [opt]
frame #9: 0x0000000104984d80 libv8.dylib`v8::Function::Call(this=0x000000010281fa50, context=<unavailable>, recv=<unavailable>, argc=1, argv=0x0000700001d1ad10) at api.cc:5343 [opt]
frame #10: 0x0000000104849c01 libPocoJSCored.1.dylib`Poco::JS::Core::JSExecutor::callInContext(this=0x0000000102029a00, jsObject=0x0000000100e64458, method="valueChanged", argc=1, argv=0x0000700
frame#0:0x0000000104f43cfc libv8.dylib`v8::internal::Runtime_TryInstallOptimizedCode(int,v8::internal::Object**,v8::internal::Isolate*)[inlined]v8::internal:::u RT_impl_Runtime__TryInstallOptimizedCode(v8::internal::Arguments,v8::internal::Isolate*)运行时编译器处。cc:374[opt]
运行时编译器处的帧#1:0x0000000104f43cd5 libv8.dylib`v8::internal::Runtime_TryInstallOptimizedCode(args_length=1,args_object=0x00007001D1A00,isolate=0x000000010182d200)。cc:371[opt]
帧#2:0x000028715ea040bd
帧#3:0x000028715ea15b12
帧#4:0x000028715ea12cf0
帧#5:0x000028715eadea2d
帧#6:0x0000000104cb5ba3 libv8.dylib`v8::internal::(匿名命名空间)::在执行时调用(insolate=0x000000010182d2c8,is_-construct=,target=,receiver=,argc=1,args=0x0000070001D1AD10,new_-target=,message_-handling=)。cc:145[opt]
帧#7:0x0000000104cb58cc libv8.dylib`v8::internal::Execution::Call(v8::internal::Isolate*,v8::internal::Handle,int,v8::internal::Handle,int,v8::internal::Handle*)[inline]v8::internal::(匿名命名空间)::CallInternal(message_handleing=kReport)在执行时。cc:181[opt]
帧#8:0x0000000104cb585d libv8.dylib`v8::internal::Execution::Call(insolate=0x000000010182d200,callable=Handle@r12,receiver=,argc=1,argv=0x00007001D1AD10)在执行时。cc:191[opt]
api.cc:5343[opt]处的帧#9:0x0000000104984d80 libv8.dylib`v8::Function::Call(this=0x000000010281fa50,context=,recv=,argc=1,argv=0x00007001D1AD10)
帧#10:0x0000000104849c01 libpocojoj0.1.dylib`Poco::JS::Core::JSExecutor::callInContext(this=0x0000000102029a00,jsObject=0x0000000100e64458,method=“valueChanged”,argc=1,argv=0x00000700
在macOS 10.12和Clang/Apple LLVM 9.0以及Ubuntu 17.10和GCC 7.2上都观察到了这一点


有什么想法吗?

这里是V8开发者。请在上提交一个bug

你在用线做什么古怪的事吗

你有可以分享的复制品吗

如果使用--trace opt运行,在挂起之前,输出的最后几行是什么


您是否可以在调试模式下编译并在调试器中运行,以查看它的具体挂起位置?(一个明显的猜测是等待
优化compiledispatcher::InstallOptimizedFunctions()中的
输出\u队列\u互斥\u
,但我不知道该互斥锁上的死锁是如何发生的,因此在找到错误的树之前,最好先确定问题的确切原因。)

谢谢。在此期间,我因其他问题而分心,但今天将提交一份包含更多信息的错误报告。在此继续:此错误已在以后的V8版本中修复(6.4+),请参见。对于6.2/6.3,您可以自己选择修复,例如,Node正在执行此操作: