您现在的位置是:首页 > 正文

windbg定位死锁问题

2024-04-01 05:54:11阅读 1

操作系统对死锁的描述如下:

所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。   

那么为什么会产生死锁呢?

1.因为系统资源不足。

2.进程运行推进的顺序不合适。   

3.资源分配不当。            

而产生死锁的条件有四个:

1.互斥条件:所谓互斥就是进程在某一时间内独占资源。

2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。

4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

 

1)  先用!locks查看所有的线程占用的锁

 

 

这里可以看到有三个线程正在等待三个锁,第一个线程等待的锁是0043a620,但被5e4这条线程占用,第二个线程等待的锁是0043a844,但被5dc线程占用,

第三个线程等待的锁是031d40d4,也被5e4线程占用。

2)接着,我们需要查看5e4线程和5dc线程的id,具体可以通过查看工具栏中Processes and Threads,如下图所示,5e4的线程的id为53,5dc线程的id为51。

 

3)分别输入~53kb和~51kb查看这个两个线程的调用栈,结果如下图所示

 

由数据可知,5e4线程正在等待一把0043a844的锁,而5dc线程也正在等待锁0043a620。

4)结合第一步获取的信息可知,5e4线程要去获取已经被5dc占用的锁0043a844,而5dc又要去获取已经被5e4占用的锁0043a620,如此形成环路,就产生了死锁

 

 

 

以上几步就是分析死锁的几个关键步骤

 

参考学习资料:

http://blog.csdn.net/hgy413/article/details/7572097

网站文章