gdb如何调试“锁”相关得程序?

发布于 2022-07-23 22:28:51 字数 165 浏览 31 评论 6

问题:
在gdb调试中,发现某线程中的函数在
pthread_mutex_lock((pthread_mutex_t *) mylock)的时候会阻塞,因工程太大,且是别人的代码,有点无从下手,现在我想用gdb或别得方法来确定是哪个函数在占用这个锁,请问有什么办法?

谢谢各位!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

醉梦枕江山 2022-07-26 13:30:55

解决死锁的方法:
1. 认真审查代码,看看lock与unlock是否配对,特别要看看return之前是否忘记了unlock了
2. 可以通过在上锁前、上锁后以及解锁后进行打印或者写日志文件(推荐),来查找死锁的位置。这个时候,计数器是个很好的选择。
3. 看看是否滥用了Linux系统的信号,信号也可能导致死锁。

风吹过旳痕迹 2022-07-26 12:32:36

呵呵,谢谢各位,找到死锁的位置&原因了!
还是安心的看看代码比较管用啊!

北笙凉宸 2022-07-26 10:25:13

不要想着什么都用 gdb 来调试。
printf 有时候是最有效的做法。
推荐 printf 或者 syslog 或者 debug counter

最佳男配角 2022-07-26 02:55:39

谢谢楼上两位,我看了一下阻塞前pthread_mutex_lock()的调用返回错误号,是:Illegal seek!
不解是什么意思啊?是该锁已经被别的线程占用?

噩梦成真你也成魔 2022-07-26 00:33:08

而且调试会影响线程的调度,多半情况无法重现运行时出现的 bug 。

死锁问题必须靠加锁习惯和文档解决。。

缘字诀 2022-07-25 23:36:23

线程用GDB好像不太行
再现锁的竞争状态非常难

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文