当我的代码在堆栈跟踪中没有任何地方时,如何调试node.js错误?

Jer*_*Jer 12 node.js express

实际上,如果节点是单线程的,我不完全理解为什么我的代码不在堆栈跟踪中.也许我从根本上误解了一些问题,但是为什么我的应用程序有时会因为堆栈跟踪没有我写的任何东西而死?

我正在使用node/express编写一个非常简单的代理服务器.作为一个例子,我定期得到这个"套接字挂起错误":

Error: socket hang up
 at createHangUpError (_http_client.js:250:15)
 at Socket.socketOnEnd (_http_client.js:342:23)
 at emitNone (events.js:91:20)
 at Socket.emit (events.js:185:7)
 at endReadableNT (_stream_readable.js:926:12)
 at _combinedTickCallback (internal/process/next_tick.js:74:11)
 at process._tickCallback (internal/process/next_tick.js:98:9) code: 'ECONNRESET' }
Run Code Online (Sandbox Code Playgroud)

由于堆栈跟踪中的javascript文件都不是我的,我不知道它来自何处.它基本上是试验和错误,试图捕获错误并添加.on样式错误处理程序,直到找到正确的位置.

我觉得我从根本上错过了一些东西 - 为了调试这样的错误,我应该做些什么呢?如果我看不到(在我的代码中)是什么导致它,我怎么知道在哪里处理它?我怎么知道我是否应该使用try/catch块,或类似的东西request.on('error') {...}

San*_*was 9

某些错误(如您提到的错误)不是由您的代码引起的.实际上,这是由于应用程序中没有代码造成的.(例如,您的应用程序代码可能缺少用于正常处理ECONNRESET的代码,即远程套接字断开连接.

现在,关于如何调试此类错误(包括第三方代码)的问题.当然,你可以使用stack-trace和longjohn等.

但是,对我来说,更容易更快速的解决方案是使用--inspect选项在调试模式下运行应用程序,使用Chrome调试器检查它(没有断点),并启用Pause on Exceptions选项.这就是你需要做的.现在,只要有异常,chrome调试器就会将应用程序暂停在引发异常的行.使找到这样的错误变得容易得多.

暂停异常

希望这对你有所帮助!


Kau*_*hal 7

您可以执行类似的操作来调试此类错误。

process.on('uncaughtException', function(err) {
  console.log(err.stack);
  throw err;
});
Run Code Online (Sandbox Code Playgroud)

您还可以增加堆栈跟踪大小限制和/或堆栈大小。

node --stack_trace_limit=200 app.js //defaults to 10
node --stack-size=1024 app.js // defaults to 492kB
Run Code Online (Sandbox Code Playgroud)