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 ...
随机推荐
- php之array_column 的使用
听说只有大牛级的高工才知道的函数array_column () 讲真,我才知道. (PHP 5 >= 5.5.0, PHP 7) array_column - 返回数组中指定的一列 说明 arr ...
- 谈谈.NET架构师面试及如何设计面试题
上星期:应老东家的要求,帮其面试.NET架构师. 于是:老东家进行了一星期的简历收集: 终于:在一堆简历里,精挑细选了四个: 约了:周末上午下午各两个. 面试者年龄:在30-35岁左右,差不多10年. ...
- js继承之组合继承(结合原型链继承 和 借用构造函数继承)
在我的前两篇文章中,我们已经介绍了 js 中实现继承的两种模式:原型链继承和借用构造函数继承.这两种模式都存在各自的缺点,所以,我们考虑是否能将这二者结合到一起,从而发挥二者之长.即在继承过程中,既可 ...
- 从壹开始 [ Nuxt.js ] 之二 || 项目搭建 与 接口API
前言 哈喽大家周一好,今天的内容比较多,主要就是包括:把前端页面的展示页给搭出来,然后调通接口API,可以添加数据,这两天我也一直在开发,本来想一篇一篇的写,发现可能会比较简单,就索性把项目搭建的过程 ...
- .NET Core之微信支付之公众号、H5支付篇
前言 本篇主要记录微信支付中公众号及H5支付全过程. 准备篇 公众号或者服务号(并开通微信支付功能).商户平台中开通JSAPI支付.H5支付. 配置篇 公众号或者服务号中 -------开发----- ...
- web项目自定义路由_实现静态资源URL控制
前言: IIS会默认把:图片.JS.HTML.CSS这些文件当成静态资源处理,为了减少服务器压力,默认这些静态资源是不走URL路由规则控制的. 作为小白及初学者,本人对这些了解甚少,补充基础知识吧: ...
- 关于css兼容性问题及一些常见问题汇总
目前主流浏览器的兼容性做的都比较好了,本文主要针对IE6,7的不兼容问题进行解决. 1.圆盘时钟有浮动存在时,计算一定要精确,不要让内容的宽高超出我们所设置的宽高,IE6下,内容会撑开设置好的高度. ...
- DataPipeline丨金融行业如何统一管理单个任务下所有API的同步情况
目前,依靠"手工人力"的电子表格数据治理模式逐渐被"自动智能"的专业工具取代.数据管理员.业务分析师开始采用"平台工具"来梳理主数据.元数据 ...
- Android之Material Dialogs详解
文章大纲 一.什么是Material Dialogs二.Material Dialogs实战三.项目源码下载 一.什么是Material Dialogs Material Dialogs是一个 ...
- MongoDB 运维相关的命令
1.在线释放内存 use admindb.runCommand({closeAllDatabases:1}) 注:3.2 版本 已经去掉了这个命令了 2.rs.status() 查询复制集状态 3.d ...