2010-11-23 114 views
2

我在我的一個c應用程序(它是一個大代碼)中面臨死鎖,並且我能夠調試打印互斥鎖的階段。它看起來像下面 -使用pthread互斥鎖(linux)調試死鎖

  {__data = 
       {__lock = 2, 
       __count = 0, 
       __owner = 15805, 
       __nusers = 1, 
       __kind = 0, 
       __spins = 0, 
       __list = {__prev = 0x0, __next = 0x0} 
       }, 
      __size = "\002\000\000\000\000\000\000\000½=\000\000\001", '\0' <repeats 26 times>, 
      __align = 2 
     } 

現在我能明白,__owner是線程持有這個互斥體的線程ID,同一線程對這個互斥結束死鎖。有沒有人知道其他領域的意義,如_ 鎖, _count,__自旋等可能有用的調試死鎖?任何提示/技巧也會受到歡迎? (基於調試,我明白的線程試圖鎖定它已經擁有的互斥鎖,結束在死鎖,也是其他線程都爲這個互斥鎖)

也可以找出哪一行代碼有這通過調試器(gdb)觀察進程/線程鎖定(當然,調試信息和代碼在手),而不需要仔細的代碼遍歷代碼?我已經通過了我的代碼幾次,但無法找到這個鎖在從函數返回之前未釋放的位置。

由於 書呆子

回答

-1

的其它字段不能用於調試死鎖特別有用。重要的信息是你已經找到的 - 線程是死鎖的,因爲它鎖定了一個已經被自己鎖定的互斥鎖。

要用gdb進行調試,可以在感興趣的線程鎖定該互斥鎖的每一行處設置斷點。每次觸發斷點時,只需繼續執行。當發生死鎖時,最近的以前的鎖定操作顯然是沒有相應解鎖的。