CMake构建模式RelWithDebInfo

时间:2009-08-06 15:53:18

标签: c++ visual-studio cmake

我认为我理解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没有意义?

5 个答案:

答案 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)

即使为发布版本生成调试信息,它对于调试目的而言远不如调试版本有用。原因是许多变量和中间表达式被优化掉,因此在调试器中不可用。