在定位 .NET 应用程序中的高 CPU 占用问题时,WinDbg 是非常强大的工具之一,尤其配合 SOS 扩展使用可以快速锁定“忙线程”或死锁等问题。

本文将基于一次实际的分析流程,演示如何一步步定位由线程锁引起的 CPU 高占用。

1. 加载 SOS 扩展(针对 .NET)

首先,我们需要加载 SOS.dll。根据你所调试的 .NET 版本不同,使用 .loadby 指令时的模块名也不同:

.loadby sos clr

注意:

  • .NET Framework 使用的是 clr.dll,所以 .loadby sos clr 正确;

  • 如果你调试的是 .NET Core.NET 5+,对应模块可能是 coreclr.dll

  • 可使用 lm 命令确认实际加载的模块名。

2. 查看每个线程的调用栈

查看所有线程的调用栈是分析的关键一步。我们使用以下命令:

~* k

这会列出所有线程的 原生调用堆栈(native stack)

关注以下三类线程特征:

持续执行的线程(高 CPU 嫌疑线程)

栈顶函数是业务逻辑方法、算法处理、循环等,说明该线程在“忙”,是最需要关注的对象。

卡在等待(阻塞)状态的线程

以下函数说明线程被阻塞,可能在等待锁或资源:

  • WaitForSingleObject

  • Monitor.Enter

  • WaitOne

  • Sleep

找到等待的资源后,看正在等待什么,如果正在等待GC,则继续找谁在GC

找到在执行 GC 的线程

如果调用栈中包含以下函数,说明线程正在 GC 中:

  • clr!GCHeap::GarbageCollect

  • clr!SVR::gc_heap::gc1

  • clr!SVR::gc_heap::gc2

  • clr!SVR::gc_heap::gc3

  • clr!GCHeap::GarbageCollectGeneration

  • clr!SVR::GCHeap::GarbageCollect

  • clr!GCHeap::gc_thread_function

  • GCInterface::Collect

频繁GC会挂起线程,增加CPU消耗。

3. 分析具体线程

在上一步中,如果你发现某个线程(例如线程 28)调用栈活跃、函数栈持续变化,或者涉及 GC、锁等待,可以使用以下命令聚焦:

~28s
!clrstack

这将切换到线程 28 并显示它的托管调用栈,便于你进一步确认是否存在如下情况:

  • 死循环或密集计算导致高 CPU;

  • 一直等待某个锁对象,导致其他线程堆积;

  • 某些资源释放不及时,导致线程频繁争抢。

总结

通过上述方法,我们可以初步判断线程是否因锁或其他因素导致 CPU 占用异常。在实际排查中,掌握如下三点尤为重要:

  • 先宏观查看所有线程调用栈

  • 识别忙线程 / 等待线程/ GC线程 

  • 进一步使用 !clrstack 分析托管调用栈

这是一种稳定、高效的诊断思路,尤其适用于高 CPU 的 dump 分析场景。

WinDbg 分析 .NET Dump 线程锁问题的更多相关文章

  1. 利用windbg 分析IIS 的线程池w3wp程序多线程挂起问题

    前几天有个朋友发个了在windows server 2008跑的IIS 跑的程序w3wp程序dmp,要我帮忙分析为何线程都挂起不运行 经过查阅资料用windbg可以调试可以输出线程的调用堆栈,但是准备 ...

  2. 【性能诊断】五、并发场景的性能分析(windbg简介及dump抓取)

    windbg简介 Windbg是在windows平台下,强大的用户态和内核态调试工具.相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能 ...

  3. WinDbg分析Dump常用方法和命令

    记录下自己使用WinDbg分析Dump时常用的一些方法和命令 !analyze -v //找出出错的堆 .exrc //找到程序崩溃的位置 !heap //打印出错函数的局部位置 !for_each_ ...

  4. WinDbg 蓝屏dump分析教程

    一.WinDbg是什么?它能做什么? WinDbg是在windows平台下,强大的用户态和内核态调试工具.它能够通过dmp文件轻松的定位到问题根源,可用于分析蓝屏.程序崩溃(IE崩溃)原因,是我们日常 ...

  5. Windbg分析蓝屏Dump文件

    一.WinDbg是什么?它能做什么? WinDbg是在windows平台下,强大的用户态和内核态调试工具.它能够通过dmp文件轻松的定位到问题根源,可用于分析蓝屏.程序崩溃(IE崩溃)原因,是我们日常 ...

  6. 使用 WinDbg 分析dump文件

    步骤一: 生成dump文件. #include <Windows.h> #include <iostream> #include <DbgHelp.h> #incl ...

  7. 使用WinDbg分析蓝屏dump原因

    大多数人或许都经历过系统蓝屏问题,然而大多数人不清楚该怎么处理蓝屏问题,这里主要对系统蓝屏做一些解释,同时介绍下蓝屏问题分析工具WinDbg分析蓝屏问题的一般步骤. 微软官方对蓝屏的定义是,当系统遇到 ...

  8. Windbg分析高内存占用问题

    1. 问题简介 最近产品发布大版本补丁更新,一商超客户升级后,反馈系统经常奔溃,导致超市的收银系统无法正常收银,现场排队付款的顾客更是抱怨声声.为了缓解现场的情况, 客户都是手动回收IIS应用程序池才 ...

  9. windbg分析一次大查询导致的内存暴涨

    项目上反馈了一个问题,就是在生产环境上,用户正常使用的过程中,出现了服务器内存突然暴涨,客户有点慌,想找下原因. 讲道理,内存如果是缓慢上涨一直不释放的话,应该是存在内存泄漏的,这种排查起来比较困难, ...

  10. 揪出“凶手”——实战WinDbg分析电脑蓝屏原因

    http://www.appinn.com/blue-screen-search-code/ 蓝屏代码查询器 – 找出蓝屏的元凶 11 文章标签: windows / 系统 / 蓝屏. 蓝屏代码查询器 ...

随机推荐

  1. 《HelloGitHub》第 107 期

    兴趣是最好的老师,HelloGitHub 让你对开源感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...

  2. crontab Do you want to retry the same edit? (y/n)

    crontab: installing new crontab "/tmp/crontab.tEoCzO":2: bad day-of-month errors in cronta ...

  3. 浅谈 C# 13 中的 params 集合

    前言 在 C# 13 中,params 的改进使其从可变数量的数组参数升级为可变数量的集合类型参数.这一改进通过支持高性能集合类型(如Span<T>,ReadOnlySpan<T&g ...

  4. arthas定位接口的耗时排查问题

    下载Arthas的jar包 https://arthas.aliyun.com/ 上传jar包到你的服务器启动 启动 arthas 在命令行下面执行(使用和目标进程一致的用户启动,否则可能 attac ...

  5. directory 用于数据泵 导入、导出创建的目录。

    1.查询directory目录 select * from dba_directories; 2.创建或者修改 directory目录 create or replace directory 目录名称 ...

  6. 【长知识】BIOS

    设置最新UEFI BIOS 本章导读 BIOS是电脑启动和操作的基础,若电脑系统中没有BIOS,则所有硬件设备都不能正常使用.UEFI是目前最新的BIOS类型,以后会逐渐取代传统的BIOS.本章将认识 ...

  7. harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)

    大家好!我是黑臂麒麟,一位6年的前端: if you're change the world, you're workingon important things. you're excited to ...

  8. X86-64位简易系统开发 - 从BIOS阶段开始

    最近回顾之前写的代码的时候, 发现了以前本科时还开发过一个64位的操作系统, 不过最终也只是开发到进程切换部分 这是一个涉及到汇编和C语言的一个偏底层偏硬核的项目, 而且为了能够学到更多东西, 使用的 ...

  9. 康谋分享 | aiSim5基于生成式AI扩大仿真测试范围(终)

    在前面的几章节中探讨了aiSim仿真合成数据的置信度,此外在场景重建和测试流程闭环的过程中,难免会面临3D场景制作重建耗时长.成本高.扩展性低以及交通状况复杂程度难以满意等问题,当前的主要挑战在于如何 ...

  10. VTK 入门系列之二:为三维场景添加坐标轴

    一.引言 在进行三维可视化开发时,我们常常希望能够清晰了解模型在空间中的位置.方向与比例关系.而最直观的辅助工具就是三维坐标轴(Axes).在 VTK 中,vtkAxesActor 提供了一种开箱即用 ...