You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 22LTS下Node.js程序触发Segmentation fault问题求助

问题定位:Ubuntu 22.04 LTS下Node.js程序Segmentation Fault排查

问题背景

  • Windows 11笔记本开发时程序运行正常,Ubuntu 22.04 LTS台式机运行时会突然中断
  • 触发时机:从PostgreSQL加载数据并创建Container对象时出现Segmentation fault
  • 已尝试操作:重装VS Code、Node.js、npm及所有依赖,使用segfault-handler生成崩溃日志但无法解读

崩溃日志内容

PID 35548 received SIGSEGV for address: 0x7c
/home/nox/mega/GitHub/JavaScript/market/node_modules/segfault-handler/build/Release/segfault-handler.node(+0x3340)[0x7f72e3f1d340]
/lib/x86_64-linux-gnu/libc.so.6(+0x42520)[0x7f72e3842520]
node(_ZNK2v88internal13ScopeIterator15VisitLocalScopeERKSt8functionIFbNS0_6HandleINS0_6StringEEENS3_INS0_6ObjectEEENS1_9ScopeTypeEEENS1_4ModeES8_+0x14d)[0xe4cf1d]
node(_ZN2v88internal13ScopeIterator11ScopeObjectENS1_4ModeE+0x67)[0xe4d667]
node(_ZN2v88internal13DebugEvaluate14ContextBuilderC1EPNS0_7IsolateEPNS0_15JavaScriptFrameEi+0xf0)[0xe3f570]
node(_ZN2v88internal13DebugEvaluate5LocalEPNS0_7IsolateENS0_12StackFrameIdEiNS0_6HandleINS0_6StringEEEb+0x82)[0xe3f7e2]
node(_ZN2v88internal23DebugStackTraceIterator8EvaluateENS_5LocalINS_6StringEEEb+0x60)[0xe4eab0]
node(_ZN12v8_inspector19V8DebuggerAgentImpl19evaluateOnCallFrameERKNS_8String16ES3_N8v8_crdtp6detail10ValueMaybeIS1_EENS6_IbEES8_S8_S8_S8_NS6_IdEEPSt10unique_ptrINS_8protocol7Runtime12RemoteObjectESt14default_deleteISD_EEPNS5_8PtrMaybeINSC_16ExceptionDetailsEEE+0x286)[0x13ac266]
node(_ZN12v8_inspector8protocol8Debugger20DomainDispatcherImpl19evaluateOnCallFrameERKN8v8_crdtp12DispatchableE+0x30f)[0x1633fff]
node(_ZN8v8_crdtp14UberDispatcher14DispatchResult3RunEv+0x1b)[0x13eda6b]
node(_ZN12v8_inspector22V8InspectorSessionImpl23dispatchProtocolMessageENS_10StringViewE+0x1a0)[0x13b9880]
node[0xc8e1fa]
node[0xca7eb1]
node[0xca63ae]
node[0xca66fe]
node[0xca6b1a]
node(_ZN4node11Environment21RunAndClearInterruptsEv+0x148)[0xb0a378]
node(_ZN4node9inspector19NodeInspectorClient21runMessageLoopOnPauseEi+0x8c)[0xc8ed2c]
node(_ZN12v8_inspector10V8Debugger18handleProgramBreakEN2v85LocalINS1_7ContextEEENS2_INS1_5ValueEEERKSt6vectorIiSaIiEENS1_4base7EnumSetINS1_5debug11BreakReasonEiEENSE_13ExceptionTypeEb+0x2e5)[0x1392bb5]
node(_ZN12v8_inspector10V8Debugger21BreakProgramRequestedEN2v85LocalINS1_7ContextEEERKSt6vectorIiSaIiEENS1_4base7EnumSetINS1_5debug11BreakReasonEiEE+0x1a)[0x1392c0a]
node(_ZN2v88internal5Debug12OnDebugBreakENS0_6HandleINS0_10FixedArrayEEENS0_10StepActionENS_4base7EnumSetINS_5debug11BreakReasonEiEE+0x1b2)[0xe5a4a2]
node(_ZN2v88internal5Debug5BreakEPNS0_15JavaScriptFrameENS0_6HandleINS0_10JSFunctionEEE+0x220)[0xe5a6d0]
node(_ZN2v88internal28Runtime_DebugBreakOnBytecodeEiPmPNS0_7IsolateE+0x246)[0x12cf6a6]
node[0x1703c39]
Segmentation fault (core dumped)
Waiting for the debugger to disconnect...

疑似出错代码片段

Container类代码

export class Container extends MarketObject {
    constructor() {...} // <-- 最初认为错误在此处
    
    saveDBData = async function () { //<-- 疑似真正引发错误的函数
        await dbHandler.sqlQuery(this.sqlQueries.saveItemData.syntax, 
           this.sqlQueries.saveItemData.variables);
     }
...
};

DB处理模块(dbHandler.js)

import pg from 'pg';
import ini from 'ini';
import fs from 'fs';
import { error } from 'console';

async function getConnection() {
    try {
        let dbaccess = ini.parse(fs.readFileSync('./tools/database/db.ini', 'utf-8'));
        let client = new pg.Client(dbaccess['postgresql_loginData']);
        return client;
    } catch (error) {
        console.error(error);
        console.error(error.message);
    }
}

export async function sqlQuery(syntax, values) {
    try {
        let client = await getConnection();
        await client.connect();
        let res = await client.query(syntax, values);

        await client.end();

        return res;
    } catch (error) {
        console.error(error.stack);
    }
}

日志解读与问题定位分析

  1. 日志核心信息:

    • SIGSEGV地址0x7c属于低地址,通常意味着程序访问了未初始化的指针或空指针的偏移地址
    • 调用栈显示崩溃发生在V8引擎的调试器评估逻辑中,但这只是底层表象,实际触发点是JavaScript代码中的异常传递到了V8底层
  2. 可能的触发原因:

    • this指向丢失:saveDBData使用类属性式异步函数,某些调用场景下会导致this指向异常,访问this.sqlQueries时出错,进而引发V8底层内存错误
    • 数据库客户端异常未处理:getConnection的try/catch会吞掉错误并返回undefined,sqlQuery中调用undefined.connect()的错误在异步场景下被掩盖,最终触发Segmentation fault
    • Node.js版本差异:Windows和Ubuntu上的Node.js版本可能不一致,某些V8引擎bug仅在特定平台/版本下触发
  3. 排查建议:

    • 对齐Windows和Ubuntu的Node.js版本,尝试升级/降级测试
    • 将saveDBData改为标准类方法,避免this指向问题:
      async saveDBData() {
          await dbHandler.sqlQuery(this.sqlQueries.saveItemData.syntax, 
             this.sqlQueries.saveItemData.variables);
       }
      
    • 修复getConnection的错误处理,让错误向上抛出而非吞掉:
      async function getConnection() {
          let dbaccess = ini.parse(fs.readFileSync('./tools/database/db.ini', 'utf-8'));
          let client = new pg.Client(dbaccess['postgresql_loginData']);
          return client;
      }
      
    • 在sqlQuery中增加空值检查并重新抛出错误:
      export async function sqlQuery(syntax, values) {
          try {
              let client = await getConnection();
              if (!client) throw new Error('Failed to create database client');
              await client.connect();
              let res = await client.query(syntax, values);
              await client.end();
              return res;
          } catch (error) {
              console.error(error.stack);
              throw error;
          }
      }
      
    • 关闭VS Code调试器,直接在终端运行程序,排除调试器相关的V8 bug

内容的提问来源于stack exchange,提问作者MrGreenPepper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 23:00:04