为什么我在没有调试的情况下启动调试版本?

时间:2010-10-22 11:52:21

标签: c++ visual-studio debugging visual-c++

在没有调试的情况下启动调试版本有什么好处(而不是没有调试的版本构建)?当我调试发布版本时(而不是调试调试版本),我会错过什么?

4 个答案:

答案 0 :(得分:7)

调试版本的最大优点(在IDE之外):

  • 启用断言,您可能在依赖于调试的预处理器部分中编译的其他诊断代码也已启用。
  • 堆栈跟踪和变量监视工作正常,因此您可以让beta测试人员向您发送故障转储并稍后在IDE中进行调试。

最大的缺点:

  • 执行速度慢,内存消耗量大,文件大小更大。
  • 除非您使用完全优化编译所有内容,否则某些错误并不明显。这是因为内存分配在发布版本中的工作方式不同。

许多公司将调试版本分发给alpha和beta测试人员,然后切换到发布版本。

答案 1 :(得分:1)

要添加到Adrians answer,并在讨论调试版本与发布版本时作为一般性观点:

以下是影响构建的一些因素:

  • 您可以链接调试或发布运行时库(/ MD vs. / MDd)
  • NDEBUG(发布模式)或_DEBUG(调试模式)是#defined
  • _SECURE_SCL(或某些等价物)定义(或不​​定义)
  • 启用编译器优化(在某种程度上)

“调试版本”通常包含_DEBUG_SECURE_SCL=1/MDd并禁用所有编译器优化。这导致“最安全”,“检查最多”的执行模式,但也应该是您可执行文件的最慢版本。 速度和安全性因素应完全独立于您是否在debuger下运行程序! - 调试版本为您提供最大的安全性和错误捕获网络,完全独立于是否该程序附加到调试器。

接下来是非优化的发布版本:即,您具有所有发布模式设置(NDEBUG,_SECURE_SCL = 0等),但您禁用所有编译器优化。这对测试很有用,因为性能不会太低,你可以调试好。同样,这的有用性与您是否在调试器下运行程序无关。

最后完全优化。 (/Ox +完整内联+可能整个prg优化):虽然出于性能原因这是您希望发布的内容,但您公司中可能没有足够的人员来实际调试此内容。也就是说,在崩溃转储的情况下,有人可能需要一些asm知识以及编译器输出的内容以了解崩溃转储(甚至是一些随机断点,当实际在调试器下运行时)。同样,完全选择的优缺点与在调试器下启动/运行prg无关。

答案 2 :(得分:0)

在没有调试的情况下启动调试版本可以为您提供以下好处:如果使用无效索引编制索引符,您将获得断言失败,在发布模式下,您将获得未定义的行为。这是一个想法。在发布模式下调试时您错过的是源代码行和汇编代码之间没有对应关系,因为优化器已经运行。因此在发布模式下调试要困难得多

答案 3 :(得分:0)

我将提供一些我无法解释的最新体验 - 有时当我运行我的应用程序时,在IDE中运行时会出现未处理的异常。问题是,我知道我的异常正在被处理,我也知道我没有打破抛出的异常(通过CTRL-D,E)。如果我多次点击F5,我的错误处理程序最终会捕获异常并正确处理它。

这样做的原因几个星期都没有,所以当我不希望执行被中断时,我会在IDE之外运行,如果需要的话,只需稍后附加到该过程。

如果您真的需要在IDE外部运行时看到Debug输出,并且您没有使用log4net之类的东西来捕获所有内容,那么您可以使用DebugView代替。