2010-10-21 56 views

回答

3

這不是你應該問的GDB,而是你正在使用的特定pthread庫和操作系統。

pthread庫通過一些系統調用與內核配合實現互斥鎖。如果它的互斥鎖的實現嵌入了一些東西,以將持有該互斥體的最後一個線程綁定到互斥體數據結構中,那麼可以使用GDB來獲取該信息。

您的內核可能會跟蹤該信息。例如,在Mac OS X中,與內核調試工具包kgmacros捆綁在一起的GDB腳本集合包含一個命令showallmtx,該命令將完全按照您的需要進行操作。問題是:要使用它,必須在當時調試機器的內核,這意味着您需要使用不同的機器進行調試。

當然,你可能有一個/dev/kmem設備文件,它可以讓你在內核的內存中查找並訪問必要的數據結構,只要你能找到它。

但是,這一切都取決於您的系統 - 您的pthread庫和操作系統內核 - 不在GDB上。

你也可以嘗試創建一個類型爲PTHREAD_MUTEX_ERRORCHECK的互斥體;這將導致pthread_mutex_lock()返回EDEADLK而不是死鎖。然後,您可以在發生這種情況時中斷並根源於非死鎖進程。

2

GDB 可能能夠顯示這些信息,但他們並沒有實現這樣的功能:它需要調試器和線程庫之間的合作,雖然libthread_db庫。在Solaris下

DBX - 至少 - (!都來自太陽,它可以幫助)正確地實現了這個feature(尋找部分)

4

在Linux中的至少一種味道,C + +11 std :: mutex有一個名爲__owner的成員,它包含當前鎖定互斥鎖的線程的線程ID。使用gdb中的「info threads」顯示gdb使用的線程號以及線程標識符(請參閱「LWP」編號),允許您切換到該線程(「線程N」),然後檢查調用棧(「backtrace 「)。