2017-02-11 160 views
-1

我们可以列出一些原因,使得程序在调试模式下编译时可以正确运行,但在Qt Creator中以发行模式崩溃。在大多数情况下,我们来谈谈一般情况。一般来说,在Qt Creator中,如果在调试模式下编译但在发布模式下崩溃,什么会导致程序正常运行?

就我而言,在A点,程序编译并正确运行。经过一些工作后,在B点编译,但在运行时在发布模式下崩溃,而不是在调试模式下,我通过在A和B之间评论我的工作返回到A点,它具有与B点相同的行为,但编译却崩溃只在发布模式下。我觉得在A点睡觉之前我做了很多错误。这使我不想完成我的程序,因为它是我想要在开放源代码中共享的免费程序。

+7

未定义的行为是一个可能的原因。请注意所有编译器警告。如果您没有收到任何警告,则会增加编译器的警告级别,并在增加后查看是否有任何警告。 – drescherjm

+1

你有任何代码示例?目前的答案可能是广泛的(至少对我而言)。 –

回答

1

任何一种未定义的行为都会导致此类问题。最可能的原因 - 写入数组/矢量的边界,或从那里读取。它可以是对已经被破坏的物体的破坏。或者只有在释放模式下执行速度很快时才会重现的多线程问题。它可能是未初始化的struct,也可能是未在构造函数中分配的POD类型的字段。

在调试模式下,内存分配的方式不同,在某些情况下,最终可能包含零(传递给您的程序时)而不是随机垃圾。这通常仅在发布模式下导致崩溃。

我强烈建议您设置“RelWithDebInfo”配置来调试此问题,例如,在Release中构建时,将-g选项传递给GCC。因此,当应用程序崩溃并找出原因时,您将能够停止在调试器中。

否则,最好的办法就是在代码中执行类似“二进制搜索”的操作来查找崩溃的确切位置。喜欢,评论一半的代码,看看它是否仍然崩溃等。

我知道这个解释有点含糊,但希望它有帮助!

+2

_“我知道这个解释有些含糊......”嗯,对于一个太模糊而宽泛的问题,可以预料什么? –

+0

“在调试模式下,内存分配方式不同,在某些情况下,最终可能包含零(传递到程序时),而不是随机垃圾。”实际上,情况正好相反;调试堆使用固定模式填充重新分配的页面以帮助发现未初始化的内存错误。 –

+0

@MatteoItalia我认为你一般来说可能是正确的,我只是从我的经验中讲述。有没有证据链接? :) –

相关问题