概要:
ProcDump是一个命令行实用工具,其主要用途是监视应用程序的CPU峰值,并在出现峰值期间生成故障转储,管理员或开发人员可以使用这些转储来确定出现峰值的原因。 ProcDump还支持挂起窗口监视(使用与Windows和任务管理器使用的窗口挂起相同的定义)、未处理的异常监视,并且可以根据系统性能计数器的值生成转储。它还可用作可嵌入到其他脚本中的常规进程转储实用工具。
可以通过以下链接下载ProcDump工具
https://learn.microsoft.com/zh-cn/sysinternals/downloads/procdump
本文介绍了使用Procdump指定转储文件的相关规则与方法。
2. 详细信息:
若要定期创建一系列转储,可配合使用-s和-n选项,也无需指定任何转储条件。
- -s指定了上一次捕获结束后和下一次捕获开始前的秒数。如果忽略-s选项,默认时间周期将为10秒。
- -n指定了进程退出前要捕获的转储数量。捕获多个范本可以防止第一个转储是某些顺变条件导致,而非试图追踪的原因导致的。
例如,下列命令可立刻为Testapp进程捕获转储,并在5秒后再次创建,再过5秒再次创建,共创建3个转储文件:
Procdump -s 5 -n 3 testapp
监视CPU用量
-c CPU用量超过指定阈值并持续指定长度的时间后自动创建转储文件。
-cl CPU用量低于指定阈值并持续同样长度的时间后自动创建转储文件。
例如,testapp使用CPU用量持续超过90%,5秒,procdump创建转储文件并退出:
Procdump -c 90 -s 5 testapp
如下命令在testapp进程CPU占用超过80%并维持3秒后创建一个转储文件,直到总共创建3个转储。
Procdump -c 80 -s 3 -n 3 testapp
在多内核系统中,单一线程无法消耗所有处理器的全部时间。双核系统中,单一线程最多消耗50%的处理时间;四核系统中,最多消耗25%,以此类推。为了在多个内核的CPU系统中针对-c和-cl阈值进行等比放大,可在命令行中使用-u(单处理选项)。例如:
Procdump -c 90 -u testapp
可在testapp的CPU用量超过45%且维持10秒的情况下创建转储,双内核45%的用量相当于单内核90%的用量。而16核系统中,触发器法制将被调整为5.6525%。
提示:-c和-cl需要使用整数值,而-u选项可以为多核系统指定更为精准的阈值。
注意:CPU密集型用户模式线程通常会设计为通过多个CPU运行,除非处理器相关性被设置为仅允许使用一个CPU。-u选项并不能实现“如果进程超过单一CPU阈值后创建转储”类似的效果。
监视内存用量
- -m 超出指定阈值时创建转储
- -ml 低于指定阈值时创建转储
所指定的内存阈值以MB为单位统计。Procdump每秒一次检查该进程的内存计数器,但只能在检查的一刻发现进程的内存用量相对于系统提交限制(页面文件总量+大部分RAM)超出或低于阈值时才能创建转储。如果用量的尖峰或低谷只持续很短暂的时间,Procdump可能无法检测到。
例如,下面命令可以在testapp内存用量超过200MB后创建一个转储,并且在内存用量低于200MB之前,每隔五秒创建一个转储,直到10个。
Procdump -m 200 -n 10 -s 5 testapp
使用性能计数器触发转储
-p 后跟计数器名称及条件超出的阈值。
-pl 后跟计数器名称及条件低于的阈值。
注意:如果计数器名称中包含空格,需要将名称放在引号内。
机制与内存用量监视相同,每秒检测一次,可配合-n和-s选项定期创建更多转储文件。例如下列命令,可以检测系统进程数量超过750个之后,为taskmgr.exe创建转储,随后如果进程数量依然多于750,会每秒一次额外创建2个转储(共3个)。
Procdump -p "\System\Processes" 750 -s 1 -n 3 taskmgr.exe
- -e 在进程遇到unhandle exception之后创建转储。
- -e 1 在每次异常后创建转储,包括第一轮异常。
- -h 监视目标进程挂起(停止响应)的顶层窗口,之后创建转储。不响应定义:如果某个被监测的窗口无法响应窗口消息五秒,则会认为窗口不响应。
- -n 创建多个转储。除非-s指定不同的间隔,否则首次创建转储后,每间隔10秒创建一个转储
- -l 监视目标仅此创建的调试输出。如果不使用-f筛选选项,Procdump会在每次创建调试输出后创建一个转储。借助筛选,可以指定哪些输出触发转储,哪些仅汇报给Procdump控制台输出。
- -t 可在进程终止时创建转储。用于找出非由unhandled-exception导致的进程非预期退出。
- -f 指定哪些异常或调试输出可触发转储,或仅输出值Procdump控制台输出。如果只希望查看所有调试输出和第一轮异常但不创建转储,可使用-f "",或其他绝对不会出现在输出结果中的任何文本,例如-f "THISWILLNEVERHAPPEN"
示例与演示:
范例1:Procdump附加至Word实例并回报遇到的第一轮异常信息,但不会创建转储文件
Procdump.exe -e 1 -f "" winword.exe C:\temp
范例2:随后10次遇到该第一轮异常后,每次创建完整转储并存储至C:\Temp目录,该异常代码为C0000005,代表“访问冲突”
Procdump.exe -ma -n 10 -e 1 -f c0000005 winword.exe C:\Temp
范例3:多选项配合使用。下列命令会在Testapp应用超过CPU阈值或内存用量阈值且维持3秒后,窗口不响应,或遇到unhandled-exception的异常后创建转储,其他情况则会自动退出。
Procedump.exe -m 200 -c 90 -u -s 3 -h -t -e testapp
演示:利用性能监视器配合procdump监视进程内存使用。
1)运行perfmon,性能监视器添加memory - committed bytes计数器。
2)右键点击刚刚添加的计数器 – 属性,查看计数器的名称。
3)找到想要监控进程的PID,并运行如下命令监控对应的进程,如果超出限额后自动创建转储:
Procdump -p "\Memory\Committed Bytes" 200000 892
4. 参考资料:
《Windows Internals实战指南》