我需要使用Valgrind來檢測服務器應用程序中發生的任何內存訪問衝突。服務器創建許多線程。我懷疑有一個競賽條件導致服務器每隔1小時左右崩潰。我們使用Valgrind來分析其內存使用情況,但服務器進程的速度急劇下降。服務器的速度下降很多,幾乎沒有可用性,沒有可能的賽車條件。如何與我們的流程並行運行Valgrind,以便其性能不會降低太多?
有沒有辦法與我們的應用程序並行運行Valgrind,所以我們不會失去那麼多的性能?
我需要使用Valgrind來檢測服務器應用程序中發生的任何內存訪問衝突。服務器創建許多線程。我懷疑有一個競賽條件導致服務器每隔1小時左右崩潰。我們使用Valgrind來分析其內存使用情況,但服務器進程的速度急劇下降。服務器的速度下降很多,幾乎沒有可用性,沒有可能的賽車條件。如何與我們的流程並行運行Valgrind,以便其性能不會降低太多?
有沒有辦法與我們的應用程序並行運行Valgrind,所以我們不會失去那麼多的性能?
這不是直接回答您的問題,但是如果您懷疑同步錯誤,您是否嘗試過使用Valgrind工具Helgrind?
你不能那樣做。 Valgrind本質上並不實際執行你的代碼,而是在模擬器中運行它。這就是爲什麼它如此緩慢。所以,沒有辦法讓它跑得更快,並且仍然可以得到Valgrind的好處。
最好的辦法是設置ulimit
,以便程序在崩潰時生成核心文件。然後,您可以通過檢查覈心來設法解決問題。
+1,我正要給出幾乎相同的答案。 – 2009-09-27 15:55:27
Valgrind通過掛接到你的malloc調用中工作,所以你可以期望你的程序在valgrind下運行得更慢。所以,我會說,你不能在valgrind 和得到分析內存錯誤的好處時更快地運行你的程序。
因爲我不是專業的Valgrind用戶,所以我之前並不知道Helgrind。我今天才知道。我懷疑是一個對象正在被刪除,但另一個線程正試圖訪問它,並導致進程崩潰。這很可能是因爲該應用程序編碼非常差。我會嘗試Helgrind,看看它能提供什麼。 – 2009-09-27 19:11:18