0

0

c# 如何用WinDbg分析.NET程序的死锁和线程堆栈

煙雲

煙雲

发布时间:2026-01-07 02:05:18

|

192人浏览过

|

来源于php中文网

原创

WinDbg不能直接标出“此处发生死锁”,但能通过!syncblk、!threads、~*e !clrstack等命令精准定位阻塞线程、锁持有者及同步原语状态,需结合堆栈与对象引用交叉分析。

c# 如何用windbg分析.net程序的死锁和线程堆栈

WinDbg 能否直接分析 .NET 死锁?

不能直接标出“此处发生死锁”,但能精准定位阻塞线程、锁持有者和同步原语状态。关键靠 !syncblk!dlk(仅限 .NET Framework)和线程堆交叉比对。

注意:!dlk 在 .NET Core / .NET 5+ 中不可用,必须改用 !threads + ~*e !clrstack + 手动识别 Monitor.EnterWaitHandle.WaitOnelock 对应的 IL 或 JIT 后调用点。

抓取和加载正确的内存转储

死锁发生时进程仍在运行但无响应,推荐用 procdump -ma -e 1 -w 捕获;若已挂起,用任务管理器“创建转储文件”或 dotnet-dump collect -p (.NET Core+)。

加载转储后,先确认符号路径和 .NET 运行时版本:

.symfix
.sympath+ C:\symbols
.loadby sos clr    // .NET Framework
.loadby sos coreclr  // .NET Core / .NET 5+
!peb

常见错误:符号未加载导致 !clrstack 显示 UNKNOWN;SOS 加载错版本(如用 clr 加载 .NET 6 进程)会报 Failed to load data access DLL

定位阻塞线程和锁竞争点

执行 ~*e !clrstack 查看所有托管线程调用栈,重点关注含以下模式的线程:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

下载
  • System.Threading.Monitor.EnterObject.Wait 卡在 ntdll!NtWaitForMultipleObjectscoreclr!WaitForMultipleObjectsEx
  • System.Threading.WaitHandle.WaitOne 后无后续调用
  • 重复出现相同锁对象地址(如 0x000001a2f8c4d038)在多个线程栈中

再用 !syncblk 查锁状态:

!syncblk

输出中关注 IndexSyncBlockThreadObject 列。若某 Object 地址被多个线程列为 WAITING,而只有一个线程显示 OWNED 且其栈停在 Monitor.Enter 或类似位置,基本就是死锁源头。

.NET Core / .NET 5+ 下替代 !dlk 的实操技巧

没有 !dlk 不代表没法查——重点是快速筛选可疑线程并比对锁对象引用:

  • ~*e !dumpstack -EE 快速过滤只含托管调用的线程(排除纯 native 线程)
  • 对每个疑似阻塞线程,执行 !dso(dump stack objects),找最近的 System.Object 实例地址,记下它
  • !do 看该对象是否为 Monitor 关联对象(类型通常为业务类,但可结合源码确认)
  • !dumpheap -type 列出所有同类锁实例,再用 !gcroot 看谁在引用它

真正耗时的不是命令本身,而是把三四个线程的 !clrstack + !dso + !do 结果横向对照——漏掉一个持有锁却没卡住的线程,就可能误判。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

380

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

566

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

380

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

566

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

476

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

57

2025.12.01

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

322

2023.10.09

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

380

2023.10.16

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号