Windbg 检测内存占用过高

疫情期间,闲来无事瞎逛,看到了一个Windbg 检测内存占用过高的文章,还不错,挺详细的,记录下。

1 cpu占用过高

通常使用多线程有时会遇到cpu占用过高、内存爆满的情况,快速定位异常线程是多线程开发中必须熟悉的技能。cpu占用过高一般是由死循环造成的,看下边一个简单的例子,Run方法内部有死循环,程序运行后会 占用大量的cpu资源:

namespace MyApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Run();
            Run2();
            Console.ReadKey();
        }
  //死循环,会造成cpu内存占用过高
        static void Run()
        {
            Thread th = new Thread(() =>
            {
                while (true)
                {
                    Console.WriteLine("hello windbg");
                }
            });
            th.Start();
        }
  //不会占用太高的cpu资源
        static void Run2()
        {
            Thread th = new Thread(() =>
            {
                while (true)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("hello windbg2");
                }
            });
            th.Start();
        }
    }
}

但除此外,程序运行cpu资源占用过高,怎么去定位呢?这里采用Windbg简单演示cpu占用过高的异常定位,

下载地址:Windbg下载。安装完成后,界面如下所示:

Windbg解决步骤:(以MyApp.exe为例)

步骤一:生成Dump文件

 点击MyApp.exe文件运行,打开【任务管理器】,找到MyApp,右键选择【创建转储文件】即可生成dump文件。

步骤二:Windbg分析dump文件

打开Windbg,选择【文件】->【Open dump file】->找到上一步生成的dump文件即可。

 执行以下命令加载符号和sos库:

.sympath SRV*c:\localsymbols*http://msdl.microsoft.com/download/symbols
.reload
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.DLL

通过命令 !threads 查看线程:

 死循环会长期占有cpu,通过 !runaway 查看各个线程的运行时间:

我们看到 4eac线程的运行时间最长,通过命令 ~~[4eac] ; !clrstack 查看线程堆栈信息:

我们看到异常定位在MyApp的Program类的第24行,查看我们的代码,找到这个位置,发现这里是一个while(true)死循环,定位结束。

2 内存爆满

内存爆满也是异常遇到的问题,如大量拼接字符串会占用较大的内存,看下边的一个例子,程序代码如下:

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始执行..");
            GetBigString();
            Console.ReadKey();
        }
        //大字符串拼接
        static void GetBigString()
        {
            String str = "";
            for (int i = 0; i < 10000000; i++)
            {
                str+=$"hello{i}";
            }
            Console.WriteLine(str);
        }
    }

内存爆满最常见原因是大量创建某个类型的变量,问题定位方法和上边定位cpu占用高的定位差不多。首先生成dump文件,然后用Windbg打开,加载符号和sos库,然后执行 !dumpheap –stat 查看各个类型的数量和尺寸,我们看到string类型数量和占用的资源很多:

通过 !DumpHeap /d -mt 00007ff8878c74c0 查看当前的方法表,如下:

通过字符串内容是【hello0hello1...】和string类型数量多、尺寸大,我们再去在代码中查找很容易定位到问题代码。

小结:Windbg可以查看clr级别内容,在开发中对我们优化代码和异常定位有不错的帮助,这里只是简单介绍Windbg的基本用法,有兴趣的小伙伴可以研究下官方教程

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值