2011-08-04 9 views
9

我工作的軟件(使用C++編寫)目前存在堆損壞問題。我們的性能測試團隊在登錄到盒子的用戶數量達到某個閾值時仍然會收到WER錯誤,但他們給我的轉儲只是在不明顯的區域顯示損壞(例如,當std :: string釋放它的基礎內存時) 。查找只發生在性能測試下的堆損壞的最佳方式是什麼?

我試過使用AppApprifier,這確實引發了一些我現在修復的問題。然而,我現在處於這樣一種情況,即測試人員可以儘可能多地使用AppApprifier加載機器,並且運行乾淨,但在沒有AppApprifier的情況下運行時仍然會發生堆損壞(我想因爲他們可以在沒有其他用戶的情況下獲得更多用戶)。這意味着我一直無法獲得實際顯示問題的轉儲。

有沒有人有任何其他的想法,我可以使用有用的技術或技術?我已經做了儘可能多的分析,因爲我可以在堆腐敗轉儲沒有appverifier,但我看不到任何常見的主題。沒有任何線程在崩潰的同時做任何事情,而且崩潰的線程是無辜的,這使我認爲腐敗發生在前一段時間。

+0

任何機會,你的代碼是否可移植到* nix上?如果是這樣,啓動'valgrind'(或在Windows上找到類似的工具):通常第一個抱怨「無效讀取」或「無效寫入」是一個很好的暗示,因爲真正的錯誤在哪裏。 – ereOn

+0

啊,只要它是:-)我以前用過valgrind,它是一個很好的工具。 Appverifier通常也很方便,但在這種情況下,它並不適用於我:-( – Benj

+0

在另一個(有點類似)的問題上,我建議將電子圍欄移植到Windows上,它會在無數內存錯誤中故意對段進行故障排序,但我很不確定http://code.google.com/p/electric-fence-win32/ –

回答

6

最好的工具是AppFrifier與gFlags結合使用,但還有很多其他解決方案可能有所幫助。

例如,你可以指定一個堆檢查每16個的malloc,realloc的,免費的,_msize操作用下面的代碼:

#include <crtdbg.h> 
int main() 
{ 
int tmp; 

// Get the current bits 
tmp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); 

// Clear the upper 16 bits and OR in the desired freqency 
tmp = (tmp & 0x0000FFFF) | _CRTDBG_CHECK_EVERY_16_DF; 

// Set the new bits 
_CrtSetDbgFlag(tmp); 
} 
+0

嗯,有趣。之前沒有看到過這種方法。 – Benj

+0

我猜這隻適用於CRT內存功能,如malloc/free?我猜測任何使用VirtualAlloc甚至HeapAlloc的東西都不會被檢查。 – Benj

+0

你說得對。它是通過堆構建的,它不知道像HeapAlloc或VirtualAlloc這樣的「本機」調用 – cprogrammer

3

你有我的同情心:一個非常難以追查的問題。正如你所說的那樣,這些通常是在崩潰前一段時間發生的,通常是由於行爲不當(例如,寫入已刪除的內存,運行數組末尾,超過memcpy中分配的內存等) 。我已經使用堆檢查工具(valgrind,purify,intel inspector),但正如你所觀察到的,這些經常會影響性能,從而掩蓋了錯誤。 (您不會說它是一個多線程應用程序,還是處理諸如傳入消息的可變數據集)。

我也重載了新的和刪除操作符來檢測雙刪除,但這是一個相當特殊的情況。

如果沒有可用的工具幫助,那麼你就是你自己的,它將是一個漫長的調試過程。 這個我可以提供的最好的建議是努力減少將重現它的測試場景。然後嘗試減少正在執行的代碼量,即刪除部分功能。最終你們會解決問題,但我已經看到很多好的人花費了6周或更長的時間在大型應用程序(大約150萬個LOC)上追蹤這些問題。

一切順利。

+0

該應用程序確實是多線程的,男孩是否有很多線程。它本質上是一個代理進程,它在終端服務盒上爲每個會話啓動,因此從理論上講,更多的用戶並不意味着更多的負載,而是更少的可用資源。這顯然是導致問題的某種類型的併發問題,可能是某個對象的生命週期不正確,並且內存正在寫入已釋放或某些內存中。哼哼... – Benj

0

您應該進一步闡述你的軟件實際上沒有。它是多線程的嗎?當您談論「登錄到該框的用戶數量」時,每個用戶是否會在不同的會話中打開不同的軟件實例?您的軟件是一項Web服務嗎?實例是否與對方交談(如使用命名管道)?

如果您的錯誤只發生在高負載下,並且在AppVerifier運行時不會發生。我能想到的唯一兩種可能性(沒有更多信息)是一個併發問題,它與您如何實現多線程相關,或者測試機器有一個硬件問題,只在重負載下出現(讓您的測試人員使用多臺機器?)。

相關問題