ProcDump 学习笔记(6.11):以非交互方式运行 ProcDump(服务器/生产环境指南)
ProcDump 学习笔记(6.11):以非交互方式运行 ProcDump(服务器/生产环境指南)
- ProcDump 学习笔记(6.11):以非交互方式运行 ProcDump(服务器/生产环境指南)
- 1)为什么一定要“非交互”?
- 2)非交互运行的常用触发场景
- 3)一键后台采集:任务计划(Task Scheduler)模板
- 3.1 目录与 EULA 预处理(一次性)
- 3.2 高 CPU 自动抓(随系统启动)
- 3.3 假死自动抓(随系统启动)
- 3.4 异常自动抓(随系统启动)
- 4)按“事件日志”触发(进阶)
- 5)自动清理与容量保护(强烈建议)
- 6)无人值守部署脚本(可抄可改)
- 7)权限、位宽、性能与安全:上线前必读
- 8)与 6.5 “AeDebug” 的关系
- 9)最小可用清单(Checklist)
- 小结
ProcDump 学习笔记(6.11):以非交互方式运行 ProcDump(服务器/生产环境指南)
面向服务器/生产环境的“无人值守”抓 Dump 方案:开机自启、按条件触发、限额落盘、自动清理、权限与安全一次配齐。本文给你可直接上线的任务计划、批处理/PowerShell 模板与最佳实践清单。
1)为什么一定要“非交互”?
- 生产环境禁止远程桌面常驻,也不可能守在窗口前“等崩”。
- 很多问题是瞬发或偶发:高 CPU、假死、异常、启动即崩。
- 目标是自动在恰当时刻抓到足够信息的 dump,同时不打爆磁盘、不影响服务。
2)非交互运行的常用触发场景
| 场景 | 触发思路 | ProcDump 关键参数示例 |
|---|---|---|
| 高 CPU | CPU 连续 N 秒超过阈值 | -c 85 -s 10 -n 1 -mp |
| 假死(不响应) | 窗口挂起/无响应 | -h -n 1 -mp |
| 异常(未处理/首机会) | 进程抛异常 | -e(未处理) / -e 1 -f "关键字"(首机会+过滤) |
| 启动即崩 | 进程刚起来就异常 | -w app.exe -e -n 1(等待启动+异常触发) |
| 定点巡检 | 固定窗口抓取一次现场 | 由任务计划在时间窗内触发 |
MiniPlus(
-mp)足够完成大多数首次诊断;如果需要看托管大堆/内存对象,再升级 Full(-ma),但务必限量(-n 1)以防爆盘。
3)一键后台采集:任务计划(Task Scheduler)模板
3.1 目录与 EULA 预处理(一次性)
@echo off
set "DUMP_DIR=D:\Dumps\MyApp"
mkdir "%DUMP_DIR%" 2>nulrem 静默接受 Sysinternals EULA(无人值守必备)
procdump -accepteula >nul 2>&1
3.2 高 CPU 自动抓(随系统启动)
schtasks /Create /RU "SYSTEM" /RL HIGHEST ^/SC ONSTART /TN "ProcDump-HighCPU-MyApp" ^/TR "cmd /c procdump -c 85 -s 10 -n 1 -mp -w MyApp.exe %DUMP_DIR%\HighCPU" ^/F
- 含义:开机后,后台等待
MyApp.exe,若 CPU 连续 10 秒 ≥85%,抓 1 份 MiniPlus。 - 为何等进程名(
-w):应对“启动慢/重启”的场景,无需你手工更新 PID。
3.3 假死自动抓(随系统启动)
schtasks /Create /RU "SYSTEM" /RL HIGHEST ^/SC ONSTART /TN "ProcDump-Hang-MyApp" ^/TR "cmd /c procdump -h -n 1 -mp -w MyApp.exe %DUMP_DIR%\Hang" ^/F
3.4 异常自动抓(随系统启动)
schtasks /Create /RU "SYSTEM" /RL HIGHEST ^/SC ONSTART /TN "ProcDump-Exception-MyApp" ^/TR "cmd /c procdump -e -n 1 -mp -w MyApp.exe %DUMP_DIR%\Crash" ^/F
首机会异常且仅抓指定异常:把
-e换成-e 1 -f "NullReferenceException|AccessViolation"。
4)按“事件日志”触发(进阶)
当应用崩溃时,应用程序日志常写入固定事件(如 EventID=1000/1001)。可以用 ONEVENT 触发,做到仅“崩溃真正发生”才抓。
最稳方式是导入任务计划 XML(含 XPath 查询)。下面给出一份可参考的片段(核心在
<QueryList>):
<!-- CrashOnEvent-MyApp.xml(节选) -->
<Triggers><EventTrigger><Enabled>true</Enabled><Subscription><![CDATA[
<QueryList><Query Id="0" Path="Application"><Select Path="Application">*[System[(EventID=1000)]] and *[EventData[Data[@Name='FaultingApplicationName']='MyApp.exe']]</Select></Query>
</QueryList>]]></Subscription></EventTrigger>
</Triggers>
<Principals><Principal id="Author"><RunLevel>HighestAvailable</RunLevel><UserId>S-1-5-18</UserId> <!-- SYSTEM --><LogonType>ServiceAccount</LogonType></Principal>
</Principals>
<Actions Context="Author"><Exec><Command>cmd.exe</Command><Arguments>/c procdump -e -n 1 -mp -w MyApp.exe D:\Dumps\MyApp\Event</Arguments></Exec>
</Actions>
导入命令:
schtasks /Create /TN "ProcDump-OnEvent-MyApp" /XML CrashOnEvent-MyApp.xml /F
5)自动清理与容量保护(强烈建议)
保留最近 N 份 + 按天清理,避免磁盘被 Dump 撑满:
# 保留最近 10 份,删除更旧的
$dir = 'D:\Dumps\MyApp'
Get-ChildItem $dir -Filter *.dmp |Sort-Object LastWriteTime -Descending |Select-Object -Skip 10 |Remove-Item -Force -ErrorAction SilentlyContinue
注册一个每日任务:
schtasks /Create /RU "SYSTEM" /SC DAILY /TN "ProcDump-Cleanup-MyApp" ^/TR "powershell -NoProfile -Command ""& { $d='D:\Dumps\MyApp'; gci $d -Filter *.dmp | sort LastWriteTime -desc | select -skip 10 | ri -Force }""" ^/ST 03:30 /F
也可再加配额监控(阈值触发删除),或把 Dump 挪到独立数据盘。
6)无人值守部署脚本(可抄可改)
@echo off
setlocal
set "APP=MyApp.exe"
set "DUMP_DIR=D:\Dumps\MyApp"mkdir "%DUMP_DIR%" 2>nul
procdump -accepteula >nul 2>&1rem 高 CPU
schtasks /Create /RU "SYSTEM" /RL HIGHEST /SC ONSTART /TN "ProcDump-HighCPU-%APP%" ^/TR "cmd /c procdump -c 85 -s 10 -n 1 -mp -w %APP% %DUMP_DIR%\HighCPU" /Frem 假死
schtasks /Create /RU "SYSTEM" /RL HIGHEST /SC ONSTART /TN "ProcDump-Hang-%APP%" ^/TR "cmd /c procdump -h -n 1 -mp -w %APP% %DUMP_DIR%\Hang" /Frem 未处理异常
schtasks /Create /RU "SYSTEM" /RL HIGHEST /SC ONSTART /TN "ProcDump-Exception-%APP%" ^/TR "cmd /c procdump -e -n 1 -mp -w %APP% %DUMP_DIR%\Crash" /Frem 每日清理(保留 10 份)
schtasks /Create /RU "SYSTEM" /SC DAILY /ST 03:30 /TN "ProcDump-Cleanup-%APP%" ^/TR "powershell -NoProfile -Command ""& { $d='%DUMP_DIR%'; gci $d -Filter *.dmp | sort LastWriteTime -desc | select -skip 10 | ri -Force }""" /Fecho Done. 任务已注册(SYSTEM)。请复现问题后检查 %DUMP_DIR%.
endlocal
7)权限、位宽、性能与安全:上线前必读
- 权限:任务建议用
SYSTEM(最稳),最少也要具备访问目标进程与写入 Dump 目录的权限。 - 位宽匹配:64 位进程用 procdump64.exe(或在 64 位 OS 上用默认 procdump);跨位宽附加会失败。
- 磁盘 IO:抓 Full Dump 对 IO/空间压力大,强制限流(
-n 1),能-mp就别-ma。 - 目录规划:Dump 存储到独立数据盘或足够空间的卷;必要时临时映射 UNC 到档案服务器。
- 隐私合规:Dump 可能含访问令牌/密码/配置/内存数据,严格权限、加密传输、限期保留。
- 叠加策略:同时跑“高 CPU + 假死 + 异常”没问题,但务必注意只抓一次(
-n 1)避免连环写盘。
8)与 6.5 “AeDebug” 的关系
-
AeDebug(后期调试器):进程崩溃时由系统调用 procdump 抓崩溃 Dump(“崩才抓”)。
-
任务计划方案:不限于崩溃,能覆盖高 CPU、假死、启动即崩等异常但未必 Crash 的场景。
-
实战中常常两者并用:
- AeDebug 兜底“崩溃一定有 Dump”;
- 任务计划保障“卡顿/高负载/瞬发问题也抓得到”。
9)最小可用清单(Checklist)
- 已静默接受 EULA(
procdump -accepteula) - Dump 目录可写、在大容量盘并有清理策略
- 根据问题类型选择
-c/-h/-e/-w组合,一次只抓 1 份 - 任务以
SYSTEM运行,失败重试选项已开启(任务计划高级设置) - 联合 Procmon 记录时间线(见 6.10),方便对齐 Dump 发生时刻
小结
- 非交互运行 ProcDump 的精髓是:合适触发(CPU/假死/异常/启动)、安全落盘、自动清理、与 Procmon 时间线对齐。
- 上面的模板可以直接落地;根据你的应用特性微调阈值与清理策略,就能在生产上稳妥地留住决定性证据。
下一篇(6.12)我们将收尾:在调试器中打开与分析 Dump(WinDbg/VS),从线程栈、异常上下文到符号/源映射,给出一套快速出结论的走查清单。
