为什么我不能在node.js中结束活动的套接字而不会导致分段错误?
我试图阻止node.js中的一些HTTP服务器,但我不想等待所有keep-alive
连接超时,才能完全closures服务器。 所以,我一直试图跟踪所有活动的套接字,然后当服务器需要被停止时,我想调用.end()
让客户端知道我想closures套接字。 但是,当我这样做时,我得到了一个分段错误。
我已经使用了分段error handling程序来获得更好的堆栈跟踪,但我无法弄清楚会出现什么问题。
这里是跟踪连接的代码:
connectionNum = 1 activeHttpConnections = {} trackConnection = (map, socket) -> # save active socket id = connectionNum map[id.toString()] = socket # remove socket once it closes socket.on 'close', -> map[id.toString()] = null delete map[id.toString()] # reset connection number eventually if connectionNum > 1000000 connectionNum = 1 else connectionNum++
当服务器启动时,我打电话给:
httpServer.on 'connection', (socket) -> trackConnection activeHttpConnections, socket
当我停止我打电话的服务器时:
# close active connection so that servers can stop for key, socket of activeHttpConnections socket.end()
当.end()
被调用时,我得到以下堆栈跟踪:
PID 29943 received SIGSEGV for address: 0x58 /home/ryan/git/openhim-core-js/node_modules/segfault-handler/build/Release/segfault-handler.node(+0x1185)[0x7f50a037e185] /lib/x86_64-linux-gnu/libpthread.so.0(+0x10340)[0x7f50a2384340] node(_ZN4node10StreamWrap8ShutdownERKN2v820FunctionCallbackInfoINS1_5ValueEEE+0x166)[0x9d1846] node(_ZN2v88internal25FunctionCallbackArguments4CallEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEE+0x9b)[0x616d9b] node[0x6356b6] [0x270b80a060a2]
任何想法,我可能做错了,或者这个stacktrace可以指向什么?