Nodejs 如何正确获得segfault等系统错误的log
Nodejs 如何正确获得segfault等系统错误的log
使用场景
在使用addon模块或者你就是addon作者时,如果在c++源码中存在运行时错误,nodejs在crush后,并不会报告相应的trace,此时需要你开启操作系统的core dump,然后结合lldb/gdb来还原事故现场。
开启core dump
macos默认关闭了coredump,可以通过下面的脚本来开启:
$ ulimit -c unlimited
当你的node进程崩溃后,只有带有(core dumped)这样的字样时,才会生成core-image文件。
core-image文件
- 如果使用osx,可以在
/cores/
目录下找到如core.90283
的文件,.
号后面的数字代表pid - 如果使用linux,你需要通过设置
/proc/sys/kernel/core_pattern
的值来指定core-image文件的生成路径。关于core_pattern可以具体查看core man
事故恢复
接着使用lldb(MacOS)/gdb(linux)来查看崩溃log,命令如下:
$ gdb node /tmp/your-core-file-path
$ lldb node /cores/your-core-file-path
关于gdb/lldb的用法详见这个地址
往往这个时候,你就可以发现可能是你自己的代码导致node进程崩溃了。
希望对大家有帮助 :)
Nodejs 如何正确获得segfault等系统错误的log
在开发过程中,特别是在编写或使用 C++ 编写的 Node.js 插件(addon)时,可能会遇到一些运行时错误,例如 segfault(段错误)。这些错误通常会导致 Node.js 进程崩溃,而默认情况下 Node.js 并不会提供详细的错误日志。因此,我们需要通过一些额外的步骤来捕获和分析这些错误。
使用场景
当你在使用 addon 模块或自己编写 addon 时,如果 C++ 源码中存在运行时错误,Node.js 在崩溃后并不会报告相应的跟踪信息(trace)。这时,你需要开启操作系统的 core dump 功能,然后结合 lldb
或 gdb
来分析崩溃原因。
开启 core dump
首先,需要确保操作系统能够生成 core dump 文件。在 macOS 中,默认情况下 core dump 是关闭的。你可以通过以下命令开启:
$ ulimit -c unlimited
这样,当 Node.js 进程崩溃时,会生成一个 core dump 文件,该文件包含崩溃时的内存状态。
core dump 文件
-
macOS: 生成的 core dump 文件通常位于
/cores/
目录下,文件名格式为core.<PID>
,其中<PID>
是进程的 ID。 -
Linux: 你需要通过设置
/proc/sys/kernel/core_pattern
的值来指定 core dump 文件的生成路径。更多详细信息可以参考 core(5) man page。
分析 core dump 文件
生成 core dump 文件后,你可以使用 gdb
(Linux)或 lldb
(macOS)来分析崩溃日志。
使用 gdb (Linux):
$ gdb node /path/to/core/file
使用 lldb (macOS):
$ lldb node /path/to/core/file
在打开 core dump 文件后,你可以使用 bt
命令查看调用栈,进一步分析崩溃的原因。
示例代码
假设你有一个简单的 C++ addon 模块,可能会导致 segfault。你可以通过以下步骤来重现问题并分析崩溃日志。
-
编写 C++ addon 模块:
// example-addon.cc #include <node_api.h> napi_value Method(napi_env env, napi_callback_info info) { int* ptr = nullptr; *ptr = 42; // 这将导致 segfault return nullptr; } napi_value Init(napi_env env, napi_value exports) { NAPI_RETURN_FAILURE_IF_NULL(env, napi_create_function(env, "example", NAPI_AUTO_LENGTH, Method, nullptr, &exports)); return exports; } NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
-
编译 addon 模块:
$ node-gyp configure build
-
运行并触发 segfault:
// main.js const addon = require('./build/Release/example'); addon();
-
开启 core dump 并分析崩溃日志:
$ ulimit -c unlimited $ node main.js Segmentation fault (core dumped) $ gdb node core.*
通过上述步骤,你可以成功捕获并分析 Node.js 的 segfault 等系统错误,从而找到并修复问题。
为了获取Node.js中的segfault等系统错误的日志信息,你可以通过以下步骤来捕获这些错误:
开启core dump
首先,确保你已经开启了core dump功能。对于macOS,你可以使用以下命令:
ulimit -c unlimited
这将允许系统在程序崩溃时生成core dump文件。
生成core dump文件
如果你的Node.js进程因为segfault等原因崩溃,系统会生成一个core dump文件。这个文件的位置取决于你的操作系统:
- macOS: 通常位于
/cores/
目录下,文件名格式为core.<PID>
。 - Linux: 你需要配置
/proc/sys/kernel/core_pattern
以指定core dump文件的生成位置。例如,可以设置为/tmp/core.%e.%p
,其中%e
是可执行文件名,%p
是进程ID。
使用gdb或lldb分析core dump文件
生成core dump文件后,你可以使用gdb
(Linux)或lldb
(macOS)来分析这个文件。例如,在macOS上,你可以使用以下命令:
lldb /path/to/node /cores/core.PID
在Linux上,你可以使用:
gdb /path/to/node /tmp/core.node.PID
示例
假设你的Node.js进程崩溃并生成了一个core dump文件/cores/core.12345
,你可以使用以下命令来加载并分析该文件:
MacOS:
lldb /usr/local/bin/node /cores/core.12345
Linux:
gdb /usr/local/bin/node /tmp/core.node.12345
在gdb或lldb中,你可以输入以下命令来查看崩溃时的堆栈跟踪:
bt
这将显示崩溃时的调用堆栈,有助于定位问题所在。
总结
通过上述步骤,你可以捕获并分析Node.js进程中的segfault等系统错误,从而更准确地定位和修复问题。