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