2009-09-27 17 views
5

我需要使用Valgrind來檢測服務器應用程序中發生的任何內存訪問衝突。服務器創建許多線程。我懷疑有一個競賽條件導致服務器每隔1小時左右崩潰。我們使用Valgrind來分析其內存使用情況,但服務器進程的速度急劇下降。服務器的速度下降很多,幾乎沒有可用性,沒有可能的賽車條件。如何與我們的流程並行運行Valgrind,以便其性能不會降低太多?

有沒有辦法與我們的應用程序並行運行Valgrind,所以我們不會失去那麼多的性能?

回答

5

值得注意的是,Valgrind雖然支持多線程程序,但如果您有多核可用,它並不會實際運行程序的線程。它還以比本地OS調度程序更細的粒度交錯線程。這兩個事實相結合可能會使它具有競爭條件或其他併發異常的程序行爲會有所不同。

您可能需要嘗試Helgrind,這是一種主要用於檢測正確鎖定規則的工具,而drd是一種主要用於檢測數據競爭的工具。

1

這不是直接回答您的問題,但是如果您懷疑同步錯誤,您是否嘗試過使用Valgrind工具Helgrind

+0

因爲我不是專業的Valgrind用戶,所以我之前並不知道Helgrind。我今天才知道。我懷疑是一個對象正在被刪除,但另一個線程正試圖訪問它,並導致進程崩潰。這很可能是因爲該應用程序編碼非常差。我會嘗試Helgrind,看看它能提供什麼。 – 2009-09-27 19:11:18

9

你不能那樣做。 Valgrind本質上並不實際執行你的代碼,而是在模擬器中運行它。這就是爲什麼它如此緩慢。所以,沒有辦法讓它跑得更快,並且仍然可以得到Valgrind的好處。

最好的辦法是設置ulimit,以便程序在崩潰時生成核心文件。然後,您可以通過檢查覈心來設法解決問題。

+1

+1,我正要給出幾乎相同的答案。 – 2009-09-27 15:55:27

0

Valgrind通過掛接到你的malloc調用中工作,所以你可以期望你的程序在valgrind下運行得更慢。所以,我會說,你不能在valgrind 得到分析內存錯誤的好處時更快地運行你的程序。