2011-03-18 76 views
2

這是我以前的問題Application crash with no explanation的擴展。查找堆腐敗

我有很多被推測在應用服務器上造成堆損壞崩潰。這些崩潰只發生在生產中;他們不能在測試環境中複製。

我正在尋找一種方法來追蹤這些崩潰。

應用程序驗證建議,這將是罰款,但它是不可用的與我們的生產服務器。當我們嘗試使用應用程序驗證程序在生產環境中啓動它時,即使這是一個相當強大的服務器(64位應用程序,16 GB內存,8個處理器),它變得非常緩慢以至於完全無法使用。在沒有應用程序驗證程序的情況下運行它,它僅使用大約1 GB的內存,並且不超過任何處理器週期的10-15%。

是否有任何其他工具,這將有助於找到堆損壞,而不增加巨大的開銷?

回答

3

使用Microsoft運行時庫的調試版本。打開紅色分區並通過在初始化期間調用_CrtSetDbgFlag()一次,每128次(比如說)堆操作就自動檢查堆。

_CRTDBG_DELAY_FREE_MEM_DF可以查找內存使用,釋放後的錯誤是非常有用的,但在使用它堆大小monitonically增長。

+0

這是一個很好的開始。我已經使用它一起使用Microsoft的應用程序驗證程序,並能夠找到我正面臨的錯誤。 – 2012-11-28 19:56:19

1

會不會有在運行它的虛擬化,並採取計劃的快照任何好處,讓你希望可以得到一個快照只是一點點,它實際上崩潰過嗎?然後採取預碰撞快照並在實驗室環境中啓動它。如果您可以讓它再次崩潰,請重新啓動快照並開始檢查您的服務器進程。

+1

沒有機會。這個崩潰在時間上並不一致,它完全是隨機的。服務器可以在2小時到2周內運行,而不會發生這種情況。即使我們在崩潰前有一個快照,它也不會幫助我們找到發生堆損壞的地方。我們可以在發生崩潰時創建一個完整的過程轉儲,但它沒用。 – 2011-03-18 14:31:27

+0

只要你能找到一種方法來拍攝自動快照,讓它運行2周,如果這是需要的? – 2011-03-18 14:39:30

+0

我不認爲你明白,快照是完全沒用的。堆損壞已經發生。我需要趕上它,並找到它發生的地方。 – 2011-03-18 14:49:08

-1

Mudflap與海灣合作委員會。它爲生產代碼編寫測試代碼。
你必須用-fmudflap編譯你的軟件。它會檢查任何錯誤的指針訪問(堆/堆棧/靜態)。它被設計用於生產代碼,稍微放緩(在x1.5到x5之間)。您也可以在讀訪問時禁用檢查以加速。

+0

此代碼使用Visual Studio編譯並在Windows上運行。它大量使用winapi。 – 2011-03-24 17:59:43

+0

...............太差 – log0 2011-03-24 21:16:23