陈小羊

导航

gdb调试之死锁

1、top命令查看进程ID

 

 2、gdb   pstack 进程ID

查看是否有相关的栈信息,并且进入trace模式

 

 3、thread apply all bt 查看所有线程的back trace信息;

 

查看所有等待锁的线程,找到最早的一个线程

 

 

 在代码中找到对应的位置找到对应等锁的函数,查看具体是哪个锁,这里是线程71 

 

 

 然后进入线程71,查看bt信息

 

然后从backtrace中可以看出这里是第7步 的函数在等待锁,使用f 7进入第七步。然后【p lockName】查看该锁被哪个线程所拥有。

 

看到owner = 1562,那么这里是LWP = 1562的线程持锁。

 

 回到thread  apply all bt的日志信息中,找到对应的线程bt信息

 

 这里可以看到是在哪块代码中,这里是在暂停任务中,条件锁的wait条件不满足导致的。这里的条件锁是另一个锁,searchMtx_与上面的锁不是同一个。

这里再次使用同样的方法进入到线程79中,然后查看bt信息,进入到对应函数f 3步骤,然后观察这个锁 searchMtx_被哪个线程持有。

 

 观察到,这里的owner 不正常,负数可能是随机值。说明这里的锁并没有被其他线程持有,那么这里死锁的原因并不是环形锁,而是条件锁的条件未满足唤醒notify

 

posted on 2020-07-18 13:05  陈小羊  阅读(3232)  评论(0编辑  收藏  举报