2012-05-25 58 views
1

我用MS VC++ 2010和GCC 4.2.1編寫了一個C++ CLI程序(對於Mac OS X 10.6 64位,在Eclipse中)。 該程序在GCC + OS X下運行良好,大部分時間在Windows下運行。但有時它會靜靜地凍結。命令行光標保持閃爍,但程序拒絕繼續工作。C++程序嚴重凍結

以下配置工作正常: 具有'Release'和'Debug'配置的GCC。 VC++ with'Debug'configuration

錯誤只發生在Win 7 32位和64位下配置'VC++'Release'配置'。不幸的是,這是我的客戶想要配置的配置;-(

我已經檢查了我的程序高低,並修復了所有的內存泄漏,但是這個錯誤仍然存​​在,你有什麼想法我怎麼能找到這個錯誤?

+1

您是否嘗試過將調試器附加到正在運行的應用程序?您仍然可以調試以「發佈」模式編譯的應用程序。這會讓你對代碼的哪一部分導致問題有所瞭解。對於我們來說,使用我們的水晶球進行遠程調試基本上是不可能的。 –

+1

看看[這個鏈接](http://www.flounder.com/debug_release.htm)。它討論了版本和調試版本之間的區別以及如何解決可能出現的許多問題。 – MikMik

+0

@Cody Gray:很好的建議。實際上,甚至不必在調試器中運行該程序/附加全功能調試器。僅可獲得例如堆疊跡線與SysInternals進程資源管理器在凍結點可能會提供一個合理的起點。 –

回答

1
  • 使用日誌記錄來縮小程序在崩潰時執行哪部分代碼。繼續添加日誌,直到您縮小到足以查看問題。
  • 在發佈版本(編譯器和鏈接器)中啓用調試信息;很多變量都不會正確顯示,但它至少應該給你一個明智的回溯(除非因堆棧砸碎或堆棧溢出而導致凍結),如果你保持功能簡短並且只做一件事,通常就足夠了。
  • 內存泄漏不能導致死機。其他形式的記憶濫用卻很可能發生。根據我的經驗,當緩衝區被釋放時,緩衝區經常會導致死機,因爲自由功能跟隨了損壞的區塊鏈。另外注意任何其他種類的未定義行爲。在C/C++中有很多它,它通常在調試時表現得如你所期望的那樣,並且在優化時是完全隨機的。
  • 嘗試構建並運行DUMA庫下的程序以檢查緩衝區溢出。儘管如此:
    • 它需要一個lot的內存。我的意思是簡單地多一千倍。所以你只能在簡單的情況下測試。
    • Microsoft標頭傾向於濫用其內部分配功能和不匹配,例如正常的malloc和內部的__debug_free(或其他方式)。因此,在重新定義函數之前,可能需要通過將這些系統頭文件包含到duma中來小心解決一些情況。
  • 嘗試構建Linux的程序並在Valgrind下運行該程序。除緩衝區溢出之外,這將檢查更多的問題,並且不會佔用太多內存(只是正常情況的兩倍,但速度較慢,大約爲20倍)。
1

調試版本通常初始化所有分配的內存(MSVC使用0xCD用調試配置填充它們)也許你的類中有一些未初始化的值,GCC配置和MSVC調試配置會得到一個「幸運」值,但在MSVC發佈它沒有。

這裏是the rest of the magic numbers used by MSVC

因此,尋找未初始化的變量,屬性和已分配的內存塊。

+0

這已經足夠了,但並不能真正解釋爲什麼帶有魔法值的「調試」版本*不會崩潰。填充哨兵值的目的是讓您更容易地調試問題。 「0xCD」實際上並不指向內存中的有效位置,所以如果出現這種問題,您仍然會遇到嚴重的故障。事實上,你*保證*得到一個,所以你可以調試它;這就是整個觀點。 –

+1

我們對代碼一無所知。這些指針可能會被正確初始化,但是一些標量並不是,並且假設您將它們用作數組的索引。它發生在我身上:) – wrock

+0

@CodyGray:沒有什麼能夠保證'0xcdcdcdcd'是無效指針,儘管它不太可能。它不等於malloc/new返回的任何內容,因爲它沒有對齊,但它可能不會導致崩潰。 –

0

謝謝大家,特別是Cody Gray和MikMik,我發現了! 正如你們推薦的那樣,我告訴VS在發佈配置中生成調試信息並禁用優化。然後我啓動了程序並暫停了它。或者我遠程連接到正在運行的進程。這幫助我找到了錯誤所在的地區。 原因是無限循環,這是由讀取數組邊界後的讀取以及缺少無效情況的排除引起的。兩者都導致運行時無法達到停止條件。神祕的部分來自事實,我的程序使用了一些隨機值。 這就是生活...