2012-03-06 55 views
2

在VS 2005中開發了一個命令行程序。它處理一些文件並創建一個輸出文件。有一個輸入文件導致崩潰,但只在某些情況下。如果程序使用命令行啓動(發佈版本或調試版本),則在處理該文件時會崩潰。但是,如果它是從VS 2005開始的,按F5(調試模式),它工作正常,不會崩潰,結果是正確的。任何提示? 謝謝。VS 2005 - 命令行程序崩潰

+0

如果它在調試器中運行,縮小它的一個好方法是將調試打印語句放在代碼中,如'cout <<「現在調用函數X \ n」;'。在'main'中從高級開始,然後縮小它直到找到_where_你崩潰。然後你可以打印出變量/參數來查看_why_它崩潰。 – 2012-03-06 09:42:00

+0

改善你的未處理的異常報告,讓你知道它爲什麼崩潰。編寫AppDomain.Current.UnhandledException的事件處理程序,並記錄或顯示e.ExceptionObject.ToString()的值。 – 2012-03-06 10:02:14

回答

0

您可以查看析構函數或複製構造函數。

在發佈模式下構建可以優化諸如不必要的對象副本之類的事情。

當您從命令行啓動程序並在之後連接時會發生什麼?

+0

程序崩潰後,我開始調試器,現在我知道它崩潰的地方,雖然我沒有弄清楚爲什麼(但我會這樣做)。無論如何,如果調試版本使用命令行啓動,它會崩潰,但如果它是從VS啓動的,則不會崩潰。謝謝。 – Vladimir 2012-03-06 10:12:54

0

雖然存在各種未定義的行爲,可以在調試但不是在發佈中,或在一個系統上但不是在另一個系統中正常工作,或者可能只是在滿月時觸發明顯的行爲,可能是最常見的罪魁禍首單線程代碼是未初始化的內存

大多數情況下,這將是一個未初始化的變量。它也可能是一個分配的內存塊(就像一個充滿垃圾的緩衝區),但沒有被填充,但代碼假定它是。一些流行的編譯器的調試版本傾向於將新分配的內存清零,無論是堆棧還是堆,而發佈版本都不這樣做。他們甚至有一些調試工具,故意用垃圾填充內存以幫助在運行時捕獲這些類型的錯誤。

我們在我們工作的傳統C系統中被這些困擾。我說大約80%的時間,當我們在單線程代碼中遇到這種情況時,這是由於未初始化的某種內存(通常是未初始化的變量)。對於傾向於表現時序特定問題的多線程代碼,這通常是數據競爭。

練習安全的做法以避免這樣的未定義行爲是非常重要的,因爲正如你所看到的,它首先會成爲一個難題,更不用說縮小問題出現在代碼中的位置。未定義的行爲實際上是未定義的,哪些是非常危險的避免它 - 在有些系統上而不是在其他系統上有時可能有效,它有時會起作用的事實是使這些錯誤最爲糟糕(每次都會失敗做得更好)。

另一個常見的初學者可能很頭疼,但是在通過基指針刪除時沒有使基類成爲虛擬的。儘管不那麼常見,但它肯定會導致我測試的系統出現一些非常令人困惑的行爲。再次,很難事先知道你的問題是如何模糊的描述,但通常會是某種未定義的行爲。

+0

正如我所解釋的,奇怪的是,如果調試版本是從命令行發出的,它會崩潰,但如果它是使用Visual Studio,調試模式發出的,則不會崩潰。無論如何,謝謝你的嘗試。 – Vladimir 2012-03-06 11:02:40

+0

@Vladmir這種情況也會發生在像我上面描述的情況那樣未定義的行爲(例如未初始化的內存)。您還可以獲得這樣的情況,即您可以在調試程序運行時崩潰而不運行調試程序但在調試程序運行時崩潰;在發佈版本中隨調試程序運行崩潰,但不會在調試程序運行時發佈崩潰時崩潰並且不會在調試版本中崩潰有/沒有調試器運行...崩潰與一個編譯器/鏈接器設置,但沒有其他等,所有這些症狀可以預期這些類型的問題。 – stinky472 2012-03-06 15:28:56