Chinaunix首页 | 论坛 | 博客
  • 博客访问: 337769
  • 博文数量: 45
  • 博客积分: 15
  • 博客等级: 民兵
  • 技术积分: 111
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-31 12:31
文章分类

全部博文(45)

文章存档

2015年(2)

2014年(19)

2013年(14)

2012年(10)

我的朋友

分类: LINUX

2013-08-28 23:24:29

原文地址:gdb 查看死锁 作者:asteriskchina

死锁:一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被  
其他线程占用并堵塞了的资源。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。

gdb调试死锁的方法:
gdb 
attach pid
thread apply all bt

找到_lll_lock_wait 锁等待的地方。
然后查找该锁被哪个线程锁住了。
例如:

查看哪个线程拥有互斥体
(gdb) print AccountA_mutex
$1 = {__m_reserved = 2, __m_count = 0, __m_owner = 0x2527,
__m_kind = 0, __m_lock
= {__status = 1, __spinlock = 0}}
(gdb) print 0x2527
$2 = 9511
(gdb) print AccountB_mutex
$3 = {__m_reserved = 2, __m_count = 0, __m_owner = 0x2529,
__m_kind = 0, __m_lock = {__status = 1, __spinlock = 0}}
(gdb) print 0x2529
$4 = 9513
(gdb)
从上面的命令中,我们可以看出AccontA_mutex是被线程 5(LWP 9511)加锁(拥有)的,而AccontB_mutex是被线程 3(LWP 9513)加锁(拥有)的。

找出死锁的地方,对应检查代码就可以了。死锁大多是对锁的使用发生交叉所致的,解决死锁的方法常有:

有序资源分配法

银行算法

阅读(3721) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~