上一篇文章是使用lockcop软件检测死锁的。参考见:使用lockcop软件检测c++死锁_baidu_16370559的博客-CSDN博客
现在使用windbg。
可运行的程序和代码还是一样的。
1.配置symbols
因为我使用的windbg 版本是6.12 。提示Unable to resolve ntdll!RtlCriticalSectionList
因为在新版本的windbg中可能部分指令不支持。
如果有如下提示
NTSDEXTS: Unable to resolve ntdll!RtlCriticalSectionList
NTSDEXTS: Please check your symbols
解决方法:下载symbols
在File=>Symbol Path File 输入SRV*C:\Windows Sysmbols* http://msdl.microsoft.com/download/symbols
然后在命令框中输入.reload
2.直接双击运行测试程序memeroy.exe。windbug 操作 菜单file->attach to a process 操作连接到memeroy.exe。
3.先用!locks查看所有的线程占用的锁
这里可以看到有2个线程正在等待2个锁,第一个线程等待的锁是01056424,但被44f28这条线程占用,第二个线程等待的锁是010563f4,但被415b8线程占用.我们需要查看44f28线程和415b8线程的id,具体可以通过查看工具栏中Processes and Threads.结果见上图。
4.分别输入~3kb和~2kb查看这个两个线程的调用栈
由数据可知,44f28线程正在等待一把010563f4的锁,而415b8线程也正在等待锁01056424。
分析:结合第三步获取的信息可知,锁010563f4 是线程415b8 占用的,而锁01056424是线程44f28占用的,如此形成环路,就产生了死锁。