温馨提示×

nodejs崩溃日志如何定位

小樊
39
2026-10-11 10:31:01
栏目: 编程语言

Node.js 崩溃(Crash)通常不是普通异常,而是进程直接退出(如 OOM、段错误、未捕获异常等)。定位崩溃日志和原因,可以按下面步骤来。


一、先确认“崩溃类型”

1️⃣ 未捕获异常 / Promise 未处理

常见日志:

Error: xxx
    at ...
node:internal/process/uncaughtException

✅ 原因:

  • throw 没 catch
  • promise 没 .catch

✅ 解决:

process.on('uncaughtException', (err) => {
  console.error('uncaught', err);
});

process.on('unhandledRejection', (reason) => {
  console.error('unhandledRejection', reason);
});

2️⃣ 内存溢出(OOM)

日志通常含:

FATAL ERROR: Ineffective mark-compacts near heap limit
Allocation failed - JavaScript heap out of memory

✅ 定位:

  • 哪里在疯狂创建对象
  • 闭包 / 缓存未释放
  • 大文件 / 大数组

✅ 工具:

node --inspect app.js

用 Chrome DevTools → Memory → Heap Snapshot


3️⃣ 原生模块 / C++ 崩溃(Segmentation fault)

日志:

Segmentation fault (core dumped)

✅ 常见原因:

  • node-gyp 编译版本不匹配
  • 使用了不兼容的原生模块(如 sharp, bcrypt)

✅ 定位:

node --abort-on-uncaught-exception

或生成 core dump 分析


二、开启“崩溃日志”能力(非常重要)

✅ 1. 打印崩溃栈

process.on('uncaughtException', (err) => {
  fs.writeFileSync('crash.log', err.stack);
  process.exit(1);
});

✅ 2. 生成 Core Dump(Linux)

ulimit -c unlimited
node app.js

崩溃后:

gdb node core.xxx
bt

✅ 3. 使用 --stack-trace-limit

node --stack-trace-limit=100 app.js

三、线上崩溃的推荐方案

✅ PM2(强烈推荐)

pm2 start app.js
pm2 logs
pm2 describe <id>

PM2 会自动:

  • 重启进程
  • 保存崩溃日志
  • 显示 exit code

✅ Sentry(线上神器)

Sentry.init({ dsn: '...' });

能捕获:

  • 异常栈
  • 请求信息
  • 系统环境

四、常见 exit code 对照表

Code 含义
1 未捕获异常
137 OOM(内存超限)
139 Segmentation fault
132 Illegal instruction

五、快速定位 checklist ✅

  1. 看退出码(exit code)
  2. 看是否有 uncaughtException
  3. 是否 OOM
  4. 是否原生模块
  5. 是否线上(用 PM2 / Sentry)
  6. 是否有 core dump

如果你愿意,可以把崩溃日志原文贴出来,我可以直接帮你定位是哪一类问题。

0 踩