我的代码在调试模式下工作,但不在发布模式下
Posted
技术标签:
【中文标题】我的代码在调试模式下工作,但不在发布模式下【英文标题】:My code works in Debug mode, but not in Release mode 【发布时间】:2010-05-27 18:02:52 【问题描述】:我在 C++ 中的 Visual Studio 2008 中有一个代码,它仅通过 fopen 和 fclose 处理文件。 一切都在调试模式下完美运行。我已经测试了几个数据集。 但它在发布模式下不起作用。它一直在崩溃。 我已经关闭了所有的优化,也没有任何依赖(在链接器中),而且我已经设置了这些:
优化:禁用(/Od) 保留未引用的数据。 不要删除冗余 针对 Windows98 优化:否
我仍然想知道在这种情况下它应该如何工作。 我还应该关闭什么让它像调试模式一样工作?
我认为如果它在发布模式下工作但在调试模式下不工作,可能是编码错误,但另一种方式看起来很奇怪。不是吗?
感谢您的帮助。 --尼玛
【问题讨论】:
【参考方案1】:调试模式通常会初始化堆数据分配。该程序可能依赖于这种行为。查找未初始化的变量和缓冲区。
【讨论】:
我仔细检查过,我没有看到任何类似的错误。 :) 要检查的另一件事是您用于 fread() 的缓冲区是否足够大。缓冲区溢出可能在一种构建配置中是可以容忍的,但在另一种配置中却不能容忍,这仅仅是因为内存中的排列方式以及调试与发布中的堆使用有些不同。 您的回答看起来很有希望,但我无法找到问题的确切位置。尝试在发布模式下调试无济于事,因为它会跳过代码的某些部分并突然崩溃。我尝试了脚手架(放置 couts...),它发生了: Obj* f(...) Obj* obj= new Obj(..); ... cout 好的,这听起来确实像缓冲区溢出。它会发生在 Obj 的构造函数中。检查那里是否有堆栈缓冲区。如果它溢出堆栈,它将覆盖 f() 的返回地址,然后返回 obj;通话会爆炸。【参考方案2】:1) 仔细检查所有依赖于预处理器宏的代码。 2) 使用 assert() 来验证程序状态的前提条件。不能期望这些会影响程序流程(即删除检查仍将允许代码提供相同的最终结果),因为 assert 是一个宏。当断言不起作用时,请使用常规运行时条件。 3) 事实上,永远不要让变量处于未初始化状态。
【讨论】:
1.没有。 2. 我没有使用 assert()。 1) :) 2) 从一开始就使用 assert 会帮助您尽早发现这个问题。 :)【参考方案3】:到目前为止,最可能的解释是由于未初始化的内存导致两种模式下的未定义行为不同。由于调试和发布之间的时间环境不同,缺乏线程安全性和同步代码问题也可能表现出这种行为,但如果您的程序不是多线程的,那么显然不可能。
【讨论】:
【参考方案4】:我经历过这种情况,在我的情况下,这是因为我的一个结构数组假设只有 X 索引,但是我检查这个结构的循环过度检查到 X+1 索引。有趣的是,虽然我使用的是 Visual C++ 2005,但调试模式运行良好。
我花了几个小时将 printf 一行一行地放入我的编码中以捕获错误。任何人都有调试此类错误的好方法,请告诉我。
【讨论】:
以上是关于我的代码在调试模式下工作,但不在发布模式下的主要内容,如果未能解决你的问题,请参考以下文章
python在调试模式下在c ++中工作,但不在exe文件中