gcc / g++ Debug 模式

Debug模式在GCC/G++中提供了更多的代码检测,但可能带来轻微的性能开销。在Linux下,动态库默认同时支持Debug和release。为了启用Debug模式,需要定义_GLIBCXX_DEBUG宏,并注意不同.o文件的Debug容器一致性。GCC提供了与标准容器行为一致的Debug容器,适用于C++11之前和之后的版本。
Debug / release模式

  Debug模式下的代码比release模式具有更多的检测,比如在windows平台上assert宏只在release模式下有效。Linux上则没有这个限制,无论Debug还是release模式assert都生效,但是如果你想让assert失效,编译的时候 加上 -DNDEBUG 即可。

Debug检测

  我们都说了Debug模式可以帮我们检测一些东西,但是可能会有额外的性能开销(虽然微不足道)。默认下Linux的动态库文件是集于Debug 和 release于一身的。看看这个列子

#include<vector>
using namespace std;
int main()
{
    vector<int> v;
    v.reserve(10); //容量为10  但是size 为0
    v[3] = 1;
    return 0;
}

  下面这份代码在windows 下的Debug模式下会崩溃,release模式下不会崩溃,这是因为windows下的vector对operator[] 做了assert的检测。那么我们跑这份代码在Linux下,它并不会报错,所以那我们如何开启真真的Debug 模式呢?

GCC 的 Debug模式
_GLIBCXX_DEBUG

  如果我们想开启Debug模式必须定义上面的宏

debug模式下的容器

  gcc是有专门的debug容器的,这些容器使用起来和标准容器一模一样,所以放心使用就好,但是有个准则就是俩个不同的.o文件内不能一个使用了debug模式的容器,一个没使用debug模式下的容器,这俩个.o文件是不能链接到一起的。

非c++11的

这里写图片描述

c++11的Debug容器

这里写图片描述

demo
  1 #include<debug/vector>
  2 #define _GLIBCXX_DEBUG 
  3 
  4 int main()
  5 {
  6     __gnu_debug::vector<int> v;
  7     v.reserve(10);
  8     v[3]=1;
  9     return 0;
 10 }
[yutian@~]$ ./a.out 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/debug/vector:265:
    error: attempt to subscript container with out-of-bounds index 3, but     
    container only holds 0 elements.

Objects involved in the operation:
sequence "this" @ 0x0x7ffeae481db0 {
  type = NSt7__debug6vectorIiSaIiEEE;
}
Aborted (core dumped)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值