为啥我要在不调试的情况下开始调试构建?

Posted

技术标签:

【中文标题】为啥我要在不调试的情况下开始调试构建?【英文标题】:Why would I start a debug build without debugging?为什么我要在不调试的情况下开始调试构建? 【发布时间】:2010-10-22 11:52:21 【问题描述】:

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

【问题讨论】:

它不会做断点、监视或任何其他 IDE 调试工作。我敢肯定还有更多,所以我不回答这个问题。 【参考方案1】:

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

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

最大的缺点:

执行速度慢、内存消耗大、文件大。 除非您对所有内容进行全面优化,否则某些错误并不明显。这是因为内存分配在发布版本中的工作方式不同。

许多公司将调试版本分发给 Alpha 版和 Beta 版测试人员,然后再转为发布版本。

【讨论】:

调试优化的发布版本对于观察变量值非常误导。优化器往往不会实际为变量保留空间(并且仅使用寄存器),为多个连续变量重用相同的内存区域......这导致调试器显示变量的错误值,即使变量具有正确的值。 【参考方案2】:

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

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

您链接到调试或发布运行时库(/MD 与 /MDd) NDEBUG(发布模式)或_DEBUG(调试模式)是#defined _SECURE_SCL(或其他等价物)已定义(或未定义) 已启用编译器优化(在某种程度上)

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

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

终于来了全面优化。 (/Ox + 完全内联 + 可能是整个 prg 优化):虽然这是出于性能原因您希望发布的内容,但很可能您的公司中没有足够的人来实际调试它。也就是说,给定故障转储,某人很可能需要一些 asm 知识以及编译器输出的内容才能理解故障转储(或者甚至是一些随机断点,当实际在调试器下运行时)。同样,完全 opt 的优缺点与在调试器下启动/运行 prg 无关。

【讨论】:

【参考方案3】:

在不进行调试的情况下启动调试构建可以为您带来以下好处:如果使用无效索引对约束器进行索引,您将获得断言失败,在发布模式下,您将获得未定义的行为。这是一个想法。在发布模式下调试时您会错过的是,由于优化器已经运行,源代码行和汇编代码之间不再有对应关系。所以在发布模式下调试要困难得多

【讨论】:

【参考方案4】:

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

这个原因我已经想了好几个星期了,所以当我不希望执行被中断时,我会在 IDE 之外运行,并在以后需要时简单地附加到进程。

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

【讨论】:

请注意,在调试器下启动时的一个区别是您的应用将使用不同的堆。 (调试堆)这仅在使用调试器启动时完成,与 prg 是构建发布还是调试无关。 我很困惑,我只是为 OP 提供一个示例,说明我何时在调试器之外运行了调试版本。我不是在说调试与发布。

以上是关于为啥我要在不调试的情况下开始调试构建?的主要内容,如果未能解决你的问题,请参考以下文章

为啥附加到调试器的运行如此缓慢?

CMAKE - 调试/交叉构建?

在不安装 Visual Studio 的情况下在机器上调试代码

是否可以在不指定类型的情况下将变量值打印到调试?

如何在不重新启动的情况下调试 mod_perl2 模块?

ios如何在不查看CoreFoundation代码的情况下进行调试