我會使用一個簡單的systemtap腳本,這樣可以幫助您快速找到爭用futex鎖的地址。當我說的地址,我指的是futex的系統調用的第一個參數:
http://man7.org/linux/man-pages/man2/futex.2.html
- 在這裏,您可以下載的認定爭用戶空間鎖了簡單的系統龍頭腳本:
https://sourceware.org/systemtap/examples/process/futexes.stp
所以如果你的系統上安裝了systemtap,只需啓動這個系統的tap腳本:stap futexes.stp
捕捉strace輸出,就像你之前做過的一樣。
如果您通過簡單地按Ctrl-C來結束系統觸碰腳本執行,您將獲得爭用futexes的輸出。
最後,在strace輸出中搜索其中第二個參數(操作類型)爲FUTEX_WAIT的futex調用。例如:
futex的(0x7f58a31999d0,FUTEX_WAIT,4508,NULL)= 0
然後可以搜索在系統抽頭腳本輸出的第一個參數。當我做了一個快速的測試,在這裏你會找到相應的系統抽頭輸出:
青梅[4489]鎖0x7f58a31999d0爭1次,7807平均我們
如果你看一下這個系統龍頭腳本,它很好地爲您打印進程名稱和進程/線程ID,從而可以輕鬆找到要查找的內容。 但是需要注意的是,執行systemtap腳本實際上會掛鉤系統調用系統。
這真的很聰明,但不幸的是我使用的是OS X.感謝你的帖子,我現在已經開始調查使用DTrace和Ruby探測器了。這絕對是我以前從未想過探索的一種途徑。 – Reck