记录windbg调试临界区死锁问题

1、准备工作

设置windbg的符号路径:C:\Symbols; SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols

打开windbg,"File"-->"attach to a process...",附加到要调试的进程上,执行命令".dump /ma c:\test.dmp",产生dump文件

2、"File"-->"Open Crash Dump...",打开dump文件,执行命令"!analyze -v -hang",产生以下信息

3、由此可以判断进程在等待某个临界区,再次执行命令"!locks",查看所有的线程占用的锁情况

可以看出线程ce84占用临界区000000013f1b0378,线程c724占用临界区000000013f1b03a0

4、切换到线程ce84,"~~[ce84]s",查看该线程的函数调用栈情况,"kb",并执行"!cs" 扩展显示临界区(critical section)信息

可以看到线程ce84在等待临界区000000013f1b03a0,而临界区000000013f1b03a0被线程c724占用。

5、切换到线程c724,"~~[c724]s",查看该线程的函数调用栈情况,"kb"

可以看到线程c724在等待临界区000000013f1b0378,而临界区000000013f1b0378被线程ce84占用。

上述两种情况,就是线程c724在等待临界区000000013f1b0378,被线程ce84拥有,线程ce84在等待临界区000000013f1b03a0,被线程c724拥有。

从而产生死锁现象,表现为进程hang住,无法响应外界请求。

猜你喜欢

转载自www.cnblogs.com/pro-love/p/10936029.html
今日推荐