ProcDump 学习笔记(6.7):监视异常(未处理/首机会/消息过滤/进程终止)
ProcDump 学习笔记(6.7):监视异常(未处理/首机会/消息过滤/进程终止)
- ProcDump 学习笔记(6.7):监视异常(未处理/首机会/消息过滤/进程终止)
- 1)为什么用“异常触发”?
- 2)异常基础速览:首机会 vs 二次/未处理
- 3)最常用命令模板
- 3.1 抓“未处理异常”一份完整 Dump
- 3.2 抓“首机会异常”,并按消息/类型关键字**过滤**
- 3.3 进程**终止**时也抓一份(兜底)
- 3.4 等目标“出现再附加”(服务/按需启动进程)
- 3.5 控制抓取份数,避免刷盘
- 4).NET 特殊建议(托管异常)
- 5)原生(SEH)常见异常关键字
- 6)输出策略与体积控制
- 7)常见坑与排查
- 8)即拿即用清单
- 9)小结
本文承接 6.6,聚焦 异常触发抓 Dump。不同版本参数细节可能略有差异,请以你机器上的
procdump -?为准。
ProcDump 学习笔记(6.7):监视异常(未处理/首机会/消息过滤/进程终止)
1)为什么用“异常触发”?
很多故障只在抛异常时出现:
- 原生(SEH)访问违规、栈溢出、除零等;
- .NET 运行时异常(
NullReferenceException、OutOfMemoryException…); - 业务代码主动
throw的致命错误。
与“CPU/内存阈值”相比,异常触发能在“问题瞬间”精准落点,Dump 里包含现场调用栈、寄存器、托管/非托管堆对象等关键证据。
2)异常基础速览:首机会 vs 二次/未处理
- 首机会(First-chance):异常刚抛出,在被
try…catch处理前,调试器先收到通知。多数会被应用“吞掉”,因此量大且嘈杂。 - 未处理/二次机会(Unhandled/Second-chance):异常未被捕获,会导致程序崩溃(或被 JIT/AE 调试器接管)。这类更“干净”,通常直接定位根因。
抓取策略:先用未处理(更稳、噪声低);若问题被“吞异常”,再尝试首机会 + 过滤。
3)最常用命令模板
3.1 抓“未处理异常”一份完整 Dump
:: 未处理异常触发;生成完整转储(-ma)
procdump -e -ma <进程名或PID> "D:\Dumps\Unhandled"
3.2 抓“首机会异常”,并按消息/类型关键字过滤
:: 首机会(-e 1),按关键字过滤(-f,支持多个词用 | 连接)
procdump -e 1 -f "NullReferenceException|OutOfMemoryException|0xC0000005" -ma <进程名或PID> "D:\Dumps\FirstChance"
说明
-e 1:首机会;不带1则仅未处理。-f "<关键字>":匹配异常类型名(托管)或消息/代码片段;可并列多个。- 过滤很关键,否则首机会异常量可能巨大。
3.3 进程终止时也抓一份(兜底)
:: 进程退出/崩溃即抓(常配合 -e)
procdump -t -ma <进程名或PID> "D:\Dumps\OnExit"
3.4 等目标“出现再附加”(服务/按需启动进程)
:: 等进程出现后监听异常;最多抓两份以防刷盘
procdump -w MyService.exe -e -n 2 -ma "D:\Dumps\SvcCrash"
3.5 控制抓取份数,避免刷盘
:: 任意触发条件都建议叠加 -n
procdump -e 1 -f "AccessViolation|0xC0000005" -n 3 -ma <PID> "D:\Dumps\Guarded"
4).NET 特殊建议(托管异常)
- 关键词直接用类型名或常见文案:
-f "System.NullReferenceException|System.OutOfMemoryException|TaskCanceledException" - 大量被吞的业务异常 → 建议短时窗口开启首机会 + 过滤,配合
-n控制份数。 - 如果要分析Managed 堆对象和 GC 情况,转储类型用
-ma(完整);后续用WinDbg + SOS/NetExt或dotnet-dump分析。
5)原生(SEH)常见异常关键字
- 0xC0000005:
AccessViolation(最典型的崩溃) - 0xC00000FD:
StackOverflow - 0xC0000094:整数除零
- 0xC0000409:栈缓冲区溢出(/GS 保护)
procdump -e 1 -f "0xC0000005|AccessViolation" -ma <PID> "D:\Dumps\NativeCrash"
6)输出策略与体积控制
- 优先目录化:
"D:\Dumps\{场景}",避免覆盖;ProcDump 会带时间戳命名。 - 体积优先:试
-mp(较小的迷你转储);如需托管堆、句柄、内存镜像再上-ma。 - 次数限制:永远加
-n(如 1~3);避免异常风暴导致磁盘打爆。
7)常见坑与排查
-
“就是不触发”:
- 异常被完全吞掉 → 用
-e 1首机会 +-f过滤; - 目标启动在你之前 → 用
-w等待模式; - 权限不够(服务/系统会话)→ 以管理员/相同会话运行。
- 异常被完全吞掉 → 用
-
首机会过多:过滤不够、
-n没限制;先收敛关键字,或短时间抓取。 -
Dump 太大/太多:
-mp+-n+ 单独文件夹。
8)即拿即用清单
:: A. 未处理异常(稳定首选)
procdump -e -ma <进程名或PID> "D:\Dumps\Unhandled":: B. 首机会 + 过滤(仅抓关键异常)
procdump -e 1 -f "NullReferenceException|0xC0000005" -n 2 -ma <PID> "D:\Dumps\FirstChanceKey":: C. 进程终止兜底
procdump -t -n 1 -ma <进程名> "D:\Dumps\OnExit":: D. 服务类:等待出现 + 未处理异常
procdump -w MyService.exe -e -n 2 -ma "D:\Dumps\SvcCrash":: E. .NET OOM 专项
procdump -e 1 -f "OutOfMemoryException" -n 1 -ma <PID> "D:\Dumps\OOM"
9)小结
- 异常触发是最直接、最可靠的“问题瞬间”采样方式。
- 推荐路径:先未处理(
-e)→ 再首机会(-e 1+-f);全程用-n保护盘位。 - 结合 6.5 的“输出策略”和 6.6 的“阈值触发”,可以覆盖绝大多数生产现场故障。
- 下一篇(6.8)我们将整理 “转储文件选项”:何时用
-ma、何时用-mp,以及其它细节参数。
