所以我刚刚按照enabling debug symbols for Release mode中的建议,在启用调试符号后,禁用优化并发现如果符号符合发布模式,断点确实有效,我发现自己想知道...
有什么建议吗?
答案 0 :(得分:16)
事实上,没有发布模式或调试模式。只有不同的配置启用了不同的选项。释放'模式'和调试'模式'只是常见的配置。
您所做的是修改版本配置以启用一些通常在调试配置中启用的选项。
根据您启用的选项,启用这些选项会使二进制文件变得更大和更慢。
您启用的这些选项越多,查找错误就越容易。我认为你的问题应该是“为什么要担心发布模式?”答案就是它更小更快。
答案 1 :(得分:8)
调试模式不会“让错过你”。它插入检查以捕获大量错误,但这些检查的存在也可能隐藏某些其他错误。所有错误检查代码都会捕获很多错误,但它也可以作为填充,并且可以隐藏细微的边界错误。
因此,本身应该有充足的理由来运行两者。 MSVC在调试模式下执行很多的额外错误检查。
此外,许多调试工具(例如assert
)依赖NDEBUG
未定义,这在调试版本中就是这种情况,但默认情况下不在发布版本中。
答案 2 :(得分:3)
将关闭优化,这使得调试更容易(否则代码可以以奇怪的方式重新排序)。还可以包括诸如assert()等的条件代码。
答案 3 :(得分:3)
除了您的应用程序在发布模式下非常可调试之外,MSVC运行时库不是很好,其他库也不是。
例如,调试堆在已分配的内存周围添加无人的陆地标记来捕获缓冲区溢出。 MSVC使用的标准库断言迭代器有效性。还有更多。答案 4 :(得分:1)
优化者的错误并非闻所未闻;但通常它们会暗示更深层次的问题,例如,当您需要时不使用volatile
会导致优化错误(优化远程比较并使用缓存结果)。
在一天结束时,在早期版本中包含调试符号可以帮助您在部署后追踪错误。
现在,直接回答你的问题:
assert()
。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。但将其输出到控制台显示它确实增加了