gdb 檢視死鎖
阿新 • • 發佈:2019-01-05
死鎖:一種情形,此時執行程式中兩個或多個執行緒發生永久堵塞(等待),每個執行緒都在等待被
其他執行緒佔用並堵塞了的資源。例如,如果執行緒A鎖住了記錄1並等待記錄2,而執行緒B鎖住了記錄2並等待記錄1,這樣兩個執行緒就發生了死鎖現象。
gdb除錯死鎖的方法:
gdb
attach pid
thread apply all bt
找到_lll_lock_wait 鎖等待的地方。
然後查詢該鎖被哪個執行緒鎖住了。
例如:
檢視哪個執行緒擁有互斥體
(gdb) print AccountA_mutex
$1 = {__m_reserved = 2, __m_count = 0, __m_owner = 0x2527,
__m_kind = 0, __m_lock
= {__status = 1, __spinlock = 0}}
(gdb) print 0x2527
$2 = 9511
(gdb) print AccountB_mutex
$3 = {__m_reserved = 2, __m_count = 0, __m_owner = 0x2529,
__m_kind = 0, __m_lock = {__status = 1, __spinlock = 0}}
(gdb) print 0x2529
$4 = 9513
(gdb)
從上面的命令中,我們可以看出AccontA_mutex是被執行緒 5(LWP 9511)加鎖(擁有)的,而AccontB_mutex是被執行緒 3(LWP 9513)加鎖(擁有)的。
找出死鎖的地方,對應檢查程式碼就可以了。死鎖大多是對鎖的使用發生交叉所致的,解決死鎖的方法常有:
有序資源分配法