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进程崩溃了。

希望对大家有帮助 :)


2 回复

Nodejs 如何正确获得segfault等系统错误的log

在开发过程中,特别是在编写或使用 C++ 编写的 Node.js 插件(addon)时,可能会遇到一些运行时错误,例如 segfault(段错误)。这些错误通常会导致 Node.js 进程崩溃,而默认情况下 Node.js 并不会提供详细的错误日志。因此,我们需要通过一些额外的步骤来捕获和分析这些错误。

使用场景

当你在使用 addon 模块或自己编写 addon 时,如果 C++ 源码中存在运行时错误,Node.js 在崩溃后并不会报告相应的跟踪信息(trace)。这时,你需要开启操作系统的 core dump 功能,然后结合 lldbgdb 来分析崩溃原因。

开启 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。你可以通过以下步骤来重现问题并分析崩溃日志。

  1. 编写 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)
    
  2. 编译 addon 模块:

    $ node-gyp configure build
    
  3. 运行并触发 segfault:

    // main.js
    const addon = require('./build/Release/example');
    
    addon();
    
  4. 开启 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等系统错误,从而更准确地定位和修复问题。

回到顶部