16

我认为我了解 Release 和 Debug 构建模式之间的区别。主要区别在于在调试模式下,生成的可执行文件没有经过优化(因为这可能会使调试更加困难)并且包含调试符号。

在构建 PCRE(WinMerge 的外部依赖项之一)时,我注意到了一种我以前从未见过的构建模式:RelWithDebInfo。

这里提到了 Debug 和 RelWithDebInfo 之间的区别:http ://www.cmake.org/pipermail/cmake/2001-October/002479.html 。摘录:“RelwithDebInfo 与 Release 模式非常相似。它生成完全优化的代码,但也构建程序数据库,并插入调试行信息,让调试器有机会随时猜测您在代码中的位置。”

这听起来像是一个非常好的主意,但不一定很明显如何设置。此链接描述了如何为 VC++ 启用此功能:http ://www.cygnus-software.com/papers/release_debugging.html

我是否遗漏了什么,或者将所有发布代码编译为 RelWithDebInfo 没有意义?

4

5 回答 5

21

就我而言,在没有内部存储相应的调试符号的情况下向客户发送代码是在调试生产问题时导致脱发的秘诀。

使用调试符号调试 Release 构建与调试 Debug 构建几乎没有什么不同,因此我建议始终这样做。

也就是说,我不知道是否有任何缺点。如果是这样的话,听听会很有趣。

于 2009-08-06T15:59:01.450 回答
7

我是否遗漏了什么,或者将所有发布代码编译为 RelWithDebInfo 没有意义?

这取决于您对调试信息的信任程度。

附加信息:

gcc 将调试信息编码到目标代码中。

这是 gcc 的 pdb 等价物:

如何在构建目标之外生成 gcc 调试符号?

请注意,cmake 似乎不支持这种开箱即用的方法。

于 2009-08-06T16:13:28.580 回答
5

一旦您尝试调试优化的发布版本,您就会知道为什么只有在没有其他出路的情况下才会这样做。

基本上,我看到两种情况你需要这个:

  • 您有一个未出现在调试版本中的问题,因此您必须调试发布版本
  • 您在客户那里发生了崩溃,并使用本地存储的调试信息来了解崩溃。

我不了解你,但在过去十年中,我不得不调试发布代码两次或三次,并设法在客户崩溃不成问题的公司工作。

是的,为您的发布版本提供调试信息可能也是一个好主意,但是 VS 不会以这种方式进行设置,并且对于每个十年中您需要它的两种情况,不值得每次手动设置时间。既然 CMake 是免费提供的,那就去做吧。

于 2009-08-06T16:03:25.963 回答
2

生产代码不需要调试信息携带的大小膨胀。

于 2009-08-06T15:59:38.653 回答
2

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

于 2012-07-24T15:20:36.350 回答