【问题标题】:Difficult node.js + libuv + v8 error困难的node.js + libuv + v8错误
【发布时间】:2012-06-18 10:43:03
【问题描述】:

我在 node.js c++ 插件中使用 uv_queue_work 做一些并行工作。

一切正常,直到我尝试从 Complete 方法回调 JS

我得到:CHECK(thread_local_top()->TryCatchHandler() == that) 失败。

关于可能导致此问题的任何指针?

我正在使用以下代码进行回调:

    //Get emit method from JS object and check !IsEmpty and IsFunction
    v8::TryCatch tc;                
    emit->Call(pxy,1,argv);   // The error happens in this statement.
    if (tc.HasCaught()){
        //Some handler code
    }

【问题讨论】:

  • 在我看来,您正试图从另一个线程调用回调。您能否发布更多代码,例如您是如何使用 uv_queue_work 的?
  • 这也是我的第一个想法,我之前确实运行了以下实用程序方法,据我了解,如果不在 V8 线程上,它应该返回 false。 bool Util::V8Thread(){ return v8::Isolate::GetCurrent() != NULL; }; 我正在使用以下命令启动进程: uv_queue_work(loop,baton,Worker,WorkerComplete);并且错误发生在“WorkerComplete”中
  • 断言表明 try catch 处理程序堆栈不知何故变得不平衡。如果没有看到更多代码或至少来自 gdb 的堆栈跟踪,很难猜测为什么。
  • 感谢您提供有用的错误描述!现在我知道要寻找什么了 :) 代码非常复杂,所以我想我将尝试在一个简单的项目中重现。 GDB 堆栈只是显示了 uv 方法和完整的回调......希望我能深入了解这个!

标签: c++ node.js v8 libuv


【解决方案1】:

好的,不确定发生错误的确切原因,但我能够通过使用 node::MakeCallback 而不是 emit->Call 来消除它。

真的不确定为什么会发生这种情况,并且有点担心,因为一直在谈论弃用 MakeCallback...

编辑: 我很乐意接受任何可以阐明这一点的答案。希望在此期间使用 MakeCallback”可以拯救其他人 :)

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 2016-04-26
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多