【发布时间】:2017-01-02 15:27:25
【问题描述】:
我最近对 C++ 编程有了更多的了解,并且一直在运行整个“调试与发布”编译版本。现在我觉得我对已编译代码的发布版本和调试版本之间的一些差异有了相当不错的理解。对于代码的调试版本,编译器不会尝试优化代码,以便您可以运行调试器并逐行逐步执行程序。本质上,编译后的代码在执行方式上与您的源代码非常相似。在发布模式下编译时,编译器会尝试优化程序,使其具有相同的功能,但效率更高。
但是,我很好奇是否存在发布版本和调试版本之间的源代码可能不同的情况。也就是说,当我们提到debug vs release时,我们总是在谈论编译后的代码,还是源代码存在差异?
这个问题是由于我使用专有编程语言工作而产生的,其中不存在正式的逐步调试器,但确实存在串行监视器。因此,我们的很多“调试”与“发布”代码都是通过#defines 实现的,看起来像这样:
#ifdef _DEBUG
check that error didn't occur...
SerialPrint("Error occurred")
#endif
所以总结一下我的问题,根据您的 IDE,是否经常有设置来实现我所说明的内容?也就是说,当你尝试编译成调试版本时,它是否可以与源代码中的更改集成?还是发布与调试通常只是指已编译的二进制文件?
谢谢!
【问题讨论】:
-
看到与您展示的序列相似的序列是很常见的,通常包含在其他宏中。事实上,在 C++ 标准中也有这样的规定:
assert -
例如,Microsoft Visual C++ 标准库,在调试模式下编译时,使用容器的扩展数据结构(例如
std::vector)及其迭代器到 e。 G。帮助检测使用无效的迭代器。 -
我总是使用
-g -fsanitize=address -fno-omit-frame-pointer进行调试,并使用 gdb 单步执行代码。但是,该程序非常慢并且浪费了大量内存,因此我使用-O3 -flto -fsanitize=address -fno-omit-frame-pointer -DNDEBUG=1进行编译以进行发布。要修复assert中止,只需在代码前面加上#include<assert.h>然后#undef assert然后#define assert(cond) if(cond)__asm__ volatile("int $0x03"),但请确保在发布期间或不使用gdb 时删除此代码