CMake构建模式RelWithDebInfo

sid*_*ect 15 c++ cmake visual-studio

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

在构建PCRE(WinMerge的外部依赖项之一)时,我注意到了之前没有见过的构建模式:RelWithDebInfo.

Debug和RelWithDebInfo之间的区别在这里提到:http://www.cmake.org/pipermail/cmake/2001-October/002479.html .exerpt:"RelwithDebInfo非常类似于Release模式.它生成完全优化的代码,但也构建程序数据库,并插入调试行信息,以便调试人员有机会随时猜测代码中的位置."

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

我错过了什么,或者将所有发布代码编译为RelWithDebInfo没有意义?

Kim*_*man 19

就我而言,在调试生产问题时,向客户发送代码而没有内部存储的相应调试符号是一种脱发的方法.

使用调试符号调试版本构建与调试构建调试很少有任何不同,所以我建议总是这样做.

也就是说,我不知道是否有任何弊端.如果是这样的话,听到它会很有趣.


Jua*_*uan 6

我错过了什么,或者将所有发布代码编译为RelWithDebInfo没有意义?

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

附加信息:

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

这是gcc的pdb等价物:

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

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

  • @Juan:在Linux平台上,[`strip`](https://sourceware.org/binutils/docs/binutils/objcopy.html)和[`objcopy`](http://linux.die.net/man/ 1/objcopy)都可以从二进制文件中删除调试信息.使用`objcopy`,您还可以保留独立的调试信息.然后,您可以无缝地调试发布版本,而无需向客户发送调试信息(请参阅`--only-keep-debug`),耶! (5认同)

sbi*_*sbi 5

一旦您尝试调试优化的发布版本,就会知道为什么这是您只有在没有其他出路时才想做的事情.

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

  • 您遇到的问题不会出现在调试版本中,因此您必须调试版本构建
  • 您在客户遇到崩溃并使用本地存储的调试信息来了解崩溃.

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

是的,为你的发布版本提供调试信息也许是一个好主意,但VS并没有这样设置,对于你需要的每个十年中的两个案例,不值得每次手动设置时间.由于CMake免费提供,所以做到了.

  • 金,我很少见到崩溃.我想这归结为编码风格.在我曾经工作了很长时间(几年)的大型项目中,有些地方的碰撞比其他地方更常见,而且在测试过程中发现碰撞的部分只发生在五年一次.崩溃的概率明显与手动资源管理的数量相关. (2认同)