gdb 查看死鎖

死鎖:一種情形,此時執行程序中兩個或多個線程發生永久堵塞(等待),每一個線程都在等待被  算法

其餘線程佔用並堵塞了的資源。例如,若是線程A鎖住了記錄1並等待記錄2,而線程B鎖住了記錄2並等待記錄1,這樣兩個線程就發生了死鎖現象。app

gdb調試死鎖的方法:spa

gdb 線程

attach pid調試

thread apply all bt資源

找到_lll_lock_wait 鎖等待的地方。it

而後查找該鎖被哪一個線程鎖住了。thread

例如:程序

查看哪一個線程擁有互斥體方法

(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)加鎖(擁有)的。

找出死鎖的地方,對應檢查代碼就能夠了。死鎖大可能是對鎖的使用發生交叉所致的,解決死鎖的方法常有:

有序資源分配法

銀行算法

相關文章
相關標籤/搜索