c++ - Heisenbug:WinApi程序在某些電腦上崩潰




6 Answers

所以配置是DEBUG配置時它不會崩潰? 有許多不同於RELEASE的配置:1.)全局初始化2.)實際機器代碼生成等。

所以,第一步是找出在RELEASE模式下,與DEBUG模式相比,每個參數的確切設置。

-廣告

請幫忙! 我真的在我的智慧結束。 我的程序是一個小小的個人筆記管理器(谷歌“cintanotes”)。 在某些計算機上(當然,我也沒有)在啟動之後,它會崩潰,出現未處理的異常。 這些電腦沒什麼特別的可以說,只是他們往往有AMD CPU。

環境:Windows XP,Visual C ++ 2005/2008,原始WinApi。

以下是關於這個“Heisenbug”的確定:

1)崩潰只發生在版本。

2)一旦我刪除所有GDI相關的東西,崩潰就消失了。

3)BoundChecker沒有抱怨。

4)寫一個日誌表明崩潰發生在一個本地int變量的聲明上! 那怎麼可能? 內存損壞?

任何想法將不勝感激!

更新:我已經設法讓應用程序在“錯誤”的PC上調試。 結果:

“在CintaNotes.exe 0x0044a26a未處理的異常:0xC000001D:非法指令”。

和代碼中斷

0044A26A cvtsi2sd xmm1,dword ptr [esp + 14h]

所以問題出現在“代碼生成/啟用增強指令集”編譯器選項中。 它被設置為“/ arch:SSE2”,並在不支持SSE2的機器上崩潰。 我已經將此選項設置為“未設置”,錯誤消失了。 唷!

非常感謝您的幫助!




1)崩潰只發生在版本。

這通常表示您依賴於某些無法保證的行為,但在調試版本中恰好如此。 例如,如果您忘記初始化您的變量,或者訪問數組越界。 確保你打開了所有的編譯器檢查(/ RTCsuc)。 還要根據函數參數的評估順序(這是不能保證的)進行檢查。

2)一旦我刪除所有GDI相關的東西,崩潰就消失了。

也許這意味著你在做與GDI相關的東西有問題? 例如,你是否在使用HANDLE之後釋放它們?




大多數heisenbugs /只發布錯誤是由於控制流程取決於從未初始化的內存/舊指針/緩存結束或競爭條件,或兩者的讀取。

嘗試覆蓋你的分配器,以便在分配時將內存清零。 問題是否消失(或變得更加可重現?)

寫一個日誌顯示崩潰發生在本地int變量的聲明上! 那怎麼可能? 內存損壞?

堆棧溢出! ;)




崩潰是什麼意思? 訪問違規? 異常? 這將是解決這個問題的進一步線索

確保您使用PageHeap.exe沒有前面的內存損壞

確保你沒有堆棧溢出(CBig數組[1000000])

確保您沒有未初始化的內存。

進一步,您可以在調試器內部運行發行版本,一旦您為進程生成調試符號(與創建調試版本不同)。 逐步查看您是否在調試器跟踪窗口中收到任何警告。




當我得到這種類型的東西時,我嘗試通過Gimpels PC-Lint(靜態代碼分析)運行代碼,因為它檢查BoundsChecker的不同類錯誤。 如果您正在使用Boundschecker,請打開內存中毒選項。

你提到AMD CPU。 你有沒有調查是否有類似的顯卡/驅動程序版本和/或配置在崩潰的機器上? 它總是會在這些機器上崩潰,或偶爾會崩潰? 也許在這些機器上運行系統信息工具,看看他們有什麼共同點,




試試Rational(IBM)PurifyPlus。 它捕獲了BoundsChecker沒有的許多錯誤。




Related