WinDbg调试C#技巧,解决CPU过高、死锁、内存爆满
软件安装
安装问题:执行 .loadby sos clr 命令无效
解决办法:
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
.loadby sos clr
代码调试
查看线程
命令: !threads
执行结果:

进入线程
命令: ~~[线程Id]s
执行结果:
查看线程详情
命令: !clrstack
执行结果:

查看线程状态
命令: !ThreadState 线程StateId
执行结果:

退出附加进程
命令: qd
查看线程环境块(空间)
命令: !Teb
执行结果:

查看线程堆栈
命令: !dumpstack
执行结果:

查看局部变量
命令: !clrstack
!clrstack -l
执行结果:

查看帮助
命令: !help
执行结果:

查看终结器队列
命令: !FinalizeQueue
执行结果:

查看线程池详情
命令: !threadpool
执行结果:

查看查看当前托管线程已执行时间
命令: !runaway
执行结果:

清屏
命令: !cls
查看查看当前托管线程已执行时间
命令: ~*e!clrstack
执行结果:看所有线程的堆栈
CPU过高的问题
模拟CPU过高
示例代码:
class Program
{
static void Main(string[] args)
{
Run(); Console.Read();
} static void Run()
{
var task = Task.Factory.StartNew(() =>
{
//这是一个非常复杂的逻辑,导致死循环
while (true)
{ }
});
}
}
生成64位Realease版本代码:

在Bin/Realse下找到文件并运行,然后查看CPU:

解决CUP占用过高
创建转储文件:

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

找到该转储文件:C:\Users\ADMINI~1\AppData\Local\Temp\ConsoleApp4.DMP
用X64版本的WinDbg打开DMP文件:

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
然后打开命令输入:

然后输入 .loadby sos clr 与 !threads

现在线程少没有关系,多的话我们没有办法去判断哪个线程消耗严重,所以执行 !runaway 查看当前托管线程已执行时间

切换到指定线程 ~~[4f78]s ,执行 !clrstack 查看当前线程的调用堆栈

从调用堆栈上来看,当前线程 在 Program+c.b__1_0() 方法之后23行就没有调用堆栈了,说明方法在这个地方停滞不前了。
最后反编译源码到指定的方法中去查看

方法二:
通过 !dumpdomain 拿到程序地址

然后反编译成dll输出文件 !savemodule 00007ff7e4f94120 c:\\.dll (文件夹必须存在)

然后找到该dll进行反编译

死锁问题
模拟死锁
实例代码:
class Program
{
static void Main(string[] args)
{
new Program().Run(); Console.Read();
} void Run()
{
lock (this)
{
var task = Task.Factory.StartNew(() =>
{
Console.WriteLine("-------start-------");
Thread.Sleep(); Run2();
Console.WriteLine("---------end--------");
}); task.Wait();
}
} void Run2()
{
lock (this)
{
Console.WriteLine("------我是Run2------");
}
}
}
执行结果:

解决死锁
然后用WinDbg附加到进程,执行 .loadby sos clr 与 !threads 查看当前的托管线程

然后执行 ~*e!clrstack 查看所有线程的堆栈
可以看出主线程在等待

执行 !syncblk 查看当前哪个线程持有锁,可以看出主线程持有锁

可以看得出“主线程”持有当前的同步锁

内存爆满
模拟内存爆满
实例代码:
class Program
{
static StringBuilder sb = new StringBuilder();
static void Main(string[] args)
{
for (int i = ; i < ; i++)
{
sb.Append("hello world");
} Console.WriteLine("执行完毕");
Console.Read();
}
}
解决内存爆满
然后用WinDbg附加到进程,执行 .loadby sos clr 与 !threads ,然后执行 !dumpheap -stat 查看clr的托管堆中的各个类型的占用情况

然后看到了有13768个char[]数组
然后执行 !DumpHeap /d -mt 00007ff841318610 //查看当前的方法表

然后执行 !DumpObj /d 0000022baed1dec8 //查看当前char[]的内容

然后执行 !gcroot 00000135a60f4940 查看当前地址的Root。。。

所以结合“StringBuilder”,结合 ”hello world“ 我们就找出了问题。。。
WinDbg调试C#技巧,解决CPU过高、死锁、内存爆满的更多相关文章
- Java中的CPU占用高和内存占用高的问题排查
下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程.如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下. 1.Java CPU过高的问题排查 举个例 ...
- WINDBG解决cpu占高的问题
https://blog.csdn.net/yenange/article/details/62886988 https://blog.csdn.net/zhushentian/article/det ...
- 用windbg+sos找出程序中谁占用内存过高,谁占用CPU过高(转载)
原文地址: http://www.cnblogs.com/Lawson/archive/2011/01/23/1942692.html 很早看到windbg+sos方面的知识,一直没仔细学习,也许因为 ...
- MySQL CPU 使用率高的原因和解决方法
用户在使用 MySQL 实例时,会遇到 CPU 使用率过高甚至达到 100% 的情况.本文将介绍造成该状况的常见原因以及解决方法,并通过 CPU 使用率为 100% 的典型场景,来分析引起该状况的原因 ...
- 记一次查内存异常问题(续《记一次Web应用CPU偏高》)
继上一次查应用的CPU飙高问题(http://www.cnblogs.com/hzmark/p/JVM_CPU.html)过去10天了.上次只是定位到了是一个第三方包占用了大量的CPU使用,但没有细致 ...
- Oracle SQL CPU占用高
Oracle数据库经常会遇到CPU利用率很高的情况,这种时候大都是数据库中存在着严重性能低下的SQL语句,这种SQL语句大大的消耗了CPU资源,导致整个系统性能低下.当然,引起严重性能低下的SQL语句 ...
- JVM进程cpu飙高分析
在项目快速迭代中版本发布频繁 近期上线报错一个JVM导致服务器cpu飙高 但内存充足的原因现象. 对于耗内存的JVM程序来而言, 基本可以断定是线程僵死(死锁.死循环等)问题. 这里是纪录一下排 ...
- 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)
在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记 ...
- zprofiler三板斧解决cpu占用率过高问题(转载)
zprofiler三板斧解决cpu占用率过高问题 九居 JVM性能与调试平台 zprofiler 上周五碰到了一个线上机器cpu占用率过高的问题.问题本身比较简单,但是定位过程中动用了多个zp ...
随机推荐
- bzoj5252 [2018多省省队联测]林克卡特树
斜率优化树形dp?? 我们先将问题转化成在树上选K+1条互不相交路径,使其权值和最大. 然后我们考虑60分的dp,直接维护每个点子树内选了几条路径,然后该点和0/1/2条路径相连 然后我们会发现最后的 ...
- bzoj 3126 单调队列优化dp
能转移的最左是其左边完整区间的最右左端点,最右是能覆盖它的最左左端点-1 #pragma GCC optimize ("O3") #include<cstdio> #i ...
- LCA 各种神奇的LCA优化方法
LCA(Least Common Ancestors) 树上问题的一种. 朴素lca很简单啦,我就不多说了,时间复杂度n^2 1.倍增LCA 时间复杂度 nlongn+klogn 其实是一种基于朴素l ...
- aes 128、192、256位,cbc、cfb、ecb、ofb、pcbc加密解密
AES加解密总共有以下这些 算法/模式/填充 字节加密后数据长度 不满16字节加密后长度 AES/CBC/NoPadding 16 不支持 AES/CBC/PKCS5Padding 32 16 AES ...
- Java Native Interface调用C++代码
概述 Java Native Interface译为Java原生接口,简称JNI.Java并不是完美的,它的不足体现在运行速度要比传统的C++慢上许多,并且无法直接访问到操作系统底层,为此Java提供 ...
- APP测试要点—UI、功能测试
一.UI测试 测试用户界面(如菜单.对话框.窗口和其它可规控件)布局.风格是否满足客户要求.文字是否正确.页面是否美观.文字.图片组合是否完美.操作是否友好等. UI测试的目标是确保用户界面会通过测试 ...
- 使用Rotativa在ASP.NET Core MVC中创建PDF
在本文中,我们将学习如何使用Rotativa.AspNetCore工具从ASP.NET Core中的视图创建PDF.如果您使用ASP.NET MVC,那么Rotativa工具已经可用,我们可以使用 ...
- Java8新特性之四:接口默认方法和静态方法
在JDK1.8以前,接口(interface)没有提供任何具体的实现,在<JAVA编程思想>中是这样描述的:"interface这个关键字产生了一个完全抽象的类,它根本就没有提供 ...
- [Leetcode]643. Maximum Average Subarray I
Given an array consisting of n integers, find the contiguous subarray of given length k that has the ...
- javascript语言精粹-笔记
walkDOM function walkTheDOM(node, func) { func(node); node = node.firstChild; while (node) { walkThe ...