如何获取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命令查询获取 - 超时触发时,执行命令生成包含堆栈、内存、环境变量等全面信息的诊断报告:
报告默认以JSON格式输出到指定目录,信息维度比普通转储更丰富。# PowerShell示例:为指定PID的Node进程生成诊断报告 node --diagnostic-report --report-directory ./diagnostics <目标Node进程PID>
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
相关产品推荐
相关产品推荐

