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

如何获取Windows环境下Node.js 18.18.2挂起的诊断信息?

改造包装进程捕获Node.js挂起诊断信息

核心思路

当30分钟超时触发时,包装进程先执行诊断数据采集操作,待数据生成完成后再终止Node.js进程。以下是针对Windows环境的具体实现方案:

1. 利用Node.js内置的Report API(推荐,无需额外工具)

如果包装进程本身是Node.js编写的,可直接通过Node.js的process.report模块主动触发诊断报告生成:

  • 在包装进程启动Node.js时记录目标进程PID,或通过tasklist命令查询获取
  • 超时触发时,执行命令生成包含堆栈、内存、环境变量等全面信息的诊断报告:
    # PowerShell示例:为指定PID的Node进程生成诊断报告
    node --diagnostic-report --report-directory ./diagnostics <目标Node进程PID>
    
    报告默认以JSON格式输出到指定目录,信息维度比普通转储更丰富。

2. 使用Windows调试工具捕获底层调试数据

若需要更底层的进程信息,可借助Windows Debugger(cdb):

  • 提前在CI环境安装Windows Debugging Tools(Windows SDK组件)
  • 超时触发时执行以下命令,生成完整转储文件和即时堆栈:
    # 生成完整进程转储文件
    cdb -pn node.exe -c ".dump /ma ./diagnostics/node-hang.dmp; q"
    # 导出所有线程的即时堆栈跟踪
    cdb -pn node.exe -c "~*k; q" > ./diagnostics/node-stacktrace.txt
    
    .dmp文件可后续用WinDbg分析,node-stacktrace.txt能快速定位挂起的线程。

3. 通过Inspector协议获取JavaScript层调试数据

Node.js 18.x默认开启Inspector协议(端口9229),包装进程可通过该协议获取业务代码层面的堆栈和变量:

  • 启动Node.js进程时显式指定Inspector端口:node --inspect=9229 your-app.js
  • 超时触发时,通过HTTP请求调用Inspector接口:
    # 获取会话ID并导出堆栈跟踪
    curl "http://localhost:9229/json" | Select-String -Pattern '"id":"([^"]+)"' | ForEach-Object {
        $sessionId = $_.Matches.Groups[1].Value
        curl -X POST "http://localhost:9229/$sessionId/debugger/run" -H "Content-Type: application/json" -d '{"method":"Debugger.enable"}'
        curl -X POST "http://localhost:9229/$sessionId/debugger/run" -H "Content-Type: application/json" -d '{"method":"Debugger.getStackTrace"}' > ./diagnostics/inspector-stacktrace.json
    }
    

4. 包装进程超时逻辑改造示例(PowerShell版)

# 启动Node.js进程并记录PID
$nodeProcess = Start-Process node -ArgumentList "your-app.js" -PassThru
$timeoutMinutes = 30

# 等待进程结束或超时
Wait-Process -Id $nodeProcess.Id -Timeout ($timeoutMinutes * 60)

# 若进程仍在运行(触发超时)
if (Get-Process -Id $nodeProcess.Id -ErrorAction SilentlyContinue) {
    # 采集诊断数据
    node --diagnostic-report --report-directory ./diagnostics $nodeProcess.Id
    cdb -pn node.exe -c "~*k; q" > ./diagnostics/node-stacktrace.txt
    # 最后终止进程
    Stop-Process -Id $nodeProcess.Id -Force
}

注意事项

  • 确保CI环境有写入./diagnostics目录的权限,避免诊断文件生成失败
  • 诊断文件可能占用较大存储空间,需配置CI环境保留这些文件用于后续分析
  • 若Node.js进程是嵌套子进程,需确保包装进程正确捕获并记录目标PID,避免误操作其他进程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:30:07