我有GDB附加到用pthreads編寫的死鎖應用程序。有~10個線程全部被阻塞,我想知道哪些線程鎖定了哪些鎖。在使用SOS.dll的WinDbg中這是可能的;這在GDB中可能嗎?GDB可以顯示每個線程持有的pthread互斥量列表嗎?
3
A
回答
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 「)。
相關問題
- 1. 2個pthread條件變量可以共享相同的互斥量嗎?
- 2. POSIX線程退出而持有互斥
- 3. 使用帶有不同線程框架的pthread互斥體
- 4. windows中每個進程/線程的最大互斥量數
- 5. pthread互斥鎖兩個線程互鎖鎖定/解鎖是否有效?
- 6. 每個gdb實例有可能有一個線程嗎?
- 7. boost線程互斥陣列
- 8. pthread互斥體在共享內存中是否可以跨線程工作?
- 9. Pthread互斥VS Solaris中
- 10. 提升互斥量和線程數
- 11. 函數可以鎖定互斥鎖嗎?
- 12. 使用互斥鎖的pthread同步
- 13. 哪裏解鎖pthread中的互斥?
- 14. 遞歸函數可以釋放它自己的互斥量嗎?
- 15. SQLite多線程互斥體
- 16. Pthread互斥鎖斷言失敗
- 17. PThread互斥不作爲希望
- 18. 關於pthread互斥使用情況
- 19. 如何確保每個線程共享的互斥量平均爲
- 20. GDB可以殺死一個特定的線程嗎?
- 21. 健壯的pthread互斥鎖 - 跨平臺的可移植性
- 22. 一個互斥對比多個互斥。哪一個更適合線程池?
- 23. 一個線程可以同時持有兩個鎖嗎?
- 24. 每個線程有多個NSManagedObjectContext實例可以嗎?
- 25. 從單個工作線程更新全局變量:我需要互斥鎖嗎?
- 26. procexp如何關閉另一個進程持有的互斥鎖?
- 27. Dreamweaver可以顯示變量,函數,類的列表嗎?
- 28. 使用互斥鎖從多個線程併發訪問向量
- 29. 有史以來最簡單的互斥體。這個例子工作嗎?它是線程安全的嗎?
- 30. WPF互斥列表框