2016-07-27 70 views
2

我在多線程的linux進程中調試一個問題,其中某個線程似乎不會執行幾秒鐘。查看strace輸出顯示它等待futex例如
1673109 14:36:28.600329 futex的(0x44b8d20,FUTEX_WAIT_PRIVATE,
1673109 14:36:33.221850 < ... futex的恢復>)= 0 < 4.621514>如何調試strace中顯示的futex爭用?

我如何找出什麼這個futex的(0x44b8d20 )是指在用戶空間中,即如何將其映射到內部使用futex的鎖定結構。

回答

1

我會使用一個簡單的systemtap腳本,這樣可以幫助您快速找到爭用futex鎖的地址。當我說的地址,我指的是futex的系統調用的第一個參數:

http://man7.org/linux/man-pages/man2/futex.2.html

  1. 在這裏,您可以下載的認定爭用戶空間鎖了簡單的系統龍頭腳本:

https://sourceware.org/systemtap/examples/process/futexes.stp

所以如果你的系統上安裝了systemtap,只需啓動這個系統的tap腳本:stap futexes.stp

  1. 捕捉strace輸出,就像你之前做過的一樣。

  2. 如果您通過簡單地按Ctrl-C來結束系統觸碰腳本執行,您將獲得爭用futexes的輸出。

  3. 最後,在strace輸出中搜索其中第二個參數(操作類型)爲FUTEX_WAIT的futex調用。例如:

futex的(0x7f58a31999d0,FUTEX_WAIT,4508,NULL)= 0

然後可以搜索在系統抽頭腳本輸出的第一個參數。當我做了一個快速的測試,在這裏你會找到相應的系統抽頭輸出:

青梅[4489]鎖0x7f58a31999d0爭1次,7807平均我們

如果你看一下這個系統龍頭腳本,它很好地爲您打印進程名稱和進程/線程ID,從而可以輕鬆找到要查找的內容。 但是需要注意的是,執行systemtap腳本實際上會掛鉤系統調用系統。

+0

這真的很聰明,但不幸的是我使用的是OS X.感謝你的帖子,我現在已經開始調查使用DTrace和Ruby探測器了。這絕對是我以前從未想過探索的一種途徑。 – Reck