【问题标题】:Visual C++ - Why bother with Debug Mode?Visual C++ - 为什么要使用调试模式?
【发布时间】:2009-08-28 08:39:12
【问题描述】:

所以我刚刚遵循enabling debug symbols for Release mode 中的建议,在启用调试符号、禁用优化并发现如果符号符合发布模式时断点确实有效,我发现自己想知道...

  1. Debug 模式的目的不就是帮助您发现错误吗?
  2. 如果调试模式会让错误从您身边溜走,为什么还要打扰它呢?

有什么建议吗?

【问题讨论】:

  • “如果它让虫子从你身边溜走”是什么意思?它是怎么做到的?
  • 调试模式初始化未初始化的变量,并在数组等周围放置防护,如链接帖子中所示。

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


【解决方案1】:

事实上,没有发布模式或调试模式之类的东西。只有不同的配置启用了不同的选项。 Release 'mode' 和 Debug 'mode' 只是常见的配置。

您所做的是修改发布配置以启用一些通常在调试配置中启用的选项。

根据您启用的选项,启用这些选项会使二进制文件变大变慢。

您启用的这些选项越多,就越容易找到错误。我认为您的问题应该是“为什么要使用发布模式?”答案是它更小更快。

【讨论】:

    【解决方案2】:

    调试模式不会“让错误从您身边溜走”。它插入检查以捕获大量错误,但这些检查的存在也可能隐藏某些其他错误。所有的错误检查代码都会捕获很多错误,但它也充当填充,并且可能隐藏细微的边界错误。

    所以这本身应该是运行both的充足理由。 MSVC 在调试模式下执行很多额外的错误检查。

    此外,许多调试工具,例如 assert 依赖于未定义的 NDEBUG,在调试版本中是这种情况,但在默认情况下,在发布版本中则不然。

    【讨论】:

      【解决方案3】:

      优化将被关闭,这使得调试更容易(否则代码可能会以奇怪的方式重新排序)。还可以包含诸如 assert() 等条件代码。

      【讨论】:

        【解决方案4】:

        除了您的应用程序在发布模式下非常易于调试之外,MSVC 运行时库不是很好,其他一些库也不是。

        例如,调试堆会在分配的内存周围添加无人区标记以捕获缓冲区溢出。 MSVC 使用的标准库断言迭代器有效性。还有更多。

        【讨论】:

          【解决方案5】:

          由于优化器导致的错误并非闻所未闻;但通常它们会暗示更深层次的问题,例如,在需要时不使用 volatile 会导致优化器错误(优化掉比较并改用缓存结果)。

          归根结底,在早期版本中包含调试符号可以帮助您在部署后追踪错误。

          现在,直接回答您的问题:

          1. 调试模式还有其他内容,例如assert()s,它们在发布模式中被剥离。
          2. 即使您在发布模式下进行所有测试,错误仍然会溜走。事实上,一些错误(如上面的 volatile 错误)仅在调试模式下隐藏:它们仍然存在,只是更难触发。

          【讨论】:

            【解决方案6】:

            在您的应用程序中包含完整符号包括有关构建机器的重要信息(嵌入路径等)。

            建议是在发布版本中包含“仅 PDB”符号(不包含文件、行和局部变量符号)并启用优化。并且调试版本没有优化和完整的符号。

            并且(如其他答案所述)常见的子表达式消除和指令重新排序可以使调试有趣(下移到第 n、n+2、n+1 行...)。

            【讨论】:

              【解决方案7】:

              优化是调试的噩梦。一旦我有了这个 for 循环的应用程序

              for (int i = 0; i < 10; i++)
              {
                //use i with something
              }
              

              i 在调试时总是 0。但是将其输出到控制台表明它确实增加了

              【讨论】:

              • 如果您所做的只是打印它,那么完全有可能为您的变量分配了内存然后从未使用过,宁愿将i 缓存在寄存器中。诡计多端。
              • 您要查找的词是“优化”,而不是“优化”。 :)
              猜你喜欢
              • 1970-01-01
              • 2010-09-25
              • 1970-01-01
              • 2014-08-14
              • 1970-01-01
              • 2010-11-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多