WinDbg定位死锁问题

news2024/11/20 19:26:52

文章目录

  • 方法1
  • 方法2
  • 方法3

方法1

1、首先确认下是哪个进程出现死锁的情况,如界面卡死、点击没有反应等,抓取对应进程的dump
2、查看是否存在

0:000> kv
ChildEBP RetAddr  Args to Child             
0019f3b8 77736b0c 77722253 00000108 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
0019f3bc 77722253 00000108 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc (FPO: [3,0,0])
0019f420 77722137 00000000 00000000 00000001 ntdll!RtlpWaitOnCriticalSection+0x13e (FPO: [Non-Fpo])
0019f448 777504a0 777c8340 774893be 00000000 ntdll!RtlEnterCriticalSection+0x150 (FPO: [Non-Fpo])
0019f480 759e7b43 00000001 00000000 0019f4a8 ntdll!LdrLockLoaderLock+0xe4 (FPO: [Non-Fpo])
0019f4cc 6e723027 6e6f0000 0019f4e4 00000104 KERNELBASE!GetModuleFileNameW+0x75 (FPO: [Non-Fpo])
...

3、从上面看线程在等待一个临界区,使用!cs进行分析

0:000> !cs 777c8340
-----------------------------------------
Critical section   = 0x777c8340 (ntdll!LdrpLoaderLock+0x0)
DebugInfo          = 0x777c8540
LOCKED
LockCount          = 0x15
WaiterWoken        = No
OwningThread       = 0x00001a40
RecursionCount     = 0x1
LockSemaphore      = 0x108
SpinCount          = 0x00000000

4、可以看出0号线程等待的是ntdll!LdrpLoaderLock 锁,再看下这个锁被哪个线程占用了

0:000> ~~[0x00001a40]
  30  Id: 1c14.1a40 Suspend: 1 Teb: 7ff8d000 Unfrozen
      Start: CloudEngine!CreateCloudEngineLocker+0x2561 (702db4f0)
      Priority: -2  Priority class: 32  Affinity: f

5、从上面看该锁被30号线程占用,然后再来分析30号线程的状态

0:000> ~30 kv
ChildEBP RetAddr  Args to Child             
0c8ed9f8 77736b0c 77722253 00000bf4 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
0c8ed9fc 77722253 00000bf4 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc (FPO: [3,0,0])
0c8eda60 77722137 00000000 00000000 00000000 ntdll!RtlpWaitOnCriticalSection+0x13e (FPO: [Non-Fpo])
0c8eda88 753b2fa0 753c4060 00000000 0bcf70bc ntdll!RtlEnterCriticalSection+0x150 (FPO: [Non-Fpo])
0c8edab0 753b2de2 0b8a5b84 00000000 0bcf70b8 bcrypt!LoadProvider+0x32 (FPO: [Non-Fpo])
0c8edb04 6dc79472 0c8edb24 6dc794a0 00000000 bcrypt!BCryptOpenAlgorithmProvider+0x12c (FPO: [Non-Fpo])
0c8edb28 7764c167 6dcc055c 0c8edb50 6dc1ce76 msxml3!AutoInitSalt::AutoInitSalt+0x1f (FPO: [Non-Fpo])
0c8edb34 6dc1ce76 6dc1cea4 6dc1cf10 00000001 msvcrt!_initterm+0x13 (FPO: [Non-Fpo])
0c8edb50 6dbf1594 6dbf0000 00000000 00000000 msxml3!_CRT_INIT+0xc3 (FPO: [Non-Fpo])
0c8edbb0 6dc19709 6dbf0000 00000001 00000000 msxml3!_CRT_INIT+0x22a (FPO: [Non-Fpo])
0c8edbcc 77748cc8 6dbf0000 00000001 00000000 msxml3!InitDllMain+0x8e (FPO: [Non-Fpo])
...

6、从上面看,30号线程也在等待一个临界区,该临界区被41号线程占用

0:030> !cs 753c4060
-----------------------------------------
Critical section   = 0x753c4060 (bcrypt!g_csLoaderLock+0x0)
DebugInfo          = 0x0b8c1b20
LOCKED
LockCount          = 0x2
WaiterWoken        = No
OwningThread       = 0x00000398
RecursionCount     = 0x1
LockSemaphore      = 0xBF4
SpinCount          = 0x00000000
 
 
0:030> ~~[0x00000398]
  41  Id: 1c14.398 Suspend: 1 Teb: 7ff82000 Unfrozen
      Start: cloudsec3!C360EngTaskMgr::_threadProc (6dfafb90)
      Priority: 0  Priority class: 32  Affinity: f

7、看下41号线程

0:030> ~41 kv
ChildEBP RetAddr  Args to Child             
0df3bfac 77736b0c 77722253 00000108 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
0df3bfb0 77722253 00000108 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc (FPO: [3,0,0])
0df3c014 77722137 00000000 00000000 0df3c07c ntdll!RtlpWaitOnCriticalSection+0x13e (FPO: [Non-Fpo])
0df3c03c 7774fd17 777c8340 7aa2a7e6 753b2738 ntdll!RtlEnterCriticalSection+0x150 (FPO: [Non-Fpo])
0df3c0d8 77752563 74f50000 0df3c114 00000000 ntdll!LdrGetProcedureAddressEx+0x159 (FPO: [Non-Fpo])
0df3c0f4 759e6d18 74f50000 0df3c114 00000000 ntdll!LdrGetProcedureAddress+0x18 (FPO: [Non-Fpo])
0df3c11c 753b26c5 74f50000 753b2738 092e1dac KERNELBASE!GetProcAddress+0x44 (FPO: [Non-Fpo])
0df3c130 753b2fce 74f50000 092e1dac 00000000 bcrypt!_LoadInterface+0x77 (FPO: [Non-Fpo])
0df3c164 753b2de2 092e1dac 00000000 0bcf7018 bcrypt!LoadProvider+0x76 (FPO: [Non-Fpo])
0df3c1b8 75b1ada1 0df3c214 758cc800 00000000 bcrypt!BCryptOpenAlgorithmProvider+0x12c (FPO: [Non-Fpo])
0df3c234 75b184e4 0b8093c0 00000006 75b180fc wintrust!SIPObjectPE_::DigestFile+0x6a (FPO: [Non-Fpo])
0df3c264 75b1b471 75b161c8 0df3c3b4 08cdb278 wintrust!SIPObject_::CreateIndirectData+0x11a (FPO: [Non-Fpo])
0df3c2a4 75b18158 0df3c338 0df3c3b4 08cdb278 wintrust!SIPObjectPE_::CreateIndirectData+0x5d (FPO: [Non-Fpo])
0df3c2c4 758db43a 0df3c338 0df3c3b4 08cdb278 wintrust!InboxCryptSIPCreateIndirectData+0x4e (FPO: [Non-Fpo])
0df3c318 75b32f33 0df3c338 0df3c3b4 08cdb278 crypt32!CryptSIPCreateIndirectData+0x63 (FPO: [Non-Fpo])
0df3c3cc 75b18719 75b18728 00000770 0df3c61c wintrust!_CatAdminCalcHashFromFileHandle+0x14f (FPO: [Non-Fpo])
0df3c3e8 73d5087a 00000770 0df3c61c 0df3c408 wintrust!CryptCATAdminCalcHashFromFileHandle+0x1c (FPO: [Non-Fpo])
...

8、看出41号线程也在等待一个临界区

0:041> !cs 777c8340
-----------------------------------------
Critical section   = 0x777c8340 (ntdll!LdrpLoaderLock+0x0)
DebugInfo          = 0x777c8540
LOCKED
LockCount          = 0x15
WaiterWoken        = No
OwningThread       = 0x00001a40
RecursionCount     = 0x1
LockSemaphore      = 0x108
SpinCount          = 0x00000000
 
0:041> ~~[0x00001a40]
  30  Id: 1c14.1a40 Suspend: 1 Teb: 7ff8d000 Unfrozen
      Start: CloudEngine!CreateCloudEngineLocker+0x2561 (702db4f0)
      Priority: -2  Priority class: 32  Affinity: f

41号线程的要访问的临界区被30号线程占用,30号线程访问的临界区被41号线程占用,主线程要访问的临界区也被30号线程占用。
死锁发生在调用系统API时,猜测是系统的bug

方法2

1、首先确认下是哪个进程出现死锁的情况,如界面卡死、点击没有反应等,抓取对应进程的dump
2、执行!locks命令查看所有的线程占用的锁

CritSec xxx!AtqActiveContextList+a8 at 68629100
LockCount          2	——有多少个线程在等待这个临界区
RecursionCount     1
OwningThread       5b0
EntryCount         2
ContentionCount    2
*** Locked

这个线程等待的锁是68629100,被5b0线程占用
3、运行~列出所有线程的信息

   0  Id: 1054.f54 Suspend: 1 Teb: 7efdb000 Unfrozen
   1  Id: 1054.20c Suspend: 1 Teb: 7efd8000 Unfrozen
   2  Id: 1054.1048 Suspend: 1 Teb: 7efd5000 Unfrozen
   3  Id: 1054.104c Suspend: 1 Teb: 7ef9d000 Unfrozen
   4  Id: 1054.a58 Suspend: 1 Teb: 7ef9a000 Unfrozen
   5  Id: 1054.a60 Suspend: 1 Teb: 7ef97000 Unfrozen
   6  Id: 1054.ea4 Suspend: 1 Teb: 7ef94000 Unfrozen
   7  Id: 1054.3b4 Suspend: 1 Teb: 7ef91000 Unfrozen
   8  Id: 1054.494 Suspend: 1 Teb: 7ef8e000 Unfrozen
   9  Id: 1054.5b0 Suspend: 1 Teb: 7ef8b000 Unfrozen
  10  Id: 1054.1010 Suspend: 1 Teb: 7ef82000 Unfrozen
  11  Id: 1054.13f0 Suspend: 1 Teb: 7ef7f000 Unfrozen
  12  Id: 1054.13e8 Suspend: 1 Teb: 7ef7c000 Unfrozen
  13  Id: 1054.13cc Suspend: 1 Teb: 7ef79000 Unfrozen
  14  Id: 1054.13b8 Suspend: 1 Teb: 7ef76000 Unfrozen
  15  Id: 1054.a80 Suspend: 1 Teb: 7ef88000 Unfrozen
  16  Id: 1054.fcc Suspend: 1 Teb: 7ef85000 Unfrozen
  17  Id: 1054.e10 Suspend: 1 Teb: 7ef73000 Unfrozen
  18  Id: 1054.edc Suspend: 1 Teb: 7ef70000 Unfrozen
  19  Id: 1054.cbc Suspend: 1 Teb: 7ef6d000 Unfrozen
  20  Id: 1054.c2c Suspend: 1 Teb: 7ef6a000 Unfrozen
  21  Id: 1054.cc4 Suspend: 1 Teb: 7ef67000 Unfrozen
  22  Id: 1054.544 Suspend: 1 Teb: 7ef64000 Unfrozen
  23  Id: 1054.794 Suspend: 1 Teb: 7ef61000 Unfrozen
  24  Id: 1054.950 Suspend: 1 Teb: 7ef5e000 Unfrozen

Id: 前的数字是thread id,Id: 后的数字1054是process id,这里可知5b0对应的thread id是9
4、查看9的堆栈信息

9  id: 1054.5b0   Suspend: 0 Teb 7ef8b000 Unfrozen

ChildEBP RetAddr  Args to Child
014cfe64 77f6cc7b 00000460 00000000 00000000 ntdll!NtWaitForSingleObject+0xb
014cfed8 77f67456 0024e750 6833adb8 0024e750 ntdll!RtlpWaitForCriticalSection+0xaa
014cfee0 6833adb8 0024e750 80000000 01f21cb8 ntdll!RtlEnterCriticalSection+0x46
014cfef4 6833ad8f 01f21cb8 000a41f0 014cff20 xxx!DereferenceUserDataAndKill+0x24
014cff04 6833324a 01f21cb8 00000000 00000079 xxx!ProcessUserAsyncIoCompletion+0x2a
014cff20 68627260 01f21e0c 00000000 00000079 xxx!ProcessAtqCompletion+0x32
014cff40 686249a5 000a41f0 00000001 686290e8 xxx!I_TimeOutContext+0x87
014cff5c 68621ea7 00000000 00000001 0000001e xxx!AtqProcessTimeoutOfRequests_33+0x4f
014cff70 68621e66 68629148 000ad1b8 686230c0 xxx!I_AtqTimeOutWorker+0x30
014cff7c 686230c0 00000000 00000001 000c000a xxx!I_AtqTimeoutCompletion+0x38
014cffb8 77f04f2c 00000000 00000001 000c000a xxx!SchedulerThread_297+0x2f
00000001 000003e6 00000000 00000001 000c000a kernel32!BaseThreadStart+0x51

这里也可以通过windbg的View——Process and Threads的对应关系查找到对应的线程id

5、重复方法1的操作进行检查即可

方法3

1、确认出现死锁的进程
2、打开windows的任务管理器
3、选择性能项——打开左下角的资源监视器
资源监视器
4、找到死锁的进程,右键选择“分析等待链”,如果发生死锁的话,可以从这里获取到死锁的线程id信息,再综合dump去分析
分析等待链

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/918956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb-学习目录

技术栈介绍 文章目录 1.数据库:1.1 Mysql1.2 JDBC1.3 Maven1.4 Mybatis 2.前端2.1 HTMLCSSJS2.2 AjaxVueElementUI 3. Web核心3.1 TomcatHttpServlet3.2 RequestResponse3.3 JSP3.4 CookieSession3.5 FilterListener 1.数据库: 1.1 Mysql mysql&#…

HBase--技术文档--基本概念--《快速扫盲》

官网 Apache HBase – Apache HBase™ Home 阿里云hbase 云数据库HBase_大数据存储_订单风控_数据库-阿里云 云数据库 HBase-阿里云帮助中心 基本概念 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。它基于Hadoop,采用列式存储方式,可…

JAVA毕业设计095—基于Java+Springboot+Vue的酒店管理系统(源码+数据库)

基于JavaSpringbootVue的酒店管理系统(源码数据库)095 一、系统介绍 本系统前后端分离(网页端和app端都有) 本系统分为管理员、酒店管理员、酒店员工、用户四种角色(角色菜单可自行分配) 用户功能: 注册、登录、酒店搜索、酒店列表、酒店预订、我的收藏、我的订…

C语言刷题(15)

第一题 第二题 第三题 第四题 第五题 第六题 注意点 1.异或满足交换律 2.两个相同的数字异或之后为0 第七题

遭多家知名对冲基金大肆抛售,财务面临挑战,百度能重新起飞吗?

来源:猛兽财经 作者:猛兽财经 总结: (1)百度(BIDU)的“萝卜快跑”订单量在2023年第一季度增长了三倍多,在开放道路上提供了近66万次服务。 (2)百度的目标是提…

python 面向对象的属性,类方法,静态方法,实例方法的区别及用法详解

一. 前言 在Python的面向对象编程中,类属性和实例属性是两个不同的概念,它们在作用域和使用方式上有所区别。Python中的面向对象编程中有三种方法:实例方法、类方法和静态方法,它们之间的差异主要体现在参数传递和调用方式上。 …

【高危】WPS Office 远程代码执行漏洞(WPSSRC-2023-0701绕过) (MPS-qjky-hw9x)

zhi.oscs1024.com​​​​​ 漏洞类型代码注入发现时间2023-08-22漏洞等级高危MPS编号MPS-qjky-hw9xCVE编号-漏洞影响广度广 漏洞危害 OSCS 描述 WPS Office 软件是由金山办公软件股份有限公司自主研发的一款办公软件套装。 由于对 WPSSRC-2023-0701 的修复不充分,…

Hive面试自学版

1.什么是HIVE? Hive是由Facebook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。 Hive是一个基于Hadoop的数据仓库工具,可以将结构化数据文件映射为一张表,…

SpringBoot 2.7 集成 Netty 4 模拟服务端与客户端通讯入门教程

文章目录 1 摘要2 核心 Maven 依赖3 核心代码3.1 服务端事务处理器 (DemoNettyServerHandler)3.2 服务端连接类(InitNettyServer)3.3 客户端事务处理器(DemoNettyClientHandler)3.4 客户端连接类(DemoNettyClient) 4 测试4.1 测试流程4.2 测试结果4.3 测试结论 5 推荐参考资料6…

Datax、Datax-web 安装部署

Datax安装(Windows) 1、源码地址:GitHub - alibaba/DataX: DataX是阿里云DataWorks数据集成的开源版本。 2、下载安装包并解压(安装前需有jdk、python开发环境):https://github.com/alibaba/DataX/archiv…

游戏开发服务器选型的横向对比

来源一个某乎的作者,貌似来自台湾 上篇介绍了go版本的游戏服务器,这篇介绍下其它语言版本: SkynetkbengineNoahGameFramePomeloPinusET使用的语言C/LuaCCNodejsTypeScriptC#概述云风前辈开源的框架mmo框架server一个快速的、可扩展的、分布…

【Prometheus】概述及部署

目录 Prometheus 概述 Prometheus 的生态组件 Prometheus 的工作模式 Prometheus 的工作流程 Prometheus 的局限性 部署 Prometheus Prometheust Server 端安装和相关配置 部署 Exporters 监控 MySQL 配置示例 监控 Nginx 配置示例 部署 Grafana 进行展示 部署 Pro…

Java如何调用接口API并返回数据(两种方法)

Java如何调用接口API并返回数据(两种方法) java处理请求接口后返回的json数据-直接处理json字符串 处理思路: 将返回的数据接收到一个String对象中(有时候需要自己选择性的取舍接收) 再将string转换为JSONObject对象 …

Shiro学习总结

第一章 入门概述 1.概念 shiro是一个Java安全框架,可以完成:认证、授权、加密、会话管理、与web集成、缓存… 2.优势 ● 易于使用,构建简单 ● 功能全面 ● 灵活,可以在任何应用程序环境中工作,并且不需要依赖它们…

log4框架

1.log4cplus基本元素 Layouts :控制输出消息的格式。 Appenders :输出位置。 Logger :日志对象。 Priorities :优先权,包括TRACE, DEBUG, INFO, WARNING, ERROR, FATAL。 2.log4cplus基本结构 3. 使用步骤&am…

2023年7月最新道路矢量数据(全国/分省/分城市)

2023年7月最新道路矢量数据(全国/分省/分城市) 道路数据是我们在各项研究中经常使用的数据!道路数据虽然很常用,但是却基本没有能下载最近年份道路数据的网站,所以很多人不知道如何获到道路数据。 本次我们为大家推…

【80天学习完《深入理解计算机系统》】第九天 3.2 数据传送指令【mov】【栈和堆】【leaq】【一元操作】【二元操作】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

智慧充电桩物联网方案架构

智慧充电桩物联网采用“云-管-边-端”的边缘计算物联网架构,融合5G、AI、Wi-Fi 6等技术,实现充电基础设施由数字化向智能化演进。智慧充电桩物联网方案架构设计,如下图所示: 云端: 物联网平台具备广泛协议的南向接入…

.NET 最便捷的Log4Net日志记录器

最便捷的Log4Net使用方法 LOG4NET 配置日志记录器开始引用nuget LOG4NET 配置日志记录器 Apache log4net 库是一个帮助程序员将日志语句输出到各种的工具 的输出目标。log4net是优秀的Apachelog4j™框架的移植 Microsoft.NET 运行时。我们保持了与原始log4j相似的框架 同时利…

【javaweb】学习日记Day5 - 请求响应 分层解耦 IOC DI 三层架构

目录 一、请求响应 1、请求 (1)简单参数 ① GET请求 ② POST请求 ③ 假如形参与请求参数不一致 (2)实体参数 ① 简单实体对象 ② 复杂实体对象 (3)数组参数 (4)集合参数 …