procdump
概述
Sysinternals里面的一个命令行抓dump工具,核心定位是按条件触发的转储工具- 它可以在崩溃、
CPU飙高、内存超标、卡死等各种条件下自动抓dump,不用盯着手动抓
三种基本工作模式
Attach到已运行的进程- 直接给进程名或
PID
- 直接给进程名或
|
1 2 |
procdump -ma test.exe C:\dumps procdump -ma 1234 C:\dumps |
- 等待进程出现再
attach- 进程还没起,守株待兔
|
1 |
procdump -ma -w test.exe C:\dumps |
- 自己启动进程并监控
ProcDump当启动器,注意这时目标要写全路径,且顺序是-x
|
1 |
procdump -ma -x C:\dumps C:\path\to\test.exe arg1 arg2 |
Dump 内容控制
- 这组开关决定
dump文件里包含什么,直接影响文件大小和能分析出什么- 不写
-m*时默认是mini dump
- 不写
-mp—Mini dump,最小,只有线程栈和基本信息,文件小但堆数据不全-ma—Full dump,完整内存转储,含堆、句柄、所有内存- 分析内存泄漏、看对象内容时用这个
-mt—Triage dump,介于两者之间,去除了敏感信息,适合给外部分享-md <callback.dll>— 用自定义callback DLL决定抓哪些内存(高级用法)
触发条件
-c <百分比>—CPU占用超过阈值时触发,常配-s指定持续时长-cl是低于阈值触发
m <MB>— 提交内存超过指定值时触发-ml是低于
-s <秒>— 持续满足条件多少秒后才抓(防抖动)- 或在没有其他条件时表示「启动后
N秒抓一份」
- 或在没有其他条件时表示「启动后
-h— 窗口无响应(hung,卡死超过5秒)时触发-e— 发生未处理异常时触发-e 1连第一次异常(first-chance)也抓-g把托管(.NET)的异常也算进来-l输出异常信息到控制台
-t- 进程退出/终止时抓一份(想看进程死前状态很有用)
-f <过滤串>- 配合
-e,只对包含特定文本的异常触发(按异常名或模块名过滤)
- 配合
-pl/-p- 基于任意性能计数器触发(高级,可监控自定义计数器)
抓多次
- 默认抓一次就退出,要连续抓多份:
-n <次数>— 总共抓几次后退出,比如-n 3抓三次-s <秒>— 配合-n控制两次之间的最小间隔
|
1 2 3 |
// CPU 持续超 80% 达 5 秒就抓,最多抓 3 份 procdump -ma -c 80 -s 5 -n 3 test.exe C:\dumps |
系统级 / 即时调试器
-i [dump目录]- 把
ProcDump注册为系统的即时(postmortem)调试器,之后任何进程崩溃都会被它接住抓dump - 这是全局的
- 把
-u- 取消上面的注册,恢复原来的调试器
-r- 用克隆(
reflect)方式抓dump,大幅缩短目标进程被冻结的时间,对生产环境的高负载进程友好(Win7 SP1+),代价是占用更多内存
- 用克隆(
常见实战组合
- 启动即崩、想抓崩溃瞬间(等待出现 + 抓未处理异常)
|
1 |
procdump -ma -w -e test.exe C:\dumps |
- 抓
.NET程序的异常(含托管异常)
|
1 |
procdump -ma -e -g test.exe C:\dumps |
CPU跑满定位死循环
|
1 |
procdump -ma -c 90 -s 10 test.exe C:\dumps |
- 进程随机退出,想看死前现场
|
1 |
procdump -ma -t test.exe C:\dumps |
- 内存泄漏,涨到
1GB抓一份完整堆
|
1 |
procdump -ma -m 1024 test.exe C:\dumps |
注意
- 第一次运行会弹
EULA同意框,自动化场景加-accepteula跳过
|
1 |
procdump -accepteula -ma test.exe C:\dumps |
- 抓
64位进程用64位ProcDump(procdump64.exe),32位用procdump.exe
windbg
dbgsrv
- 把
Debugging Tools对应架构目录(比如x64)整个拷进虚拟机,运行- 位数和目标进程对齐(
64位进程用x64的dbgsrv)
- 位数和目标进程对齐(
|
1 2 3 |
dbgsrv -t tcp:port=1234 dbgsrv -t tcp:port=1234,password=mypwd |
端口
- 放行
1234端口
WinDbg
- 命令行
|
1 |
windbg -premote tcp:server=192.168.1.50,port=1234 |
- 或者
WinDbg菜单File > Connect to Remote Stub,填
|
1 2 3 |
tcp:Port=1234,Server=192.168.1.50 tcp:Port=1234,Server=192.168.1.50,password=mypwd |
Attach 并抓 dump
- 连上后
File > Attach to Process,列表中找到目标进程
|
1 |
.dump /ma C:\dumps\test.dmp |
实时(live)调试
.dump /ma只是顺手存了一份转储留档,这一步不改变当前会话状态,仍然连着那个活进程- 所以抓完
dump后可以接着调
声明:本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Soui五05/30
- ♥ Windows 核心编程 _ 进程四06/25
- ♥ C++11_四种类型转换11/10
- ♥ 51CTO:Linux C++网络编程三08/16
- ♥ Windows_API_Apply_112/31
- ♥ 深入理解C++11:C++11新特性解析与应用 三01/05