我目前正在开发一个处理大量数据的Windows XP中的C ++程序。我们最大的输入文件导致程序意外终止,没有任何错误消息。有趣的是,当程序从我们的IDE(Code :: Blocks)运行时,处理文件时没有任何此类问题。
在处理数据时,它被放置在树形结构中。在我们完成计算之后,数据被移动到C ++ STL向量中,然后被发送出去在OpenGL中呈现。
我希望能够深入了解可能导致此次崩溃的原因。我已经查看了另一篇文章,由于我是新用户,因此无法发布链接。帖子中的问题与我的非常相似,是由数组的超出索引引起的。但是,我很确定没有发生这样的越界错误。
我想知道,在为向量分配空间时,数据集的大小是否会导致问题。从理论上讲,我一直在测试程序的系统应该有足够的内存来处理数据(2GB的RAM,数据集占用大约1GB)。当然,如果内存服务,STL向量在达到其容量时只需将其分配的空间加倍。
谢谢,Eric
答案 0 :(得分:9)
代码在IDE中工作(可能在调试器中运行?),但不是独立的这一事实告诉我,这可能是一个初始化问题。
答案 1 :(得分:5)
编译器的警告级别设置为最大
然后检查所有警告。我猜它是一个未初始化的变量(在调试模式下被初始化为NULL / 0)。
就个人而言,我已经设置了模板,以便警告始终处于最大值,并且警告被标记为错误,因此编译将失败。
答案 2 :(得分:2)
您可能会发现配置O / S以创建故障转储(可能,我不知道,仍然使用一些名为“Dr Watson”的Windows系统软件),然后您可以附加它程序崩溃后的调试器(假设它 崩溃)。
您还应该捕获程序可以在没有崩溃转储的情况下半优雅地退出的各种方式:atexit
,set_unexpected
,set_terminate
以及其他人。
答案 3 :(得分:1)
你的记忆模型是什么样的?你是否正在敲打索引限制(即sizeof int)?
答案 4 :(得分:1)
事实证明,我们的硬件已达到极限。该程序达到了系统的内存限制,并且失败了。在将cerr从命令行挂接到文件之前,我们甚至看不到生成的错误语句(感谢starko)。感谢所有有用的建议!
答案 5 :(得分: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
您最大的输入集有多大?你最终分配尺寸*大小的元素?如果是这样,您的最大输入集是否大于65536个元素(65536 * 65536 == MAX_INT)?
我同意IDE独立运行时最可能的原因是调试器将内存擦除为0或使用分配内存周围的内存保护。
如果没有其他任何原因,是否可以减小数据集的大小,直到找到可行的大小,以及一个稍微大的失败示例 - 这可能会提供信息。
答案 6 :(得分:0)
我建议您尝试确定代码的哪一行确实导致崩溃。
由于这只发生在IDE之外,您可以使用OutputDebugString
输出当前位置,并使用DebugView。
实际上,在IDE内部和外部编译的程序的行为可能完全不同。从IDE加载程序时,它们可以使用不同的运行时库集。
最近我被我的代码中的时间错误所困扰,不知何故,当从IDE调试时,时间总是很好,没有观察到错误,但是在发布模式下,错误就在那里。这种bug实际上是一个PITA来调试。