调试死锁问题

今天遇到了一个应用程序死锁了,由于是在测试人员的环境中,所以生成了一个dump文件,生成dump文件的方法可以用任务管理器,在任务管理器的进程列表中点击右键,选择“Create Dump File”,就会为该进程生成一个mini dump文件。

由于是自己的程序,所以一般进程对应的pdb文件和源代码文件都有。下面以visual studio 2010和windbg分别说明如何定位到死锁代码。

(1)windbg方法。

因为我们猜测该程序死锁了,所以用windbg打开dump文件,同时设置符号路径,执行步骤

第一步:执行命令!locks

结果如下:

0:000> !locks

CritSec +13a8e18 at 00000000013a8e18

WaiterWoken        No

LockCount          9

RecursionCount     1

OwningThread       f34

EntryCount         0

ContentionCount    9

*** Locked

Scanned 31 critical sections

请注意 Owning Thread f34和***Locked.表明线程f34在等待所。

第二步:执行~命令,结果如下:

0:000> ~

.  0  Id: 1614.16b8 Suspend: 0 Teb: 00007ff7`b4cbd000 Unfrozen

1  Id: 1614.ff0 Suspend: 0 Teb: 00007ff7`b4cb9000 Unfrozen

2  Id: 1614.a94 Suspend: 0 Teb: 00007ff7`b4cb7000 Unfrozen

3  Id: 1614.f34 Suspend: 0 Teb: 00007ff7`b4b8e000 Unfrozen

4  Id: 1614.1370 Suspend: 0 Teb: 00007ff7`b4b8c000 Unfrozen

5  Id: 1614.4ac Suspend: 0 Teb: 00007ff7`b4b8a000 Unfrozen

6  Id: 1614.1054 Suspend: 0 Teb: 00007ff7`b4b88000 Unfrozen

7  Id: 1614.76c Suspend: 0 Teb: 00007ff7`b4b86000 Unfrozen

8  Id: 1614.b70 Suspend: 0 Teb: 00007ff7`b4b84000 Unfrozen

9  Id: 1614.1ad0 Suspend: 0 Teb: 00007ff7`b4b80000 Unfrozen

10  Id: 1614.184c Suspend: 0 Teb: 00007ff7`b4cb5000 Unfrozen

11  Id: 1614.114c Suspend: 0 Teb: 00007ff7`b4cb3000 Unfrozen

12  Id: 1614.161c Suspend: 0 Teb: 00007ff7`b4b7e000 Unfrozen

13  Id: 1614.17b8 Suspend: 0 Teb: 00007ff7`b4cbb000 Unfrozen

14  Id: 1614.15c Suspend: 0 Teb: 00007ff7`b4b82000 Unfrozen

15  Id: 1614.1900 Suspend: 0 Teb: 00007ff7`b4b7c000 Unfrozen

16  Id: 1614.c6c Suspend: 0 Teb: 00007ff7`b4b7a000 Unfrozen

17  Id: 1614.17cc Suspend: 0 Teb: 00007ff7`b4b78000 Unfrozen

找到f34线程的编码为3

第三步:执行命令 ~3 kb查看3号线程堆栈,结果如下:

0:000> ~3 kb

RetAddr           : Args to Child                                                           : Call Site

00007ffa`ab1c1148 : 00000000`01551080 00000000`00010100 ffffffff`fffffffe 00000000`00000000 : ntdll!ZwWaitForSingleObject+0xa

00007ffa`a63c6ea0 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000344 : KERNELBASE!WaitForSingleObjectEx+0x94

果然在等待锁。

这就找到了死锁位置,但是往往并不是仅仅因为这里代码的问题,而是还有另外一个地方在使用锁不正确导致的。

2)用visual studio 2010

第一步:和windbg方法一样,打开dump文件,配置符号路径,通常还需要load系统库的符号,因为默认没有系统库文件的调试符号。

第二步:vc中并没有像windbg那样的命令!locks来显示锁的情况,只能靠自己分析了。但是也提供了一个很不错的方法,点击“debug"菜单,选择”窗口“子菜单,再选择”parallel stacks“菜单,会显示所有的线程及其堆栈,如同windbg的~* kb命令一样,非常有用。如图所示:

第三步:慢慢分析,看看哪些线程在等待锁,和windbg一样,也可以很快发现死锁的位置。



时间: 2024-10-12 07:54:29

调试死锁问题的相关文章

SQL Server Profiler -- 调试死锁

SQL Server Profiler -- 调试死锁 跟踪一般的异常很简单,但处理死锁很难,死锁的消息号为1205,严重度为13.从服务器无法得到足够的数据来帮助判断到底发生了什么及为什么会发生这种状况,甚至服务器返回的错误消息也没有价值,这种消息所提供的唯一建议就是可以"重新运行该事务". SQL跟踪有提供帮助隔离和调试死锁状态的工具,但是SQL Server 2005把这些工具提升到了一个新的层次,它提供了一个非常有用的图形界面,帮助用户解决这些难以应付的问题.为了阐明到底提供了

gdb多线程调试

死锁:一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被 其他线程占用并堵塞了的资源.例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象. gdb调试死锁的方法: gdb attach pid thread apply all bt 找到_lll_lock_wait 锁等待的地方. 然后查找该锁被哪个线程锁住了. 例如: 查看哪个线程拥有互斥体 (gdb) print AccountA_mutex $1 = {__

windbg命令详解

DLL 该扩展仅在内核模式下使用,即使它是在Ext.dll中的. Windows NT 4.0 Ext.dll Windows 2000 Ext.dll Windows XP和之后 Ext.dll 注释 如果不提供参数,调试器会列出所有进程,以及时间和优先级统计.这和使用!process @#Process 0 作为CommandString值一样. To terminate execution at any point, press CTRL+BREAK (in WinDbg) or CTRL

通往WinDbg的捷径

通往WinDbg的捷径(一) 原文:http://www.debuginfo.com/articles/easywindbg.html译者:arhat时间:2006年4月13日关键词:CDB WinDbg 导言你钟情什么样的调试器?如果你问我这个问题,我会回答是“Visual Studio + WinDbg”.我比较喜欢Visual Studio那朴实无华且易操作的接口,更喜欢它能迅速把我需要的信息以可视的形式展示出来.但遗憾的是,Visual Studio调试器无法获取某些信息.例如,假设我想

Sql學習資源

http://blog.csdn.net/wltica/article/category/1324738/1 SQL Server 整体方案系列: 1. SQL Server 数据归档方案 2. SQL Server 高可用方案 32. BLOB 数据存储方案 51. 数据库置疑处理文档 52. 数据库紧急恢复文档 -------------------------------------------------------------------------------------------

ubuntu 上使用valgrind

Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析.你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete.使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,使得你的程序更加稳固. Valgrind的主要功能 Valgrind工具包包含多个工具,如Memcheck,Cachegrind,He

Effective minidump

Effective minidump (上) 原文更新: 07.02.2005 翻译:2011/7/16 目录 简介 Minidump 类型 MiniDumpCallback函数 用户数据流 Dump类型 其他 例子程序 简介 在过去几年里,崩溃转储(crash dump)成为了调试工作的一个重要部分.如果软件在客户现场或者测试实验室发生故障,最有价值的解决方式是能够创建一个故障瞬间的应用程序状态镜像,然后可以在开发者的机器上通过调试器进行分析.第一代的crash dump通常被称为"全用户转储

Windows下获取Dump文件以及进程下各线程调用栈的方法总结(转)

1. Dump文件的用途 Dump文件, 主要用于诊断一个进程的运行状态,尤其是碰到崩溃(Crash)或者挂起(hang)不响应时,需要分析它的工作状态.  除了平时常见的attach到这个进程, 分析Dump文件就成了一个重要的手段了. 相信一些做软件维护和支持的工程师在这方面深有体会, 比如某天某时,客户说, 呀, 糟糕, 服务器进程挂掉了, 怎么回事? 然后,看看了日志文件,也没有什么可用的信息.  技术支持告诉他, 按某步骤生成一个dump文件来看看...... 2. 如何生成Dump文

Java SE 6 新特性: JMX 与系统管理

Java SE 6 新特性: JMX 与系统管理 2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Mustang 在性能方面有了不错的提升.与 Tiger 在 API 库方面的大幅度加强相比,虽然 Mustang 在 API 库方面的新特性显得不太多,但是也提供了许多实用和方便的功能:在脚本,WebService,XML,编译器 API,数据库,JMX,网