问题是这样的,blink线程的void WaitableEvent::Wait() 里会卡死,等待UI线程。但UI线程可能在等blink线程的npapi真窗口响应消息。
理论上的解决方式,应该是blink线程不放真窗口,但实在要改太多东西,现在我只好折中一下,把void WaitableEvent::Wait()里加上消息循环,临时处理下真窗口消息。
但这样又有重入的问题:
KernelBase.dll!_DebugBreak@0 未知
node.dll!logging::LogMessage::Init C++
node.dll!logging::LogMessage::LogMessage C++
node.dll!gpu::gles2::GLES2Implementation::SingleThreadChecker::SingleThreadChecker C++
node.dll!gpu::gles2::GLES2Implementation::Viewport C++
node.dll!gpu_blink::WebGraphicsContext3DImpl::viewport C++
node.dll!blink::WebGLRenderingContextBase::viewport C++
node.dll!blink::WebGLRenderingContextV8Internal::viewportMethod C++
node.dll!blink::WebGLRenderingContextV8Internal::viewportMethodCallback C++
node.dll!v8::internal::FunctionCallbackArguments::Call C++
node.dll!v8::internal::`anonymous namespace'::HandleApiCallHelper<0> C++
node.dll!v8::internal::Builtin_Impl_HandleApiCall C++
node.dll!v8::internal::Builtin_HandleApiCall C++
3d28607e 未知
node.dll!v8::internal::`anonymous namespace'::Invoke C++
node.dll!v8::internal::Execution::Call C++
node.dll!v8::Function::Call C++
node.dll!blink::V8ScriptRunner::callFunction C++
node.dll!blink::ScriptController::callFunction C++
node.dll!blink::V8FrameRequestCallback::handleEvent C++
node.dll!blink::FrameRequestCallbackCollection::executeCallbacks C++
node.dll!blink::ScriptedAnimationController::executeCallbacks C++
node.dll!blink::ScriptedAnimationController::serviceScriptedAnimations C++
node.dll!blink::Document::serviceScriptedAnimations C++
node.dll!blink::PageAnimator::serviceScriptedAnimations C++
node.dll!blink::PageWidgetDelegate::animate C++
node.dll!blink::WebViewImpl::beginFrame C++
node.dll!content::WebPageImpl::onBeginMainFrame C++
node.dll!content::RenderWidgetCompositor::BeginMainFrame C++
node.dll!cc::LayerTreeHost::BeginMainFrame C++
node.dll!cc::ThreadProxy::BeginMainFrame C++
node.dll!base::internal::RunnableAdapter<void (__thiscall cc::ThreadProxy::*)(scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState,base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState> >)>::Run C++
node.dll!base::internal::InvokeHelper<1,void,base::internal::RunnableAdapter<void (__thiscall cc::ThreadProxy::*)(scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState,base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState> >)>,base::internal::TypeList<base::WeakPtr<cc::ThreadProxy> const &,scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState,base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState> > > >::MakeItSo C++
node.dll!base::internal::Invoker<base::IndexSequence<0,1>,base::internal::BindState<base::internal::RunnableAdapter<void (__thiscall cc::ThreadProxy::*)(scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState,base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState> >)>,void __cdecl(cc::ThreadProxy *,scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState,base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState> >),base::internal::TypeList<base::WeakPtr<cc::ThreadProxy>,base::internal::PassedWrapper<scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState,base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState> > > > >,base::internal::TypeList<base::internal::UnwrapTraits<base::WeakPtr<cc::ThreadProxy> >,base::internal::UnwrapTraits<base::internal::PassedWrapper<scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState,base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState> > > > >,base::internal::InvokeHelper<1,void,base::internal::RunnableAdapter<void (__thiscall cc::ThreadProxy::*)(scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState,base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState> >)>,base::internal::TypeList<base::WeakPtr<cc::ThreadProxy> const &,scoped_ptr<cc::ThreadProxy::BeginMainFrameAndCommitState,base::DefaultDeleter<cc::ThreadProxy::BeginMainFrameAndCommitState> > > >,void __cdecl(void)>::Run C++
node.dll!base::Callback<void __cdecl(void)>::Run C++
node.dll!base::debug::TaskAnnotator::RunTask C++
node.dll!base::MessageLoop::RunTask C++
node.dll!base::MessageLoop::DeferOrRunPendingTask C++
node.dll!base::MessageLoop::DoWork C++
node.dll!base::MessagePumpForUI::HandleWorkMessage C++
node.dll!base::MessagePumpForUI::WndProcThunk C++
node.dll!base::win::WrappedWindowProc<&base::MessagePumpForUI::WndProcThunk> C++
user32.dll!_InternalCallWinProc@20 未知
user32.dll!_UserCallWinProcCheckWow@32 未知
user32.dll!_DispatchMessageWorker@8 未知
user32.dll!_DispatchMessageW@4 未知
> node.dll!base::WaitableEvent::Wait C++
node.dll!gpu::InProcessCommandBuffer::WaitForGetOffsetInRange C++
node.dll!gpu::CommandBufferHelper::WaitForGetOffsetInRange C++
node.dll!gpu::CommandBufferHelper::Finish C++
node.dll!gpu::gles2::GLES2Implementation::WaitForCmd C++
node.dll!gpu::gles2::GLES2Implementation::CheckFramebufferStatus C++
node.dll!gpu_blink::WebGraphicsContext3DImpl::checkFramebufferStatus C++
node.dll!blink::DrawingBuffer::resizeFramebuffer C++
node.dll!blink::DrawingBuffer::reset C++
node.dll!blink::WebGLRenderingContextBase::reshape C++
node.dll!blink::HTMLCanvasElement::reset C++
node.dll!blink::HTMLCanvasElement::parseAttribute C++
node.dll!blink::Element::attributeChanged C++
node.dll!blink::Element::didModifyAttribute C++
node.dll!blink::Element::setAttributeInternal C++
node.dll!blink::Element::setAttribute C++
node.dll!blink::Element::setIntegralAttribute C++
node.dll!blink::HTMLCanvasElement::setHeight C++
node.dll!blink::HTMLCanvasElementV8Internal::heightAttributeSetter C++
node.dll!blink::HTMLCanvasElementV8Internal::heightAttributeSetterCallback C++
node.dll!v8::internal::FunctionCallbackArguments::Call C++
node.dll!v8::internal::`anonymous namespace'::HandleApiCallHelper<0> C++
node.dll!v8::internal::Builtins::InvokeApiFunction C++
node.dll!v8::internal::Object::SetPropertyWithAccessor C++
node.dll!v8::internal::Object::SetPropertyInternal C++
node.dll!v8::internal::Object::SetProperty C++
node.dll!v8::internal::StoreIC::Store C++
node.dll!v8::internal::Runtime_StoreIC_Miss C++
3d28607e 未知
node.dll!v8::internal::`anonymous namespace'::Invoke C++
node.dll!v8::internal::Execution::Call C++
node.dll!v8::Function::Call C++
node.dll!blink::V8ScriptRunner::callFunction C++
node.dll!blink::ScriptController::callFunction C++
node.dll!blink::ScriptController::callFunction C++
node.dll!blink::V8EventListener::callListenerFunction C++
node.dll!blink::V8AbstractEventListener::invokeEventHandler C++
node.dll!blink::V8AbstractEventListener::handleEvent C++
node.dll!blink::V8AbstractEventListener::handleEvent C++
node.dll!blink::EventTarget::fireEventListeners C++
node.dll!blink::EventTarget::fireEventListeners C++
node.dll!blink::Node::handleLocalEvents C++
node.dll!blink::NodeEventContext::handleLocalEvents C++
node.dll!blink::EventDispatcher::dispatchEventAtTarget C++
node.dll!blink::EventDispatcher::dispatch C++
node.dll!blink::EventDispatchMediator::dispatchEvent C++
node.dll!blink::EventDispatcher::dispatchEvent C++
node.dll!blink::Node::dispatchEvent C++
node.dll!blink::HTMLImageLoader::dispatchLoadEvent C++
node.dll!blink::ImageLoader::dispatchPendingLoadEvent C++
node.dll!blink::ImageLoader::dispatchPendingEvent C++
node.dll!blink::EventSender<blink::ImageLoader>::dispatchPendingEvents C++
node.dll!blink::EventSender<blink::ImageLoader>::timerFired C++
node.dll!blink::Timer<blink::EventSender<blink::ImageLoader> >::fired C++
node.dll!blink::TimerBase::runInternal C++
node.dll!blink::TimerBase::CancellableTimerTask::run C++
node.dll!content::WebTimerBase::fired C++
node.dll!content::WebThreadImpl::schedulerTasks C++
node.dll!content::WebThreadImpl::fire C++
node.dll!content::sharedTimerFiredFunction C++
node.dll!content::TimerWindowWndProc C++
user32.dll!_InternalCallWinProc@20 未知
user32.dll!_UserCallWinProcCheckWow@32 未知
user32.dll!_DispatchMessageWorker@8 未知
user32.dll!_DispatchMessageW@4 未知
node.dll!base::MessagePumpForUI::ProcessMessageHelper C++
node.dll!base::MessagePumpForUI::ProcessNextWindowsMessage C++
node.dll!base::MessagePumpForUI::DoRunLoop C++
node.dll!base::MessagePumpWin::RunWithDispatcher C++
node.dll!base::MessagePumpWin::Run C++
node.dll!base::MessageLoop::RunHandler C++
node.dll!base::RunLoop::Run C++
node.dll!base::RunLoop::RunUntilIdle C++
node.dll!base::MessageLoop::RunUntilIdle C++
node.dll!content::OrigChromeMgr::runUntilIdle C++
node.dll!wkeSetDebugConfig C++
mb.dll!040fd7a9 未知
mb.dll!040fdca9 未知
mb.dll!04186d0d 未知
kernel32.dll!@BaseThreadInitThunk@12 未知
ntdll.dll!___RtlUserThreadStart@8 未知
ntdll.dll!__RtlUserThreadStart@8 未知
现在的解决方案是搞个重入禁止的标记。