2016-04-12 42 views
0

我們在啓動時遇到Windows C++應用程序崩潰。當前只發生在我們的win 8.1機器上(其他開發機器是windows 7),並且只發生在發佈版本上。堆棧跟蹤每次都有點不同,但總是與內存分配有關,所以它可能是堆損壞問題。由於競爭條件導致的堆損壞 - 應用程序放慢時不會發生。如何調試?

的問題是,一旦應用程序變慢了一點,不會發生崩潰:

  • 調試版本不死機。

  • 如果發佈構建應用程序與調試crt(靜態或動態)鏈接,則不會發生崩潰,因此CRT調試堆不能用於跟蹤問題。

  • 如果應用程序驗證掛到應用程序,並選擇「堆」的測試,該應用程序不會崩潰。

  • 運行通過「Dr.Memory」的應用也導致崩盤不會發生。

在所有這些情況下崩潰不會發生,應用程序略有放緩,尤其是啓動確實需要更長的時間,所以我的假設是,它引起的競爭條件堆損壞。

如果我們不能使用CRT調試堆或緩慢執行應用程序的工具(因爲它不會崩潰),那麼追蹤堆損壞情況的好方法是什麼?

回答

0

你描述的可能預示着你的SW具有與被定時sensetive動態內存的問題的行爲。我只推薦使用動態數據分配或引用動態分配數據的代碼審查。特別是,來自stl的容器,通過new/malloc或類似方法分配的任何其他對象。可能在第一輪中,您可以找到不同線程之間共享的所有這些變量,並分析是否:

  1. 變量在首次使用之前被初始化。
  2. 物體的壽命比它們的使用壽命長。對於這意味着數據,它不應該在分配之前和釋放之後使用。
  3. 這些變量受到保護,防止從不同線程同時讀取/寫入。
  4. 邏輯讀寫序列確保在變量尚未被任何人寫入的情況下讀取變量是安全的。

如果沒有找到,執行一些靜態代碼分析(即LINT或類似的),並分析所有的compiller警告,如果你有任何。

更新:只是多了一個可能性,你可以重新定義你自己的內存分配給一些頭部和尾部保護區加入到分配的內存和每個呼叫監控模式是否未損壞的。一旦發生,您至少可以轉儲數據,並與callstack一起確定首先受腐敗影響的SW中的位置。那麼分析範圍將大大減少。但是不要忘記,這也可能改變時機,所以腐敗不會發生。