我认为我理解Release和Debug构建模式之间的区别。主要区别在于在调试模式下,生成的可执行文件未经过优化(因为这可能使调试更加困难)并且包含调试符号。
在构建PCRE(WinMerge的外部依赖项之一)时,我注意到了之前没有见过的构建模式:RelWithDebInfo。
这里提到了Debug和RelWithDebInfo之间的区别:http://www.cmake.org/pipermail/cmake/2001-October/002479.html。 exerpt: “RelwithDebInfo与发布模式非常相似。它生成完全优化的代码,但也构建程序数据库,并插入调试行信息,以便调试人员有机会随时猜测代码中的位置。”
这听起来是一个非常好的主意,但不一定明显如何设置。此链接描述了如何为VC ++启用此功能:http://www.cygnus-software.com/papers/release_debugging.html
我是否遗漏了某些东西,或者将所有版本代码编译为RelWithDebInfo没有意义?
答案 0 :(得分:15)
就我而言,在调试生产问题时,向客户发送代码而不在内部存储相应的调试符号是一种脱发的方法。
使用调试符号调试版本构建与调试构建很少有任何不同,所以我建议总是这样做。
那就是说,我不知道是否有任何弊端。如果是这样的话,那会很有趣。
答案 1 :(得分:5)
一旦您尝试调试优化的发布版本,就会知道为什么在没有其他出路时您只想做这件事。
基本上,我会看到两种情况,你需要这个:
我不了解您,但在过去十年中,我不得不两次或三次调试发布代码,并成功地在客户崩溃的公司工作没有问题。
是的,为你的发布版本提供调试信息也许是一个好主意,但是VS并没有这样设置,而且对于你需要它的每个十年的两个案例,不值得设置这个每次手动。由于CMake免费提供,所以做到了。
答案 2 :(得分:5)
我错过了什么,或者不是 编译所有发布代码是有意义的 作为RelWithDebInfo?
这取决于您使用调试信息对您的客户的信任程度。
其他信息:
gcc将调试信息编码到目标代码中。
这是gcc的pdb等价物:
How to generate gcc debug symbol outside the build target?
请注意,cmake似乎不支持这种开箱即用的方法。
答案 3 :(得分:2)
生产代码不需要调试信息所带有的大小膨胀。
答案 4 :(得分:0)
即使为发布版本生成调试信息,它对于调试目的而言远不如调试版本有用。原因是许多变量和中间表达式被优化掉,因此在调试器中不可用。