问题:在gdb调试中,发现某线程中的函数在pthread_mutex_lock((pthread_mutex_t *) mylock)的时候会阻塞,因工程太大,且是别人的代码,有点无从下手,现在我想用gdb或别得方法来确定是哪个函数在占用这个锁,请问有什么办法?
谢谢各位!
解决死锁的方法:1. 认真审查代码,看看lock与unlock是否配对,特别要看看return之前是否忘记了unlock了2. 可以通过在上锁前、上锁后以及解锁后进行打印或者写日志文件(推荐),来查找死锁的位置。这个时候,计数器是个很好的选择。3. 看看是否滥用了Linux系统的信号,信号也可能导致死锁。
呵呵,谢谢各位,找到死锁的位置&原因了!还是安心的看看代码比较管用啊!
不要想着什么都用 gdb 来调试。printf 有时候是最有效的做法。推荐 printf 或者 syslog 或者 debug counter
谢谢楼上两位,我看了一下阻塞前pthread_mutex_lock()的调用返回错误号,是:Illegal seek!不解是什么意思啊?是该锁已经被别的线程占用?
而且调试会影响线程的调度,多半情况无法重现运行时出现的 bug 。
死锁问题必须靠加锁习惯和文档解决。。
线程用GDB好像不太行再现锁的竞争状态非常难
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(6)
解决死锁的方法:
1. 认真审查代码,看看lock与unlock是否配对,特别要看看return之前是否忘记了unlock了
2. 可以通过在上锁前、上锁后以及解锁后进行打印或者写日志文件(推荐),来查找死锁的位置。这个时候,计数器是个很好的选择。
3. 看看是否滥用了Linux系统的信号,信号也可能导致死锁。
呵呵,谢谢各位,找到死锁的位置&原因了!
还是安心的看看代码比较管用啊!
不要想着什么都用 gdb 来调试。
printf 有时候是最有效的做法。
推荐 printf 或者 syslog 或者 debug counter
谢谢楼上两位,我看了一下阻塞前pthread_mutex_lock()的调用返回错误号,是:Illegal seek!
不解是什么意思啊?是该锁已经被别的线程占用?
而且调试会影响线程的调度,多半情况无法重现运行时出现的 bug 。
死锁问题必须靠加锁习惯和文档解决。。
线程用GDB好像不太行
再现锁的竞争状态非常难