Visual C ++ - 为什么要使用调试模式呢?

时间:2009-08-28 08:39:12

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

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

  1. 调试模式的目的不是帮助您找到错误吗?
  2. 如果它让bug过了你,为什么还要使用Debug模式呢?
  3. 有什么建议吗?

7 个答案:

答案 0 :(得分:16)

事实上,没有发布模式或调试模式。只有不同的配置启用了不同的选项。释放'模式'和调试'模式'只是常见的配置。

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

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

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

答案 1 :(得分:8)

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

因此,本身应该有充足的理由来运行两者。 MSVC在调试模式下执行很多的额外错误检查。

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

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

在一天结束时,在早期版本中包含调试符号可以帮助您在部署后追踪错误。

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

  1. 调试模式还有其他一些东西,比如在发布模式下被剥离的assert()
  2. 即使您在发布模式下进行所有测试,错误仍然会漏掉。事实上,一些错误(如上面的volatile错误)仅在调试模式下隐藏:它们仍然存在,它们更难触发。

答案 5 :(得分:1)

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

建议将“PDB Only”符号包含在发布版本中(不包括文件,行和局部变量符号)并进行优化。调试版本没有优化和完整的符号。

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

答案 6 :(得分:0)

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

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

我在调试时总是0。但将其输出到控制台显示它确实增加了