在IDE外运行时程序崩溃

在IDE外运行时程序崩溃

问题描述:

我目前正在使用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

事实证明,我们的硬件已达到极限。该计划正在触及系统的内存限制,并且失败惨不忍睹。直到我将cerr从命令行挂接到文件中,我们甚至无法看到正在生成的错误语句(谢谢starko)。感谢所有有用的建议!

你的记忆模型是什么样的?你是否遇到了索引限制(即sizeof int)?

代码在IDE中运行(大概是在调试器中运行?),但不是独立的事实表明它可能是一个初始化问题。

编译器的警告级别设置为最大值。

然后检查您的所有警告。我猜想这是一个未初始化的变量(在调试模式下被初始化为NULL/0)。

个人而言,我设置了我的模板,以便警告总是处于最大值,并且警告标记为错误,以便编译将失败。

您可能会发现配置操作系统创建故障转储(可能我不知道,仍然使用一些名为“Dr. Watson”的Windows系统软件)很有帮助,然后您可以将其在程序崩溃后附加一个调试器(假设它崩溃)。

您还应该捕获程序可能在没有故障转储的情况下半正常退出的各种方式:atexitset_unexpected,set_terminate以及其他人。

听起来像你的程序抛出一个你没有捕捉到的异常。 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或在分配的内存周围使用内存警卫。

如果没有其他任何东西,是否可以减小数据集的大小,直到找到完全适合的大小,以及一个稍微大的示例失败 - 这可能是提供信息的。

我建议尝试确定大概哪一行代码会导致崩溃。

由于这只发生在您的IDE之外,您可以使用OutputDebugString来输出当前位置,并使用DebugView。

真的,为IDE内部和外部的调试编译的程序的行为可能完全不同。当从IDE加载程序时,他们可以使用不同的运行时库集。

最近我被我的代码中的一个计时错误咬了一口,从IDE调试的时间总是很好,没有发现错误,但是在发布模式中,该错误在那里。这种错误实际上是一种PITA来调试。