• 服务器CPU很高-怎么办(Windbg使用坑点)


      最近,碰到了一个线上CPU服务器很高的问题,并且也相当紧急,接到这个任务后,我便想到C#性能分析利器,Windbg。

      终于在折腾半天之后,找出了问题,成功解决,这里就和大家分享一下碰到的问题。

      问题1:安装Windbg,是否还需要符合文件?

      答:我看到网上很多教程,都说需要装符号文件,才能调试,我便以为也是,但是一去查,发现符号文件,要不就说不维护了,也下载不过来,最后想到可能是网络的问题,最后通过翻墙解决。更加坑的是,安装好符号文件后,还有各种报错,后面索性就不搞符号文件了,就直接来分析dump(Windows转储文件),没想到一式竟然成功了。于是得出结论:windows 10 应该是不需要符号文件了的(我只有win10,并且下载是最新的Windbg,亲测可用)。

      问题2:当时创建完转储文件之后(dump),便开始分析,在使用的命令的时候,进行各种报错,各种解决,也没有解决。最后面发现是下面这个问题。

      答:对于我们有些程序,任务管理器上,进程名称(32),会带有32位的字眼的话,一般情况下是需要用32位的任务管理器的打开的,因为当时没有服务器的权限,别人给我的dump文件是64位的,所以我各种加载,各种报错。后面采用了32位的任务管理器来备份dump,就顺利很多了。

      32位的任务管理器打开路径:C:WINDOWSsystem32 askmgr.exe。

      当然上面说法也不绝对,因为这个主要是依赖于你的编译器是多少位的,如果你64位编译出来的程序,可能有进程名称那有32位,你也需要用64的任务管理器打开,备份dump才行。

      如果有朋友使用Windbg碰到问题,可以在博客留言,或者加Q:1040350718。

      下面我演示一下,我使用Windbg的分析过程。

    • !runaway  查看当前托管线程已执行时间
      • 找出耗时最大的线程
      •  

      •   可以看到是16f4这个线程,耗时最长。
    • 切换到指定的线程    ~~[16f4]s
      • 切换到指定的线程。
    • 查看当前线程的调用堆栈  !clrstack
      • 使用这个命令的时候,可能会有提示说,模块没有加载。
      • 32位:  .load C:WindowsMicrosoft.NETFrameworkv4.0.30319sos.dll
      • 64位:  .load C:WindowsMicrosoft.NETFramework64v4.0.30319sos.dll
      • 用上面的命令加载把sos.dll加载进Windbg中(这是.Net Framework安装目录),即可使用。
    • 在我查看线程的堆栈信息之后,根据自己对系统熟悉,能定位到具体代码了。
    • 当然你也可以通过反编译的方式来定位具体的代码
    • !dumpdomain
    • !savemodule 00007ffb3a4b4128 d:21.dll     导出dll之后,再通过Ilspy来定位代码。  

      

  • 相关阅读:
    c#_表单处理方式
    C#_在.net中序列化读写xml方法的总结
    Jquery_异步上传文件多种方式归纳
    C#_Jquery无刷新上传
    构造方法的作用
    ssh项目问题01,为创建数据库抛出的异常
    成员方法的使用及其调用
    静态页面的使用和操作
    oa项目环境搭建的操作步骤详解
    写做顺序
  • 原文地址:https://www.cnblogs.com/gdouzz/p/14274546.html
Copyright © 2020-2023  润新知