如何在我的代码无法在堆栈跟踪中调试node.js错误?

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

我正在使用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' }

由于堆栈跟踪中的JavaScript文件都不是我的,我不知道这是从哪里来的。 这基本上是试验和错误,试图捕捉错误并添加.on风格的错误处理程序,直到找到正确的位置。

我觉得我从根本上失去了一些东西 - 为了调试这样的错误,我应该做些什么不同的事情? 如果我无法看到(在我的代码中)导致它的怎么办? 我怎么知道我是否应该使用try / catch块,或者像request.on('error') {...}


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

现在,关于如何调试这些错误(包括第三方代码)的问题。 当然,你可以使用堆栈跟踪和longjohn等。

但是,对我来说,更简单快捷的解决方案是使用--inspect选项以调试模式运行应用程序,使用Chrome调试器检查它(没有断点),并启用暂停异常选项。 这就是你需要做的。 现在,无论何时出现异常,chrome调试器都会将该应用程序正好暂停在抛出异常的那一行。 使它更容易找到这样的错误。

暂停例外

希望这可以帮助你!


你可以做一些类似的事情来调试这样的错误。

process.on('uncaughtException', function(err) {
  console.log(err.stack);
  throw err;
});

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

node --stack_trace_limit=200 app.js //defaults to 10
node --stack-size=1024 app.js // defaults to 492kB

与你的假设相反,node.js的单线程范例导致了这些类型的错误。 在像java这样的多线程环境中,所有被调用的函数都在调用函数中执行:

java -> A -> B -> C -> D

所以如果A()被包装在try中并捕获所有的内部异常。

但在异步环境中,回调函数在调用者函数之外执行:

node -> A -> B(C)
node -> I -> C -> D

这里函数A调用异步函数B(通常是库),回调函数C作为参数,函数B完成后启动异步任务node.js调用函数I,该函数是库的内部函数,调用函数C.在这里你看到CD在你的代码之外被调用。

所以在这里需要考虑两件事情:

1-你必须包装你的回调函数代码。

2-在函数I中可能存在一个例外,您无法在代码中捕捉到该例外。 这些是你所指的那些例外,堆栈跟踪中的JavaScript文件都不是你的,因为它不是在你的代码中启动的。

现在,如果函数B (它的库)写得很好,它必须提供一些方法来捕获这些异常。 其中一个on('error', cb) 。 所以你应该总是检查图书馆文件,看看你如何能够捕捉和处理这种例外情况。

如果库编写得不好,并且没有提供任何代码来捕获代码中的异常,则可以使用诸如Chrome检查器或WebStorm调试器之类的调试器来捕获它们,但除了操作其源代码之外别无它法,因此至少它们被绕过你的代码,或者你可以提交一个错误报告。

Node.js还提供了一个捕获所有未捕获异常的未捕获异常处理程序:

process.on('uncaughtException', (err) => {
    process.exit(1);
});

尽管在这之后继续执行是有风险的,因为事情可能处于不确定的状态,但它是记录错误的好地方。

链接地址: http://www.djcxy.com/p/52653.html

上一篇: How do I debug node.js errors when my code is nowhere in the stack trace?

下一篇: How to call a JavaScript function on a web page rendered by Electron?