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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM