windbg 经典死锁调试
代码
// Deadlock_Debug.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "windows.h"
#include <process.h> // All the thread must get all of critial_section
// Classic Deadlock CRITICAL_SECTION gCritSecFirst;
CRITICAL_SECTION gCritSecSecond;
CRITICAL_SECTION gCritSecThird; unsigned __stdcall Thread1Func(void* dummy)
{
printf("Enter Thread 1 \n");
EnterCriticalSection(&gCritSecThird);
{
Sleep();
EnterCriticalSection(&gCritSecFirst);
EnterCriticalSection(&gCritSecSecond);
LeaveCriticalSection(&gCritSecSecond);
LeaveCriticalSection(&gCritSecFirst);
}
LeaveCriticalSection(&gCritSecThird);
printf("Exit thread func 1 \n");
return ;
} unsigned __stdcall Thread2Func(void* dummy)
{
printf("Enter Thread 2 \n");
EnterCriticalSection(&gCritSecFirst);
EnterCriticalSection(&gCritSecSecond);
{
Sleep();
EnterCriticalSection(&gCritSecThird);
Sleep();
LeaveCriticalSection(&gCritSecThird);
}
LeaveCriticalSection(&gCritSecSecond);
LeaveCriticalSection(&gCritSecFirst);
printf("Exit thread func 2 \n");
return ;
} int _tmain(int argc, _TCHAR* argv[])
{
unsigned threadID;
InitializeCriticalSection(&gCritSecFirst);
InitializeCriticalSection(&gCritSecSecond);
InitializeCriticalSection(&gCritSecThird); _beginthreadex( NULL, , &Thread1Func, NULL, , &threadID );
_beginthreadex( NULL, , &Thread2Func, NULL, , &threadID );
while();
return ;
}
这是一个经典死锁,开启两个线程,一个以123的次序拿锁,一个以321次序拿锁,互相等待着对方的锁而均不释放自己手中的锁。(此处锁也指CriticalSection)
开启WINDBG 附加死锁进程,查看
0:003> ~* kv 0 Id: 2b8.2f0 Suspend: 1 Teb: 7ffdf000 Unfrozen
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
0012ff6c 0042e346 00000001 003c30b8 003c3168 Deadlock_Debug+0x2d85c
0012ffb8 0042e21f 0012fff0 7c816d4f 0007da50 Deadlock_Debug+0x2e346
0012ffc0 7c816d4f 0007da50 7c92e1fe 7ffd9000 Deadlock_Debug+0x2e21f
0012fff0 00000000 0042b523 00000000 78746341 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo]) 1 Id: 2b8.1e0 Suspend: 1 Teb: 7ffde000 Unfrozen
ChildEBP RetAddr Args to Child
0059fe00 7c92e9c0 7c93901b 00000030 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
0059fe04 7c93901b 00000030 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc (FPO: [3,0,0])
0059fe8c 7c92104b 004944f0 0042d5e0 004944f0 ntdll!RtlpWaitForCriticalSection+0x132 (FPO: [1,26,4])
0059fe94 0042d5e0 004944f0 57565554 5b5a5958 ntdll!RtlEnterCriticalSection+0x46 (FPO: [1,0,0])
WARNING: Stack unwind information not available. Following frames may be wrong.
0059ff6c 0042e123 00000000 2d7b25f9 57565554 Deadlock_Debug+0x2d5e0
0059ffa8 0042e094 00000000 0059ffec 7c80b50b Deadlock_Debug+0x2e123
0059ffb4 7c80b50b 003c2c20 57565554 5b5a5958 Deadlock_Debug+0x2e094
0059ffec 00000000 0042dff0 003c2c20 00000000 kernel32!BaseThreadStart+0x37 (FPO: [Non-Fpo]) 2 Id: 2b8.1e4 Suspend: 1 Teb: 7ffdd000 Unfrozen
ChildEBP RetAddr Args to Child
0069fe00 7c92e9c0 7c93901b 00000034 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
0069fe04 7c93901b 00000034 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc (FPO: [3,0,0])
0069fe8c 7c92104b 004944c0 0042d714 004944c0 ntdll!RtlpWaitForCriticalSection+0x132 (FPO: [1,26,4])
0069fe94 0042d714 004944c0 57565554 5b5a5958 ntdll!RtlEnterCriticalSection+0x46 (FPO: [1,0,0])
WARNING: Stack unwind information not available. Following frames may be wrong.
0069ff6c 0042e123 00000000 2d4b25f9 57565554 Deadlock_Debug+0x2d714
0069ffa8 0042e094 00000000 0069ffec 7c80b50b Deadlock_Debug+0x2e123
0069ffb4 7c80b50b 003c2e60 57565554 5b5a5958 Deadlock_Debug+0x2e094
0069ffec 00000000 0042dff0 003c2e60 00000000 kernel32!BaseThreadStart+0x37 (FPO: [Non-Fpo]) # 3 Id: 2b8.948 Suspend: 1 Teb: 7ffdc000 Unfrozen
ChildEBP RetAddr Args to Child
0038ffc8 7c9707a8 00000005 00000004 00000001 ntdll!DbgBreakPoint (FPO: [0,0,0])
0038fff4 00000000 00000000 00000000 00000000 ntdll!DbgUiRemoteBreakin+0x2d (FPO: [Non-Fpo]) ////////////////////////////////////////////////////
在切换到线程2 1进行观察 可以看到均是在等待CriticalSection
0:003> ~2 kv
ChildEBP RetAddr Args to Child
0069fe00 7c92e9c0 7c93901b 00000034 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
0069fe04 7c93901b 00000034 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc (FPO: [3,0,0])
0069fe8c 7c92104b 004944c0 0042d714 004944c0 ntdll!RtlpWaitForCriticalSection+0x132 (FPO: [1,26,4])
0069fe94 0042d714 004944c0 57565554 5b5a5958 ntdll!RtlEnterCriticalSection+0x46 (FPO: [1,0,0] 0:003> ~1 kv
ChildEBP RetAddr Args to Child
0059fe00 7c92e9c0 7c93901b 00000030 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
0059fe04 7c93901b 00000030 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc (FPO: [3,0,0])
0059fe8c 7c92104b 004944f0 0042d5e0 004944f0 ntdll!RtlpWaitForCriticalSection+0x132 (FPO: [1,26,4])
0059fe94 0042d5e0 004944f0 57565554 5b5a5958 ntdll!RtlEnterCriticalSection+0x46 (FPO: [1,0,0])
//////////////////////////////////////////////
使用!LOCKS指令查看当前的锁
0:003> !locks CritSec Deadlock_Debug+944f0 at 004944f0
LockCount 1
RecursionCount 1
OwningThread 1e4
EntryCount 1
ContentionCount 1
*** Locked CritSec Deadlock_Debug+944d8 at 004944d8
LockCount 0
RecursionCount 1
OwningThread 1e4
EntryCount 0
ContentionCount 0
*** Locked CritSec Deadlock_Debug+944c0 at 004944c0
LockCount 1
RecursionCount 1
OwningThread 1e0
EntryCount 1
ContentionCount 1
*** Locked
比对线程等待的锁 及个锁的拥有者和锁定情况变可以判断
线程编号1e4 也就是线程2 等待004944c0 的锁(根据堆栈的RtlEnterCriticalSection函数部分查看)
0069fe94 0042d714 004944c0 57565554 5b5a5958 ntdll!RtlEnterCriticalSection+0x46 (FPO: [1,0,0])
而004844c0的锁由线程编号1e0 就是线程1持有
而线程编号1e0 就是线程1 等待004944f0 的锁 该所有线程编号1e4持有
0059fe94 0042d5e0 004944f0 57565554 5b5a5958 ntdll!RtlEnterCriticalSection+0x46 (FPO: [1,0,0])
死锁!!!
找到原因就好修正了。
windbg 经典死锁调试的更多相关文章
- Windbg在软件调试中的应用
Windbg在软件调试中的应用 Windbg是微软提供的一款免费的,专门针对Windows应用程序的调试工具.借助于Windbg, 我们常见的软件问题:软件异常,死锁,内存泄漏等,就可以进行高效的排查 ...
- VS 2013驱动开发 + Windbg + VM双机调试(亲测+详解)
------------VS 2013驱动开发 + Windbg + VM双机调试(亲测+详解)------------- WIN10已上线,随之而来的是VS2015:微软在 "WDK760 ...
- Windbg驱动双机调试环境配置
[由于进入了Windows驱动编程领域第一步就是搭建环境,整个环境来说说难也不难,只是比较麻烦.文章有些地方比较繁琐的,而且别人写的比较好,作为引用参考直接贴连接了.如果你按照我写的一步步完成,很快就 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(四)---VirtualKD内核调试加速工具
原文发表于百度空间,2009-01-09========================================================================== 今天又想起 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(一)---Windbg的设置
原文发表于百度空间,2009-01-08========================================================================== Windb ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(二)---Vmware及GuestOS的设置
原文发表于百度空间,2009-01-08========================================================================== 这一篇是主 ...
- Windbg源码调试
Windbg提供比VS2008丰富很多的调试命令,尤其是调试多线程程序. 今天试着怎么使用源代码方式调试.为了说明调试命令,<C++标准库>一书里的例子做示范. // testcast.c ...
- JAVA并发,经典死锁案例-哲学家就餐
转自:http://blog.csdn.net/tayanxunhua/article/details/38691005 死锁经典案例:哲学家就餐. 这个案例会导致死锁. 通过修改<Java编程 ...
- windbg蓝屏调试
一般在写Windows内核程序的时候,经常会出现蓝屏的问题,这个时候一般是采用记录下dump文件然后用windbg查看得方式,具体的过程就不说了,网上一大堆的内容.现在我主要记录自己当初按照网上的方案 ...
随机推荐
- bzoj5049: 导航系统
Description 小Q来到了一个随机的国度.这个国度由n座城市和m条双向道路构成.因为这个国度崇尚随机,因此m条边是用随机 选择两端点的方式生成的.充满好奇的小Q想在这里进行k次随机的旅行,每次 ...
- 前端-JavaScript1-3——JavaScript之字面量
字面量?????? 字面量:英语叫做literals,有些书上叫做直接量.看见什么,它就是什么. 我们先来学习数字的字面量,和字符串的字面量.剩余的字面量类型,我们日后遇见再介绍. 3.1 数字的字面 ...
- 学习笔记之scikit-learn
scikit-learn: machine learning in Python — scikit-learn 0.20.0 documentation https://scikit-learn.or ...
- centos7安装 owncloud注意事项
要关于selinux 用来存放文件的目录权限要修改 chown -R apache:apache my.cnf里的binlog_format=mixed前面的注释去掉,不然报mysql错!
- 验证Textbox的字符长度
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { ) { //Indi ...
- Java 泛型的作用及其基本概念
一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...
- Eclipse Debug不能热部署解决
摘要: Eclipse Debug不能热部署代码may be out-of-synch 问题描述:Project通过ant工具编译部署到JBoss下,在使用Eclipse远程调试功... ...
- Hive表中的NULL值处理
1 MySQL 到 Hive 表的sqoop任务把 原本的NULL 变成字符串 ‘null’ 了 alter table ${table_name} SET SERDEPROPERTIES('seri ...
- kettle实现同构单表增量同步
job如下: 如下转换:获取区服列表,将id列表保存到结果(内存) job: 同构数据库单表抽取(每个输入执行一次) 同构数据库单表抽取(job) 的具体实现如下: 转换:获取数据库连接ID 从结果获 ...
- js 模拟css3 动画
<html> <head> <title> javaScript缓动入门 </title> </head> <body> < ...