• WINDBG学习


    1. 下载安装Windbg

        http://www.windbg.org/      Debugging Tools for Windows 10 (WinDbg)  下载Windows 10 SDK

    2.  Create Dump File

        cpu 使用量过高时,任务管理器找到相应的进程并dump files。

    3. Using Windbg 查找Root Cause

       打开对应版本的WinDbg, Ctrl+D 打开.DMP文件

       !loadby sos clr      加载Son of Strike extension (包含很多有用的debug .net 代码的方法)

       !runaway     列出所有的线程及执行用户模式user mode代码的时间。当处理cpu100%问题是,查看一直执行的线程,一般是开头几个。

       ~线程编号s  选择指定的线程

      !CLRStack    查看指定的线程当前正在做什么,找到stuck中的方法

      分析问题后,查看对应用户代码,找出问题点

     ~线程编号s   指定线程

    !CLRStack -p  列出stack trace 并且每帧的参数
    比如 

    iPaper.BL.Backend.Modules.Paper.Settings.SettingDescriptionCache.GetAllDescriptions(iPaper.BL.Backend.Infrastructure.PartnerConfiguration.IPartnerConfig)
    	PARAMETERS:
    		partnerConfig (0x00000000543ac650) = 0x0000000260a7bd98

      左侧的是本地内存指针地址,右侧是变量 实际存储地址。

    !do  0x0000000260a7bd98   可以查看到变量的值

    参考  https://improve.dk/category/IIS/

     !threads  列出托管线程

    !threadspool   列出线程池情况   

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

    .time  查看CPU使用情况,分析User time

    !runaway  查看thread占用时间,对比User time, 找出占用比最高的那个一般是问题点

    ~线程s    切换到指定线程

    k            查看调用堆栈

    !clrstack  用SOS列出托管方法调用堆栈

    !SaveModule <Base address> <FileName>  若是没有源码,则需要先用!DumpDomain  找到程序集,base Address还可以通过lm命令查看加载的module来获取。 然后保存此model,再反编译dll

    参考:https://www.cnblogs.com/lbq1221119/archive/2008/06/17/1224301.html

    错误解决

    若执行 !clrstack 出现报错

    OS Thread Id: 0xbcd24 (35)
    Unable to walk the managed stack. The current thread is likely not a
    managed thread. You can run !threads to get a list of managed threads in
    the process
    Failed to start stack walk: 80070057

    执行~*e!clrstack查看所有持有和等待锁的线程(的下一条要执行的代码)

    https://www.cnblogs.com/javawebsoa/archive/2013/05/20/3089381.html

  • 相关阅读:
    [论文复现笔记]Im2Struct
    深度学习踩坑
    Matlab问题汇总
    Linux网络服务
    探索Blender
    [每日挖坑]20200728
    Ubuntu重启之后显卡挂了
    3D视觉知识点
    [每日挖坑]20200727
    遥感影像相关知识
  • 原文地址:https://www.cnblogs.com/dennysong/p/10980531.html
Copyright © 2020-2023  润新知