一、VSPerf性能分析
通过VSPerf工具抓取性能报告,通过VS进行分析;
1、抓取方法:(分析文件和pdb必须匹配!!!)
备注:win8以上系统(如果提示错误,使用管理员启动cmd在尝试)
命令:
开始抓取性能报告:vsperf /attach:[pid/exename]
停止抓取性能报告:vsperf /detach

2、以前的系统抓取性能报告命令:
::start the profiler
vsperfcmd /start:sample /output:test1.vsp
::send the profiler to a waiting state
vsperfcmd /global off
::attach to your application by specifying the pid
vsperfcmd /attach:[pid]
::activate the profiler
vsperfcmd /global on
::detach the profiler from your application
vsperfcmd /detach
::shutdown the profiler
vsperfcmd /shutdown
3、分析性能报告
1)分析性能报告文件(vs打开性能文件进行分析)
2)根据目标程序执行情况,结合CPU曲线选择合适的周期进行分析
3)根据函数试图和调用栈试图,确定性能热点
4)右键函数可以显示函数详情
备注:独占样本:函数自身占用的样本数,不包含子函数占用时间;非独占样本:包含函数调用的子函数的时间;一般使用非独占样本进行分析;
二、UMDH内存分析
umdh是windbg自带的内存检测工具,原理gflags记录内存时的调用栈,通过内存泄漏前后快照对比分析出占用大量内存的函数;
命令:
::设置pdb路径
SET _NT_SYMBOL_PATH_=pdb路径
::开启收集用户态信息
gflags.exe -i test.exe +ust
::抓取快照1
umdh.exe -pn:test.exe -f:umdh1.txt
::抓取快照1
umdh.exe -pn:test.exe -f:umdh2.txt
::比对快照
umdh.exe -d umdh1 umdh2 >> umdb12.txt
::停止收集用户态信息
gflags.exe -I text.exe -ust
三、Heap内存分析
1、开启收集用户态信息,gflags.exe -i test.exe +ust
2、任务管理器,抓取dmp
3、关闭收集用户态信息,gflags.exe -i test.exe -ust
4、打开windbg(版本:10.0.18362.1 AMD64)
5、!heap -s
备注:如果提示your debugger do not have full symbol information,表示pdb不一致,需要使用.sympath SRV*d:\mysymbols*http://msdl.microsoft.com/download/symbols去符号服务器下载pdb,然后执行.reload重新加载符号文件,另外,使用ld xxx命令强制加载符号文件,lmvm xxx显示文件信息,其中xxx为dll(exe)文件名,如ld test.dll是强制加载test.dll的符号文件,lm显示所有模块符号文件加载情况。
6、显示堆列表,找到占用内存最大的堆进行分析
7、!heap -stat -h xxx,其中xxx为堆地址;size表示每次分配的内存大小,blocks表示分配的次数,total表示内存分配的总大小;
8、!heap -flt s xxx,其中xxx为size上一步看到的size的值,使用该命令分析内存为size大小的内存被哪些地方占用
9、!heap -p -a xxx,分析具体的堆栈,xxx为内存地址,即上一步获取到的HEAP_ENTRY的值;
10、分析堆栈,在结合具体代码和使用场景,可以确定内存泄漏问题;


6897

被折叠的 条评论
为什么被折叠?



