一位同事曾告诉我,当Linux上的所有内容都无法调试时,最后一个选项是使用strace.
我试图学习这个奇怪工具背后的科学,但我不是系统管理大师,我没有真正得到结果.
所以,
简而言之,简单来说,这些东西是如何工作的?
我正在运行带有socket.io的Express js应用程序用于聊天webapp,并且我在24小时内随机获得以下错误5次左右.节点进程永远包装,并立即重新启动.
问题是重新启动快速将我的用户踢出他们的房间而没人想要.
Web服务器由HAProxy代理.没有套接字稳定性问题,只使用websockets和flashsockets传输.我无法故意重现这一点.
这是节点v0.10.11的错误:
events.js:72
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET //alternatively it s a 'write'
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
error: Forever detected script exited with code: 8
error: Forever restarting script for 2 time
Run Code Online (Sandbox Code Playgroud)
编辑(2013-07-22)
添加了socket.io客户端错误处理程序和未捕获的异常处理程序.似乎这个捕获了错误:
process.on('uncaughtException', function (err) {
console.error(err.stack);
console.log("Node NOT Exiting...");
});
Run Code Online (Sandbox Code Playgroud)
所以我怀疑它不是socket.io问题,而是对我做的另一个服务器的http请求或mysql/redis连接.问题是错误堆栈无法帮助我识别代码问题.这是日志输出:
Error: read ECONNRESET
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
Run Code Online (Sandbox Code Playgroud)
我怎么知道是什么原因造成的?如何从错误中获得更多信息?
好吧,不是很冗长,但这里是带有"longjohn"的堆栈跟踪:
Exception caught: Error ECONNRESET
{ [Error: read ECONNRESET]
code: 'ECONNRESET',
errno: 'ECONNRESET',
syscall: 'read',
__cached_trace__: …
Run Code Online (Sandbox Code Playgroud) 我正在使用节点服务器来处理我的所有推送通知服务,如gcm和apn.
我有2个不同的服务器.一个运行Meteor,另一个运行Node.JS来处理推送通知.(两者都是不同的服务器)
我的主应用程序在Meteor服务器上运行.
我向node.js服务器发出HTTP post请求以发送我的通知.
通常它工作正常,但有时在Meteor服务器上,每当我调用node.js服务器时,我都会收到此错误:
socket hang up\n at Object.Future.wait (/home/myPc/.meteor/packages/meteor-tool/.1.1.10.ki0ccv++os.linux.x86_64+web.browser+web.cordova/mt-os.linux.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:398:15)\n at Object.<anonymous> (packages/meteor/helpers.js:119:1)\n at Object.HTTP.call (packages/meteorhacks_kadira/lib/hijack/http.js:10:1)\n at Object.sendPushNotificationsMeteorServer (server/pushNotifications.js:249:1)\n at server/classes/pushNotifications.js:244:1\n at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1)\n at packages/meteor/timers.js:6:1\n at runWithEnvironment (packages/meteor/dynamics_nodejs.js:110:1)\n - - - - -\n at createHangUpError (http.js:1473:15)\n at Socket.socketOnEnd [as onend] (http.js:1569:23)\n at Socket.g (events.js:180:16)\n at Socket.emit (events.js:117:20)\n at _stream_readable.js:944:16\n at process._tickCallback (node.js:448:13)',
details: { [Error: socket hang up] stack: [Getter] },
data: { [Error: socket hang up] stack: [Getter] },
user: null,
userId: null,
toString: [Function] …
Run Code Online (Sandbox Code Playgroud) 实际上,如果节点是单线程的,我不完全理解为什么我的代码不在堆栈跟踪中.也许我从根本上误解了一些问题,但是为什么我的应用程序有时会因为堆栈跟踪没有我写的任何东西而死?
我正在使用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') {...}
?
我收到连接重置错误。我相当确定这是来自长时间运行的 REST 请求,即超时。
{ [Error: socket hang up] code: 'ECONNRESET' }
Run Code Online (Sandbox Code Playgroud)
有没有办法在 Koa 中禁用请求超时,以便我可以测试这个假设?
我正在运行节点版本 5.x、koa 0.10、centOs 6
当客户端在仍然加载页面时刷新(因此套接字被终止,而我仍在处理请求)时,节点会一直退出.错误:
[ERROR] - Error: socket hang up
at createHangUpError (http.js:1472:15)
at Socket.socketCloseListener (http.js:1522:23)
at Socket.EventEmitter.emit (events.js:95:17)
at TCP.close (net.js:465:12) (at lib/Maintenance.js:38)
Run Code Online (Sandbox Code Playgroud)
我尝试附加on('error', ...
到:
req
对象listen
(我使用Express)的返回值get
,use
和post
方法.然而,我似乎无法捕捉到这个错误; 它仍然被抛出,我的错误处理程序都没有反应.我可能会错过什么?