在处理节点扩展中的大量数据包时,我的节点应用程序几乎随机崩溃。当我在gdb(使用调试符号编译的节点)中打开已删除的核心文件时,这就是我得到的:
Program terminated with signal 11, Segmentation fault.
#0 0x5e02190a in ?? ()
(gdb) bt
#0 0x5e02190a in ?? ()
#1 0x5e01316a in ?? ()
#2 0x08210303 in v8::internal::Invoke(bool, v8::internal::Handle<v8::internal::JSFunction>, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*, bool*) ()
#3 0x0821062f in v8::internal::Execution::New(v8::internal::Handle<v8::internal::JSFunction>, int, v8::internal::Handle<v8::internal::Object>*, bool*) ()
#4 0x081bfadd in v8::Function::NewInstance(int, v8::Handle<v8::Value>*) const ()
...
查看我的C数据包处理扩展的源代码,NewInstance实际上是对节点的缓冲区构造函数的调用。这是代码的有问题的片段(数据包是常规的c数据结构):
...
v8::Local<v8::Function> bufferConstructor = v8::Local<v8::Function>::Cast(globalObj->Get(v8::String::New("Buffer")));
v8::Handle<v8::Value> constructorArgs[3] = { slowBuf->handle_, v8::Integer::New(packet->packet->dataLength), v8::Integer::New(0) };
v8::Local<v8::Object> actualBuffer = bufferConstructor->NewInstance(3, constructorArgs);
现在,如果我理解正确,缓冲区源代码实际上是纯JS。
可能是什么策略可以找出JS代码在这个代码崩溃的确切位置以及原因?
代码在C级处理数千个数据包并将它们转换为节点缓冲区对象的日子里运行稳定,它总是会不时地使用相同的签名崩溃,我想了解为什么... < / p>