zoukankan      html  css  js  c++  java
  • Windbg程序调试系列1-常用命令说明&示例

    Windbg程序调试是.Net高级开发需要掌握的必备技能,分析内存泄露、分析高CPU、分析线程阻塞、分析内存对象、分析线程堆栈、Live Dedugging。这个领域可以说一个技能+场景化应用的结合,如果单学Windbg命令,不理解实际Troubleshooting中的作用,是没有意义的。所以,准备搞个系列文章,3~5篇,分享给大家:

    工欲善其事必先利其器,我们先从常用的命令和示例说起。

    1. 先准备一个Dump文件,建议使用64位应用程序。例如:64位IIS应用的w3wp进程,64位exe进程都可以。如果抓Dump文件,很简单:任务管理器-进程-右键【创建转储文件】

    2. 下载并安装Windbg,下载链接:https://developer.microsoft.com/zh-cn/windows/downloads/windows-10-sdk,一路下一步,选择【Debugging Tools for Windows】

     

    打开之后,Ctrl+D,打开第一步抓的Dump文件,开始今天的常用命令介绍。

    1. 加载SOS调试扩展dll

    .loadby sos clr

    2. 设置并重新加载调试符号文件的命令,将.Net 一些重要的pdb文件下载到指定的路径中,加载到Windbg调试环境中,这样,我们就可以看到程序在哪一行出错,运行到哪一行了

    1 .symfix+ C:symbols
    2 .reload

    3. 打印当前调试符号文件搜索路径

    0:000> .sympath

     4. 查看线程池,分析并确认CPU使用率,可以使用哪个指令

    0:000> !threadpool
    CPU utilization: 2%
    Worker Thread: Total: 19 Running: 2 Idle: 17 MaxLimit: 32767 MinLimit: 4
    Work Request in Queue: 0
    --------------------------------------
    Number of Timers: 2
    --------------------------------------
    Completion Port Thread:Total: 4 Free: 4 MaxFree: 8 CurrentLimit: 4 MaxLimit: 1000 MinLimit: 4

    5. 查看线程的整体运行情况

    !threads

    6. 查询指定线程的调用堆栈,例如34号线程

     ~34s

    !clrstack

    7. 查看线程消耗CPU资源情况

    !runaway

    第一列是线程号,第二列是Total的CPU使用时间

    8. 查看当前线程栈上所有对象的信息,Dump stack objects

    !dso

    9. 查询内存中指定对象的信息 Dump object

    !do

    10. 查询内存中指定数组对象的信息 Dump Array

    !da

    11. 查看当前线程的堆栈和每行堆栈上的变量信息

    !clrstack -a

    12. Windbg 附加进程调试,启用CLR异常捕获、查看异常、查看异常所在线程堆栈、禁用CLR异常调试、退出调试

    sxe clr
    g
    !pe
    !clrstack
    sxd clr
    qd

    13. 查看托管堆上内存对象的分布、三个代的信息

    !eeheap -gc

    14. 查看托管堆上加载的Dll

    !eeheap -loader

    15. 什么是内存对象代提升,垃圾回收中未回收的对象也称为幸存者,并会被提升到下一代。通过代提升的情况,可以分析对象的存活时间

     

    16. 查询内存中各类对象的总个数和总内存占用

    !dumpheap  -stat

     17. 查询内存中大对象的个数和对象大小

    !dumpheap -stat  -mt -min 85000

    18. 查看内存的析构队列的指令

    !finalizequeue

    19. 请输入查看对象000000123557DFC0的gcroot的指令

    !gcroot 000000123557DFC0

    20. 查看线程阻塞的指令

    !syncblk

    21. 查看Dump中所有System.Net.Sockets.Socket对象统计信息的指令

    !dumpheap -type System.Net.Sockets.Socket -stat

    还有很多,同时Windbg还支持Mex扩展插件,可以参考我博客中的链接:

    Windbg-Mex扩展使用总结

    接下来,我会以内存泄露的场景,给大家分享Windbg分享的思路和方法。

    周国庆

    2018/10/28

  • 相关阅读:
    [python]OS文件系统
    [phyton]文件的简单读写练习
    [Python]字典的简单用法
    Cocos2d-x学习笔记(十五)之 绘制图形
    Cocos2d-x学习笔记(十四)之 拖动渐隐效果类CCMotionStreak
    Cocos2d-x学习笔记(十三)之 容器类
    Cocos2d-x学习笔记(十二)之 文本渲染类
    Cocos2d-x学习笔记(十一)之 菜单类CCMenu
    Cocos2d-x学习笔记(十)之 控件类CCControl
    Cocos2d-x学习笔记(九)之 摄像机类CCCamera
  • 原文地址:https://www.cnblogs.com/tianqing/p/9866361.html
Copyright © 2011-2022 走看看