2011-10-13 35 views
5

我想知道是否有工具,可以大量多線程應用程序的可視化多線程C++應用程序調用圖,多線程代碼覆蓋率的工具?

  • 幫助可視調用圖。
  • 具體而言,我想了解多個線程在一個內核上如何交錯/在多個內核上同時執行。
  • 該工具將理想地識別可能的等待/死鎖/競態條件。
  • 最終我想根據線程在運行時(多線程代碼覆蓋率工具)如何交互以便找到潛在的多線程錯誤來進行代碼覆蓋。

    我很抱歉,如果我沒有清楚解釋我的問題,我很樂意提供任何細節。

+0

祝你好運,我會關注一個合理的答案。我認爲你需要全面瞭解你正在分裂爲多個執行線程。有許多工具可用於剖析和製作執行圖(紅格蓋特的性能分析器,價格昂貴但很棒),但沒有具體細節,您可以在黑暗中拍攝。 – Justin

+0

@Justin啊我忘了提及我正在使用的應用程序是用C++編寫的。 – fantasticsid

+0

@fantasticid:我編輯了你的標題以反映你的興趣。 –

回答

1

英特爾的VTune Profiler可以做一些你所要求的。從使用VTune網站:

鎖定與等待:使用英特爾的性能分析工具來快速查找的性能降低的常見原因在並行程序:等待太久的鎖,而內核是等待過程中得到充分利用。

時間線可視化線程行爲:查看線程何時正在運行並等待以及何時發生轉換。

如果你正在尋找一些開源/免費的東西,那麼Valgrind有一個名爲Helgrind的實驗工具,它可以在多線程程序中找到競爭對手。我無法評論它,我沒有使用它。

我應該注意到,我還沒有成功地利用這些或其他分析器進行多線程調試和優化,而是我開發了自己的技術。

爲了識別鎖爭用,我的首選技術是使用一個擴展的Mutex類,它記錄在每個實例上完成的所有操作。我以一種非常輕量級的方式來做到這一點,以便應用程序性能不會發生很大變化。

爲了識別競爭條件,我發現蠻力方法最好。我只是設計一個可以長時間運行的測試,有時這是幾個小時或幾天,具體情況取決於具體情況。我總是在至少兩個不同的平臺上運行我的測試(如果可以的話),因爲不同的操作系統使用不同的調度程序,並且可以提供更好的覆蓋範圍。

1

雖然我對大多數問題都無能爲力,但我認爲我們的C++ Test Coverage工具可以輕鬆爲您提供多線程測試覆蓋率數據。

這個工具可以測試你的源代碼;你編譯並運行它。在代碼中代表不同塊的(廉價) 儀器探測器。儀器 記錄了程序的哪個部分執行,名義上是每個儀器探測一個 位的位向量。在執行結束時(或者只要你喜歡),這個位矢量會被捨棄,並且一個查看器會將它顯示給你,併疊加在代碼上。

獲得多線程測試覆蓋範圍的訣竅是知道我們爲您提供完整的 控制權來定義儀器探測器的工作方式;他們是宏。因此,而不是使用 基本上

probe[n]=true; 

默認的宏布爾陣列上,可以改爲一個int數組(或東西通過預先計算這個數值巧妙便宜)上實現

probe[n]|=1<<threadid; 

。 這可能只需要幾行代碼來實現。

人們可能會注意到這在技術上有同步問題。 確實如此,但最多隻會丟失覆蓋率數據的 ,並且與此相關的機率相當高。大多數人 對「相當不錯」的數據感到滿意,而非完美。如果您完全堅持 ,您將使用一些 原子更新指令支付較高的同步化價格。

我們還爲您提供了對探針轉儲邏輯的控制;您可以修改它以寫出 特定於線程的覆蓋數據(在自定義代碼範圍的幾十行中)。 測試覆蓋率數據查看器會讓您看到線程特定的覆蓋範圍 (只需選擇正確的覆蓋矢量);它也有內置的工具,可以很容易地計算/顯示覆蓋矢量上的十字路口/聯合/差異 ,它可以準確地給出你的每線程覆蓋率的關係。