记录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住,无法响应外界请求。