在 SIGPIPE 上使用 N-API C++ 插件时,node js 应用程序在 uv_try_write 中崩溃。我该如何处理/预防这个问题?

分享于2022年07月17日 c++ libuv n-api node.js v8 问答
【问题标题】:在 SIGPIPE 上使用 N-API C++ 插件时,node js 应用程序在 uv_try_write 中崩溃。我该如何处理/预防这个问题?(node js application is crashing in uv_try_write while using N-API C++ addon on SIGPIPE. how can I handle/prevent the issue?)
【发布时间】:2022-07-11 14:06:20
【问题描述】:

当操作系统发送 SIGPIPE 时,我遇到了节点应用程序崩溃的问题。我正在使用 N-API C++ 插件使用函数回调向套接字发送/接收消息。有没有办法找到根本原因或处理相同的问题,以便应用程序不会崩溃或通过查找根本原因来防止问题?

下面是相同的堆栈跟踪

Walk Stack Trace Size=[14]
[0x5d171e0]
/lib64/libpthread.so.0(+0xf5e0) [0x7fc924a935e0]
/lib64/libc.so.6(writev+0x60) [0x7fc9247b0230]
/home/panadmin/bin/node() [0x1386621]
/home/panadmin/bin/node(uv_write2+0x203) [0x13878a3]
/home/panadmin/bin/node(uv_try_write+0x6d) [0x1387b7d]
/home/panadmin/bin/node(_ZThn88_N4node15LibuvStreamWrap10DoTryWriteEPP8uv_buf_tPm+0x26) [0xadace6]
/home/panadmin/bin/node(_ZN4node10StreamBase6WritevERKN2v820FunctionCallbackInfoINS1_5ValueEEE+0x322) [0xad11d2]
/home/panadmin/bin/node(_ZN4node10StreamBase8JSMethodIXadL_ZNS0_6WritevERKN2v820FunctionCallbackInfoINS2_5ValueEEEEEEEvS7_+0xa0) [0xad37f0]
/home/panadmin/bin/node() [0xbe456b]
/home/panadmin/bin/node() [0xbe5b16]
/home/panadmin/bin/node(_ZN2v88internal21Builtin_HandleApiCallEiPmPNS0_7IsolateE+0x16) [0xbe6196]
/home/panadmin/bin/node() [0x1400119]
Segmentation violation occured
Walk Stack Trace Size=[16]
[0x5d171e0]
/lib64/libpthread.so.0(+0xf5e0) [0x7fc924a935e0]
/lib64/libpthread.so.0(pthread_mutex_lock+0) [0x7fc924a8dc30]
/home/panadmin/bin10.14.0.0.SP5/Framework/cim_addons/pm/Release/pm_interface.node(_ZN4PLog12flush_outputEv+0x1c) [0x7fc8f43a1d52]
/home/panadmin/bin10.14.0.0.SP5/Framework/cim_addons/pm/Release/pm_interface.node(_ZN10PAppLogger12flush_outputEv+0x16) [0x7fc8f43a13ee]
/home/panadmin/bin10.14.0.0.SP5/Framework/cim_addons/pm/Release/pm_interface.node(_Z17linux_sig_handleri10sigcontext+0x125) [0x7fc8f43a11e7]
/lib64/libpthread.so.0(+0xf5e0) [0x7fc924a935e0]
/lib64/libc.so.6(writev+0x60) [0x7fc9247b0230]
/home/panadmin/bin/node() [0x1386621]
/home/panadmin/bin/node(uv_write2+0x203) [0x13878a3]
/home/panadmin/bin/node(uv_try_write+0x6d) [0x1387b7d]
/home/panadmin/bin/node(_ZThn88_N4node15LibuvStreamWrap10DoTryWriteEPP8uv_buf_tPm+0x26) [0xadace6]
/home/panadmin/bin/node(_ZN4node10StreamBase6WritevERKN2v820FunctionCallbackInfoINS1_5ValueEEE+0x322) [0xad11d2]
/home/panadmin/bin/node(_ZN4node10StreamBase8JSMethodIXadL_ZNS0_6WritevERKN2v820FunctionCallbackInfoINS2_5ValueEEEEEEEvS7_+0xa0) [0xad37f0]
/home/panadmin/bin/node() [0xbe456b]

  • 尝试在调试模式下编译 Node 和你的插件并在调试器(例如 GDB)中运行它们。
  • @jmrk 问题发生在生产环境中,我们无法像这样进行调试,并且在本地无法复制。与环境有关的事情导致了这个问题。 strace 会有帮助吗?
  • 我不知道有什么帮助。当某事崩溃时,您的任务是通过任何必要的方式了解发生了什么问题。搞清楚如何在可调试环境中重现这一点很可能是 80% 的工作,相比之下,修复它会很容易......也可能是你找到了一种方法来理解正在发生的事情而不会赶上调试器中的问题。

【解决方案1】:

验证构建原生模块时的 PIC (位置无关代码)设置是否开启。如果它当前处于关闭状态,请尝试将其设置为 ON,然后重新构建包。如果您使用的是 Cmake.js,那么您可以使用以下设置。

set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)