这篇主要讲如何分析高内存和高CPU。

1、如何分析高内存

注:如果抓Dump的同时,刚好在执行GC,抓出来的Dump执行命令多半会出错,用!VerifyHeap也能验证Dump有误,这种情况只能重新抓Dump。报错如下:
The garbage collector data structures are not in a valid state for traversal.
It is either in the "plan phase," where objects are being moved around, or
we are at the initialization or shutdown of the gc heap. Commands related to
displaying, finding or traversing objects as well as gc heap segments may not
work properly. !dumpheap and !verifyheap may incorrectly complain of heap
consistency errors.
Could not request method table data for object 6E8B4D74 (MethodTable: FFE00F74).

procdump -ma TranProc //用procdump工具抓dump,用windbg打开,加载sos扩展!eeheap [-gc] [-loader] //可以先用这个初步判断一下是否确实有高内存,主要在哪里。一般LoaderHeap较小,问题多半出在GC Heap里。
Total LoaderHeap size:   Size: 0x2f000 (192512) bytes.
=======================================
Number of GC Heaps: 1
generation 0 starts at 0x02d01018
generation 1 starts at 0x02d0100c
generation 2 starts at 0x02d01000
ephemeral segment allocation context: nonesegment             begin         allocated  size
02d00000  02d01000  02e99ff4  0x198ff4(1675252)
Large object heap starts at 0x03d01000segment             begin         allocated  size
03d00000  03d01000  03d12408  0x11408(70664)
Total Size:              Size: 0x1aa3fc (1745916) bytes.
------------------------------
GC Heap Size:    Size: 0x1aa3fc (1745916) bytes.!DumpHeap -stat //能看到占最大的对象是string,有143万个,占了171M内存
0x00007ffbae467df0  1,435,313   171,657,048 System.String
!DumpHeap -stat -gen 0  // -gen 参数只有psscor2里的DumpHeap才支持!
!DumpHeap -stat -gen 1
!DumpHeap -stat -gen 2  // 分别查看3个gen的统计情况,能看到主要集中在gen 2上,与perfmon显示的情况一致
!DumpHeap -stat -type System.String  //针对这个类型做统计,也能看到类似的结果MT    Count    TotalSize Class Name
0x00007ffbae467df0 1,435,313  171,657,048 System.String
Total 1,435,313 objects, Total size: 171,657,048//现在的关键是:为什么程序会产生这么多string对象,并且没回收?谁(哪些对象)引用了这些string,然后在code里找到这些变量名,分析代码的写法是否有问题
!DumpHeap -type System.StringAddress       MT     Size
02e928b8 6fbd2300       72
02e92900 6fbd2300     1168
可以找Size最大的几个对象,用!do 02e92900 查看这个对象为什么产生了这么多string。之后配合!gcroot 02e92900 看一下这个对象的根在哪里,为什么没回收。!gcroot -mt 0x00007ffbae467df0 //在不知道对象实例,只知道对象类型的时候,用!gcroot -mt [MethodTable] 非常有用,能找到是哪些对象(包括<object address>,可以用!do、!DumpMT)创建了大量的目标对象(在这里是string),可惜不能统计出哪个Container里含有多少个目标对象。但可以看到引用链Reporter->Report->List<string>->object[],另一个引用链是AppDomain->AppDomainSetup->object[],问题当然出在我们的代码里,于是分析Reporter和Report的源码解决问题。如果没有dll,也可以SaveModule出来再用ILSpy打开。
Scan Thread 0 OSThread c10
RSP:cee858:Root:  0000000002b837c8(TranProc.Reporter)->0000000002b83768(TranProc.Report)->0000000002b83780(System.Collections.Generic.List 1[[System.String, mscorlib]])->0000000013b85470(System.Object[])
……
Scan Thread 4 OSThread b90
rdx:Root:  00000000123de5f8(System.String)
r8:Root:  00000000123de5f8(System.String)
DOMAIN(0000000000E50EE0):HANDLE(Strong):213f8:Root:  0000000002b81478(System.AppDomain)->0000000002b81560(System.AppDomainSetup)->0000000002b815b0(System.Object[])!do 0000000002b83768
Name: TranProc.Report
MethodTable: 00007ffb50dc3718
EEClass: 00007ffb50ef3640
Size: 24(0x18) bytes
GC Generation: 2(D:\IT\debug\Exercise\Labdata\lab6\TranProc\Debug\TranProc.exe)
Fields:MT            Field           Offset                 Type VT             Attr            Value Name
0000000000000000  4000007        8                       0 instance 0000000002b83780 reportDetails//最后,可以通过SaveModule把dll保存出来仔细查看,通过这个过程,基本可以确定高内存的问题所在。
!SaveModule 00400000 d:\ProcessItems.dll

2、如何分析高CPU

高CPU,一般伴随着死锁或线程间同步问题。可以从下面对dump的分析,看出一些思路。

!syncblk  //可以看到ba8号线程持有一个锁AsyncRendering<EventHandlerObject>,地址为000000000559f920
Index         SyncBlock MonitorHeld Recursion Owning Thread Info          SyncBlock Owner802 000000001e086658           11         1 000000000404cf30   ba8  10   000000000559f920 Microsoft.Windows.ManagementUI.CombinedControls.AsyncRendering+EventHandlerObject!threads  //能观察到有2个Domain(406e3b0、40f8d10),每个分别有一个STA的UI线程ID OSID        ThreadOBJ     State   GC     GC Alloc Context                  Domain           Count APT Exception0    1 10d8 0000000004076870      4220 Enabled  00000000057713c8:0000000005771430 000000000406e3b0     0 STA System.IO.FileNotFoundException (0000000005205eb0)7    3 1e90 00000000040f25d0   2007020 Enabled  0000000005776a10:0000000005777430 00000000040f8d10     2 STA10    6  ba8 000000000404cf30   380b220 Enabled  00000000056ee470:00000000056efb50 00000000040f8d10     2 MTA (Threadpool Worker)
~10s //进入10号线程
!clrstack //观察线程上的堆栈,看起来在等一个WaitHandle,其他也看不出什么了
000000001e97e760 000007feebb7250b System.Threading.WaitHandle.WaitOne(Int64, Boolean)
000000001e97e7a0 000007feeb537707 System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle)
~7s //进入7号线程
!clrstack  //都是MIGUIControls.dll里的代码,Save出来看看!
Microsoft.Windows.ManagementUI.CombinedControls.AsyncRendering.RenderValueInt(Microsoft.Windows.ManagementUI.CombinedControls.RenderingContext, Microsoft.Windows.ManagementUI.CombinedControls.RenderValueHandler, Boolean, System.String ByRef)
Microsoft.Windows.ManagementUI.CombinedControls.AsyncRendering.AddRenderingToBatch(Int32, Microsoft.Windows.ManagementUI.CombinedControls.RenderingContext, Microsoft.Windows.ManagementUI.CombinedControls.RenderValueHandler)
Microsoft.Windows.ManagementUI.CombinedControls.CrimsonEvent.GetEventMessage(Boolean, Microsoft.Windows.ManagementUI.CombinedControls.RenderValueHandler, Int32, Int32)
Microsoft.Windows.ManagementUI.CombinedControls.CrimsonEvent.GetMessage(Microsoft.Windows.ManagementUI.CombinedControls.RenderValueHandler, Int32, Int32)!runaway //看一下各线程执行时间,hang的问题要么是死锁、要么是无限循环?、要么是性能问题执行太慢?呵呵。结果表明7号线程执行的比较久, 10号持有锁
User Mode TimeThread       Time7:1e90      0 days 0:00:02.0900:10d8      0 days 0:00:00.73310:ba8       0 days 0:00:00.655!SaveAllModules d:\  //先把dll保存出来,总归是慢在用户自己的代码上面,应该就是这个MIGUIControls.dll,执行慢的7号线程、和持有锁的10号线程。具体问题如何分析,还需要总结经验。

转载于:https://www.cnblogs.com/AlexanderYao/p/4986967.html

windbg调试C#代码(二)相关推荐

  1. WinDbg 调试命令记录二 (基础CLR查看)

    查看CLR基础 !dumpdomain  //dump domain信息 !dumpdomain <domain assress>  //dump 某个 domain 的信息 !dumpa ...

  2. debug idea js_IntelliJ IDEA 配置chrome插件调试js代码 - 狂奔的熊二 - 博客园

    调试js代码,每次都在要在代码中写debugger,或者在chrome中打断点,而且chrome的断点信息不人性化.偶然发现idea竟然有这个功能,简直神器啊.研究了半天终于搞定了,哈哈,开心.下面是 ...

  3. Windbg调试命令详解

    Windbg调试命令详解 发表于2013 年 8 月 23 日 转载注明>> [作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Win ...

  4. WinDBG调试dNet程序总结

    WinDBG工具简介 http://www.cnblogs.com/mashuping/archive/2009/03/28/1424168.html 对于一般的程序不需要使用WinDBG工具去调试, ...

  5. WinDbg学习笔记(二)--字符串访问断点

    标 题: [原创]WinDbg学习笔记(二)--字符串访问断点 作 者: gaorqing 时 间: 2009-07-25,21:39:04 链 接: http://bbs.pediy.com/sho ...

  6. windbg调试堆破坏

    堆破坏 所谓的堆破坏,是说没控制好自己的指针,把不属于你分配的那块内存给写覆盖了.这块内存可能是你程序的数据,也可能是堆的管理结构.那么这个会导致怎样的后果呢?可能的情况我们来yy下 把程序里的计算结 ...

  7. windbg调试HEAP

    HEAP的概念 堆栈堆栈,在操作系统内存中有两种存储空间,一个是堆,一个是栈.堆主要用于存储用户动态分配的变量,而栈呢,则是存储我们程序过程中的临时变量.当然栈的作用远不止用作存储变量,但这不是我们这 ...

  8. Windbg调试(使用方法)

    一.Windbg版本信息 Windbg分32位和64位版本,32位程序应使用32位Windbg调试,64位程序应64位Windbg调试. 若想使用64位的Windbg分析32位的程序, 使用如下命令进 ...

  9. Windbg调试学习

    一.为什么学习使用Windbg调试 Windbg是在windows平台下,强大的用户态和内核态调试工具.相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较 ...

  10. windbg调试驱动学习总结

    简单驱动编写与windbg调试 http://trustsec.blog.51cto.com/305338/64694/ 一.驱动编写 随着对windows系统的深入研究,越来越多的内核方面的知识被挖 ...

最新文章

  1. Sql server 2005带来的分页便利
  2. python进程数上限_python如何控制进程或者线程的个数
  3. 向上累积频数怎么算_天天向上:王一博单人cut只有7分钟,给了高天鹤最后的疼爱...
  4. java 编码与基础数据类型
  5. Python中Numpy数组的归一化处理
  6. 从源代码中加载res / values / dimension.xml中的维度值
  7. 【POJ 1269】判断两直线相交
  8. Jquery查找界面Html元素的方法(持续更新)
  9. kafka+多线程实现案例+Callable
  10. 【python】用PyQt5教你制作简单的水果抽奖机
  11. 杭电 1142 十字链表存储
  12. python最好视频教程_国外最顶级的Python视频教程,赶紧收藏!(带中文字幕)
  13. 2018 蓝桥杯省赛 B 组模拟赛(一)青出于蓝胜于蓝(DFS序+树状数组)
  14. MySQL面试核心25问(附答案),心有猛虎,细嗅蔷薇
  15. window7系统下如何使用虚拟机安装苹果系统
  16. 硅谷录用的计算机专业大学排名,学计算机科学专业,必选硅谷附近的这些加州大学...
  17. 更改laravel的默认端口8000
  18. jadx-gui 重命名功能
  19. 无锡中软国际有限公司笔试题(Java)
  20. 沧小海深入剖析xilinx的GTP/GTX核,掌握高速串行收发机制——第一章 前言闲谈

热门文章

  1. Ubuntu18.04 xrdp多用户远程桌面
  2. Gensim进阶教程
  3. 计算图像的均值、标准差
  4. 2021-07-09商场主页及分类
  5. 计算机七年级下册课件ppt课件ppt,七年级音乐下册
  6. 比特币 POW 白皮书 区块篡改成功的概率 代码 注释详解
  7. android sd卡 格式化 rom,Android 系统获取内存,ROM,SD卡大小
  8. 基于SSM的闲猫二手商城
  9. 基于springboot的健身管理系统
  10. delphi ehlib 添加选择框_教你用CASS10.1,在宗地图中添加“亩”注记