2009-05-25 163 views
2

我目前正在使用Windows XP中處理大量數據的C++程序。我們最大的輸入文件導致程序意外終止,不會出現任何錯誤消息。有趣的是,當程序從我們的IDE(Code :: Blocks)運行時,該文件在沒有任何此類問題的情況下被處理。在IDE外運行時程序崩潰

隨着數據的處理,它被放置在一個樹形結構中。在完成我們的計算之後,數據在發送之前被移入C++ STL向量,然後在OpenGL中渲染。

我希望能夠深入瞭解可能導致此次事故的原因。由於我是新用戶,因此我已經檢出了另一篇帖子,因爲我無法發佈鏈接。這篇文章中的問題與我的非常相似,並且是由於數組超出邊界索引而導致的。但是,我很確定沒有發生這種越界錯誤。

我想知道,也許,數據集的大小是分配空間的向量導致問題。理論上,我一直在測試程序的系統應該有足夠的內存來處理數據(2GB的RAM,數據集大約需要1GB)。當然,如果內存服務,STL向量只需在其容量達到時將其分配空間加倍。

謝謝,埃裏克

+0

當你在IDE之外運行應用程序時,你是否重新編譯它或任何東西? 您是否正在運行調試版本? – cbrulak 2009-05-25 19:39:54

+0

我試過調試版本和發佈版本,都產生相同的結果。 – Eric 2009-05-25 19:43:52

+1

dll呢?你在鏈接DLL或類似的東西?你有沒有嘗試過通過CMD線與shell運行它? – cbrulak 2009-05-25 19:46:20

回答

1

事實證明,我們的硬件已達到極限。該計劃正在觸及系統的內存限制,並且失敗慘不忍睹。直到我將cerr從命令行掛接到文件中,我們甚至無法看到正在生成的錯誤語句(謝謝starko)。感謝所有有用的建議!

1

你的記憶模型是什麼樣的?你是否遇到了索引限制(即sizeof int)?

9

代碼在IDE中運行(大概是在調試器中運行?),但不是獨立的事實表明它可能是一個初始化問題。

5

編譯器的警告級別設置爲最大值。

然後檢查您的所有警告。我猜想這是一個未初始化的變量(在調試模式下被初始化爲NULL/0)。

個人而言,我設置了我的模板,以便警告總是處於最大值,並且警告標記爲錯誤,以便編譯將失敗。

2

您可能會發現配置操作系統創建故障轉儲(可能我不知道,仍然使用一些名爲「Dr. Watson」的Windows系統軟件)很有幫助,然後您可以將其在程序崩潰後附加一個調試器(假設它崩潰)。

您還應該捕獲程序可能在沒有故障轉儲的情況下半正常退出的各種方式:atexitset_unexpected,set_terminate以及其他人。

0

聽起來像你的程序拋出一個你沒有捕捉到的異常。 boost test framework有一些異常處理程序,可以快速地定位異常位置。

樹結構中是否存在可溢出的索引?你是否在向量中使用超出當前向量大小的索引?

new vector...  
vector.push_back() 
vector.push_back() 
vector[0] = xyz 
vector[1] = abc 
vector[2] = slsk // Uh,oh, outside vector 

您最大的輸入集合有多大?你最終分配了size * size元素嗎?如果是這樣,您的最大輸入集是否大於65536個元素(65536 * 65536 == MAX_INT)?

我同意IDE獨立運行的最可能的原因是因爲調試器將內存擦除爲0或在分配的內存周圍使用內存警衛。

如果沒有其他任何東西,是否可以減小數據集的大小,直到找到完全適合的大小,以及一個稍微大的示例失敗 - 這可能是提供信息的。

0

我建議嘗試確定大概哪一行代碼會導致崩潰。

由於這隻發生在您的IDE之外,您可以使用OutputDebugString來輸出當前位置,並使用DebugView。

真的,爲IDE內部和外部的調試編譯的程序的行爲可能完全不同。當從IDE加載程序時,他們可以使用不同的運行時庫集。

最近我被我的代碼中的一個計時錯誤咬了一口,從IDE調試的時間總是很好,沒有發現錯誤,但是在發佈模式中,該錯誤在那裏。這種錯誤實際上是一種PITA來調試。