发布/调试地狱,使用V-studio C ++项目

时间:2010-07-02 17:35:51

标签: release crash

我对这件事感到厌倦。我正在使用C ++在Visual Studio中工作,并且在尝试发布构建/运行周期之前在开发方面做了一点点努力,但却发现我的发布版本崩溃。它让我无法解决问题,无法破解大块代码寻找所有潜在的违规者。无论如何,如果我进入我的“发布”项目属性并为“编辑并继续”启用调试数据库,并且甚至不在链接器中启用调试,则发行版本运行完美。

好的,我很欣赏任何关于要使我的Release版本正常工作的东西的输入,但是我敢问这个问题:“谁在乎”?据我所知,如果链接器实际上与DEBUG版本的运行时和Windows库链接,那么该程序可能无法在没有安装VStudio的任何系统上运行。但是我正在做什么...只是让编译器DEBUG格式设置为“编辑和继续编程数据库(/ ZI)”。它几乎不会在应用程序的六分之一中产生1K的差异,如果它不会阻止EXE工作,也许我应该把它设置为那样?还是我在找麻烦?

- 兰迪

4 个答案:

答案 0 :(得分:1)

“谁在乎?” ......好吧,你应该。

发布版本崩溃的事实表明它有问题。

如果打开调试符号“修复”它,那么你有一个你不理解的神奇修复。为什么要修复它?您是否可以依赖此修复工作在您的软件安装的每台PC上?

您描述的症状表明您正在某处破坏内存(最有可能是缓冲区溢出错误),并且添加调试符号会重新排列或填充您的代码,以便您可以“逃脱它”,因为内存腐败不会发生任何重要的事情。

但你真的不能依赖这样的修复。它破坏了对你的应用程序的所有信心,并且它咬你一天(这样的修复可以在下次编译应用程序时轻松停止“工作”)

您需要隔离导致此问题的原因 - 如果它不止一次发生,那么您从上次修复它时就没有学到任何东西。对于应用程序在调试中运行而不是在发布中运行并不“正常”,因此必定会出现一些问题 - 您需要弄清楚它是什么并修复它以便将来避免此类错误。 (例如,如果它是一个缓冲区溢出,它可能只是你正在分配一个“n”元素的缓冲区,然后访问元素“n” - 你应该只访问元素0到(n-1)。这很容易修复一次你了解如何编写这样的代码......但你必须付出一些努力来弄清楚你做错了什么。

答案 1 :(得分:0)

我认为你需要确定你在Debug中导致崩溃的实践/代码,而不是Release。

如果你能解决这个问题,你可以用不同的方式确定你需要做什么。

此外,“我正在使用C ++在Visual Studio中工作,并且在尝试发布构建/运行周期之前在开发中稍微开发一点”向我表明您可能希望在开发实践中开发更多的规则。您可能希望花一点时间学习一些测试驱动的开发技术;我发现那些改进了我的代码/编译缺陷率。

答案 2 :(得分:0)

我使用单个构建而不是单独的调试和发布构建:请参阅“Separate ‘debug’ and ‘release’ builds?

调试和发布版本之间通常存在一些差异,例如:

  • 哪个版本的运行时库?
  • 编译器优化?
  • 增量链接?
  • 编辑并继续?
  • 符号调试信息?

事实上,你可以任意组合使用这些。唯一阻止软件在干净机器上运行的方法就是使用运行时库的调试版本。

我通常会关闭编辑并继续和增量链接,因为我发现它们在遥远的过去是错误的。

答案 3 :(得分:0)

是的,你在找麻烦。从事物的声音来看,你正在编写包含未定义行为的代码,并且恰好(至少看起来)在某些情况下工作 - 但它几乎肯定是错误的(是的,一些编译器有优化错误,所以正确的代码没有'在优化时工作 - 但这些很少见。)