免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6233 | 回复: 8
打印 上一主题 下一主题

请问,如何用GDB找出死锁位置 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-26 17:05 |只看该作者 |倒序浏览
高手指教

  程序运行1-2周,发现死锁(CPU利用率0%)

  请问用GDB如何找出死锁位置(不能杀程序)

高手指教

论坛徽章:
0
2 [报告]
发表于 2008-06-26 17:07 |只看该作者
gdb attach 上去
如果是多线程的
用gdb的如下命令查看:
info threads
thread id
bt
就能查看各个线程所处在的阻塞位置。

论坛徽章:
0
3 [报告]
发表于 2008-06-26 17:07 |只看该作者

自己顶一下

自己顶一下

论坛徽章:
0
4 [报告]
发表于 2008-06-26 17:10 |只看该作者
printf

论坛徽章:
0
5 [报告]
发表于 2008-06-26 17:12 |只看该作者
我是采用上述的步骤,但是在bt之后采用continue之后gdb僵死了,没办法只好采用killall gdb把gdb杀掉了,此时程序没有死,但是通过gdb -p attach上去后,在载入符号表时就挂掉了,此时有什么方法解决

论坛徽章:
0
6 [报告]
发表于 2008-06-26 17:23 |只看该作者
我将现象简单描述一下,程序是这样的,共有十几个线程,其中有两个线程用于数据收集,然后另外四个线程用于对收集的数据进行处理,收集线程和处理线程采用条件变量进行互斥同步,另有其他线程进行其他的处理,也有mutex变量,我比较怀疑是前面的收集线程和处理线程的同步问题。我采用gdb attach上去后,通过thread切换到不同线程,有的线程在sleep,有的线程在mutex_lock,有的在条件等待,我在continue之后再bt时,那些线程依然停留在那些位置,怎么样来区分这些线程是否已经执行了?应该没有执行的就是互锁了,因为程序是实时运行的。

论坛徽章:
0
7 [报告]
发表于 2008-06-26 17:25 |只看该作者
原帖由 LoveForLinux 于 2008-6-26 17:23 发表
我将现象简单描述一下,程序是这样的,共有十几个线程,其中有两个线程用于数据收集,然后另外四个线程用于对收集的数据进行处理,收集线程和处理线程采用条件变量进行互斥同步,另有其他线程进行其他的处理,也 ...

看线程停在哪行了~,然后去看代码~~,看有没有办法让死锁重现~

论坛徽章:
0
8 [报告]
发表于 2008-06-26 17:29 |只看该作者
原帖由 cugb_cat 于 2008-6-26 17:25 发表

看线程停在哪行了~,然后去看代码~~,看有没有办法让死锁重现~


我线程切换之后,采用ls查看代码时没用,不同的线程采用ls的位置都是一样的,另外死锁不好重现,是运行了相当长一段时间才出现的。

论坛徽章:
0
9 [报告]
发表于 2008-06-26 18:13 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP