C++ 为什么我要在没有调试的情况下启动调试构建?

C++ 为什么我要在没有调试的情况下启动调试构建?,c++,visual-studio,debugging,visual-c++,C++,Visual Studio,Debugging,Visual C++,在不调试的情况下启动调试生成(与不调试的发布生成相反)有什么好处吗?当我调试一个发布版本时(与调试一个调试版本相反),我会错过什么呢?例如,在不调试的情况下启动一个调试版本可以给您带来以下好处:如果一个container被索引为无效索引,您将得到一个断言失败,在发布模式下,您将得到未定义的行为。这是一个想法。在发布模式下调试时,您错过的是源代码行和汇编代码之间不再有对应关系,因为优化器已经运行。因此,在发布模式下调试要困难得多调试构建的最大优势(在IDE之外): 断言已启用,您可能在依赖调试的

在不调试的情况下启动调试生成(与不调试的发布生成相反)有什么好处吗?当我调试一个发布版本时(与调试一个调试版本相反),我会错过什么呢?

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

调试构建的最大优势(在IDE之外):

  • 断言已启用,您可能在依赖调试的前置处理器部分中编译的其他诊断代码也已启用
  • 堆栈跟踪和变量监视工作正常,所以您可以让beta测试人员向您发送一个崩溃转储,并在以后的IDE中进行调试
最大的缺点:

  • 执行速度慢,内存消耗高,文件大小大
  • 有些bug是不明显的,除非你用完全优化的方法编译所有的东西。这是因为内存分配在发布版本中的工作方式不同

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

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

这方面的原因我已经想了好几个星期了,所以当我不希望执行被中断时,我会在IDE之外运行,如果需要的话,只需稍后附加到进程

如果您确实需要在IDE之外运行时查看调试输出,并且没有使用log4net之类的工具来捕获所有内容,则可以使用。

要添加到Adrians中,并作为讨论调试版本与发布版本时的一般要点:

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

  • 您可以针对调试或发布运行时libs(/MD vs/MDd)进行链接
  • 定义了
    NDEBUG
    (发布模式)或
    \u DEBUG
    (调试模式)
  • \u SECURE\u SCL
    (或某些等效文件)已定义(或未定义)
  • 编译器优化已启用(在某种程度上)
“调试构建”通常包括
\u debug
\u SECURE\u SCL=1
/MDd
以及禁用的所有编译器优化。这将导致“最安全”、“检查次数最多”的执行模式,但也应该是可执行文件的最慢版本。速度和安全系数应该完全独立于您是否在调试程序下运行程序调试版本为您提供了最大的安全性和错误捕获网络,完全独立于程序是否连接到调试器。

接下来是一个非优化的发布版本:也就是说,您拥有所有的发布模式设置(NDEBUG、\u SECURE\u SCL=0等),但禁用了所有编译器优化。这对于测试来说是很好的,因为性能不会陷入太多的困境,您可以很好地调试它。同样,它的有用性与您是否在调试器下运行程序无关


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

它不会执行断点、监视或任何其他IDE调试工作。我确信还有更多,所以我不想回答这个问题。请注意,在调试器下启动时的一个区别是,您的应用程序将使用不同的堆。(调试堆)这只在使用调试器启动时完成,与prg是构建版本还是调试版本无关。我很困惑,我只是给出了一个在调试器外部运行调试构建的示例。我不是说调试和发布。调试优化的发布版本对于关注的变量值来说是非常误导的。优化器通常不会为变量保留空间(并且只使用寄存器),而是为几个连续的变量重用相同的内存区域。。。这会导致调试器显示错误的变量值,即使该变量的值正确。