嵌入式 GDB調試死鎖示例
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
死鎖:一種情形,此時執行程序中兩個或多個線程發生永久堵塞(等待),每個線程都在等待被
其他線程占用并堵塞了的資源。例如,如果線程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)加鎖(擁有)的。 找出死鎖的地方,對應檢查代碼就可以了。死鎖大多是對鎖的使用發生交叉所致的,解決死鎖的方法常有:有序資源分配法
<span style="font-family:Courier New;font-size:12px;">是操作系統中預防死鎖的一種算法,這種算法資源按某種規則系統中的所有資源統一編號(例如打印機為1、磁帶機為2、磁盤為3、等等),申請時必須以上升的次序。 系統要求申請進程: 1、對它所必須使用的而且屬于同一類的所有資源,必須一次申請完; 2、在申請不同類資源時,必須按各類設備的編號依次申請。 例如:進程PA,使用資源的順序是R1,R2; 進程PB,使用資源的順序是R2,R1; 若采用動態分配有可能形成環路條件,造成死鎖。 采用有序資源分配法:R1的編號為1,R2的編號為2; PA:申請次序應是:R1,R2 PB:申請次序應是:R1,R2 這樣就破壞了環路條件,避免了死鎖的發生。 另外,還有死鎖避免,死鎖檢測與恢復等。 </span>