在使用PM2运行快速应用程序时,我随机收到SIGSEGV。奇怪的是,过去几周服务器运行良好。它不会打印任何错误消息,除了:
App [XXX] with id [7] and pid [27757], exited with code [255] via signal [SIGSEGV]
在实现“segfault-handler”模块后,我开始收到一些堆栈跟踪。应用程序似乎遇到了一些不同的分段错误:
/lib/x86_64-linux-gnu/libpthread.so.0(+0x10330)[0x7fd211f87330]
node(_ZN2v88internal9HashTableINS0_15ObjectHashTableENS0_20ObjectHashTableShapeENS0_6HandleINS0_6ObjectEEEE18FindInsertionEntryEj+0x40)[0xc0b680]
node(_ZN2v88internal15ObjectHashTable3PutENS0_6HandleIS1_EENS2_INS0_6ObjectEEES5_i+0x124)[0xc0c0a4]
node(_ZN2v88internal7Runtime17WeakCollectionSetENS0_6HandleINS0_16JSWeakCollectionEEENS2_INS0_6ObjectEEES6_i+0x59)[0xc7d639]
node(_ZN2v88internal25Runtime_WeakCollectionSetEiPPNS0_6ObjectEPNS0_7IsolateE+0x11d)[0xc7d89d]
[0x2acdd80963b]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x10330)[0x7f0fc311c330]
node(_ZN2v88internal32IncrementalMarkingMarkingVisitor26VisitFixedArrayIncrementalEPNS0_3MapEPNS0_10HeapObjectE+0x376)[0xad8a16]
node(_ZN2v88internal18IncrementalMarking4StepElNS1_16CompletionActionENS1_18ForceMarkingActionENS1_21ForceCompletionActionE+0x2c1)[0xad6181]
node(_ZN2v88internal8NewSpace15SlowAllocateRawEiNS0_19AllocationAlignmentE+0x74)[0xb05244]
node(_ZN2v88internal4Heap11AllocateRawEiNS0_15AllocationSpaceES2_NS0_19AllocationAlignmentE+0x1b9)[0xa678c9]
node(_ZN2v88internal4Heap20AllocateFillerObjectEibNS0_15AllocationSpaceE+0x19)[0xab00b9]
node(_ZN2v88internal7Factory15NewFillerObjectEibNS0_15AllocationSpaceE+0x2d)[0xa67d1d]
node(_ZN2v88internal29Runtime_AllocateInTargetSpaceEiPPNS0_6ObjectEPNS0_7IsolateE+0x5e)[0xc99e8e]
[0x249862c06355]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x10330)[0x7fbebabd2330]
node(_ZN2v88internal9HashTableINS0_15ObjectHashTableENS0_20ObjectHashTableShapeENS0_6HandleINS0_6ObjectEEEE18FindInsertionEntryEj+0x40)[0xc0b680]
node(_ZN2v88internal15ObjectHashTable3PutENS0_6HandleIS1_EENS2_INS0_6ObjectEEES5_i+0x124)[0xc0c0a4]
node(_ZN2v88internal7Runtime17WeakCollectionSetENS0_6HandleINS0_16JSWeakCollectionEEENS2_INS0_6ObjectEEES6_i+0x59)[0xc7d639]
node(_ZN2v88internal25Runtime_WeakCollectionSetEiPPNS0_6ObjectEPNS0_7IsolateE+0x11d)[0xc7d89d]
[0x125b9620963b]
我知道这里的信息很少。谁能告诉我一个开始诊断的好方法?我已经检查了PM2日志,mongoDB日志,但没有运气。
谢谢! 火星
答案 0 :(得分:1)
由于堆栈跟踪每次都不同而且不是很有启发性,所以你所能做的只是尝试。第一个主要嫌疑人将是使用本机代码的东西,因为普通的Javascript不太可能导致segFault。它可能是以某种方式损坏内存或者没有与node.js中的垃圾收集器正确交互的本机代码。
因此,要查找的内容是当前版本的node.js与使用本机代码的东西(例如mongoDB)之间的交互。以下是要尝试的事项:
识别所有使用本机代码的模块,并暂时删除任何无法使用的模块。
将node.js和mongoDB升级到最新版本,以防它们在导致问题的特定版本之间发生某种交互。如果您无法将node.js升级到最新的稳定版本,那么请确保您运行的所有模块都已通过您拥有的node.js版本的稳定性。
< / LI>重新启动服务器,以防万一在操作系统中出现任何导致问题的事情。
从干净的数据库开始,或者对数据库运行某种数据库检查,以验证那里没有损坏。
每当您更新数据库方案时,请确保您有一个向前移动先前数据库的策略(在MongoDB中,您可以确保为新方案元素分配默认值)。
在进行更改后收集新信息并重复此过程,尝试一次只更改一件事,这样如果它修复了问题,您就会确切知道修复它的项目。
< / LI> 醇>答案 1 :(得分:0)
当您使用node_modules
复制包含二进制模块的代码时,可能会发生类似情况,这些二进制模块的编译结构与您尝试运行它的结构不同。
尝试从头开始删除node_modules
并运行npm install
,或者您可以尝试运行npm rebuild
而不删除node_modules
。