omit-frame-pointer

开启该选项,主要是用于去掉所有函数SFP(Stack Frame Pointer)的,即在函数调用时不保存栈帧指针SFP,代价是不能通过backtrace进行调试根据堆栈信息了。通过去掉SFP,可以提高程序运行速度,达到优化程序的目的。如果要打开栈指针,使用 -fno-omit-frame-pointer

另外一个类似选项-fomit-leaf-frame-pointer :用于去掉子函数leaf function的SFP。该选项属于优化选项,在指定-O选项时,也会开启该选项。

fno-tree-vectorize

gcc -O3级优化已包括 “-ftree-vectorize” 选项对程序进行自动向量化,关闭向量化的选项是-fno-tree-vectorize。使用-ftree-vectorizer-verbose=n选项可以显示自动向量化的结果,其中n的取值范围为0到9。自动矢量化技术简单讲就是一次处理多个数据SIMD,比如x86 sse/mmx,arm neon技术。

fno-optimize-sibling-calls

有些情况下,比如尾部调用子函数,call会被优化成jump指令。使用该选项恢复子函数调用栈。

内存泄漏检测

set(CMAKE_CXX_FLAGS "-fsanitize=undefined,address,leak -fno-omit-frame-pointer -fno-optimize-sibling-calls -ggdb")
set(CMAKE_C_FLAGS "-fsanitize=undefined,address,leak -fno-omit-frame-pointer -fno-optimize-sibling-calls -ggdb")
set(CMAKE_L_FLAGS "-fsanitize=undefined,address,leak -fno-omit-frame-pointer -fno-optimize-sibling-calls -ggdb")

使用Address Sanitizer时,在运行时可以使用ASAN的选项。如下打印出ASAN帮助信息:

ASAN_OPTIONS=help=1 ./test_asan

有用的ASAN选项配置,其中halt_on_error=0跟-fsanitize-recover=address需要同时加上:

# compile flag
-fsanitize-recover=address # run-time option
ASAN_OPTIONS=halt_on_error=0:alloc_dealloc_mismatch=0

参考

(GCC) gcc 编译选项 -fno-omit-frame-pointer,-fno-tree-vectorize,fno-optimize-sibling-calls;及内存泄漏、非法访问检测 ASAN的更多相关文章

  1. 栈帧示意图:stack pointer、frame pointer

    更多参考:http://www.embeddedrelated.com/usenet/embedded/show/31646-1.php 一: The calling convention descr ...

  2. C++ Standards Support in GCC - GCC 对 C++ 标准的支持

    C++ Standards Support in GCC - 2019-2-20 GCC supports different dialects of C++, corresponding to th ...

  3. frame pointer及其用途

    1 什么是frame pointer frame pointer指向本函数栈帧顶,通过它可以找到本函数在进程栈中的位置.有专门的寄存器保存该值. 2 frame pointer有什么用 主要是back ...

  4. gcc常用编译选项

    “-Wall”选项打开所有最常用到的编译警告,强烈建议打开,可以捕捉到许多在C编程中最常发生的错误. “-o”选项来为可执行文件指定一个不同的输出文件. “-c”用于把源码文件编译成对象文件. 对象文 ...

  5. gcc / g++ 编译选项

    g++ -Wall -m64 -W -O2 a.cpp b.cpp -o a 用下面的命令编译,生成libtriangle.so  先生成动态库 g++ -g -fpic -shared -o lib ...

  6. Gcc ------ gcc的使用简介与命令行参数说明

    gcc的使用简介与命令行参数说明 2011年06月19日 20:29:00 阅读数:10221 2011-06-19 wcdj 参考:<GNU gcc嵌入式系统开发 作者:董文军> (一) ...

  7. Atomic Builtins - Using the GNU Compiler Collection (GCC) GCC 提供的原子操作

    http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Atomic-Builtins.html gcc从4.1.2提供了__sync_*系列的built-in函数,用 ...

  8. GCC/gcc/g++/CC/cc区别

    平常在Linux上经常会用到gcc或者g++来编译程序,但对这两者的理解也就停留在一个是用来编译C程序,另一个是用来编译C++程序的(请注意:这种说法是有问题的,待会改进). 1. GCC GCC,是 ...

  9. arm 开发板更新 gcc/gcc++ | Debain 更新 gcc,无需编译直接更新 gcc

    4我的板子是 Orange pi 3,只能以 卧槽来形容... 我是搞.net core的,这板子死活搞不了. 刷的是Debain系统. 说实话,这个板子不错,可就是官方的系统实在不敢恭维,内核旧,软 ...

  10. clang 编译 OC

    clang -fobjc-arc -framework Foundation helloworld.m -o helloworld.out OVERVIEW: clang LLVM compiler ...

随机推荐

  1. 用trie树解决最大异或对问题(On)

    在给定的N个整数A1,A2--ANA1,A2--AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N. 第二行输入N个整数A1A1-ANAN. 输出格式 输出一 ...

  2. kafka的auto.offset.reset详解与测试

    1. 取值及定义 auto.offset.reset有以下三个可选值: latest (默认) earliest none 三者均有共同定义: 对于同一个消费者组,若已有提交的offset,则从提交的 ...

  3. Java SE 枚举,注解,增强for循环

    Java SE 进阶 1.Enum 枚举对象名通常使用全部大写,常量的命名规范 构造器私有化 本类内部创建一组对象 对外暴露对象(通过为对象添加 public final static 修饰符) 可以 ...

  4. 【Tool】Idea快捷键

    Windows Ctrl + F12: 查找当前类中的方法 Ctrl + N: 查找类 Ctrl + Alt + H: 查看方法调用关系 Ctrl + H: 查看类的继承关系 Alt + F7:查找类 ...

  5. 关于标签k8s训练营文章的转载声明

    该标签下的所有文章都转载自 https://www.qikqiak.com/k8strain/

  6. 第六章:Django 综合篇 - 15:Django与缓存

    我们都知道Django建立的是动态网站,正常情况下,每次请求过来都经历了这样一个过程: 接收请求 -> url路由 -> 视图处理 -> 数据库读写 -> 视图处理 -> ...

  7. 使用 Loki 收集 Traefik 日志

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247492264&idx=1&sn=f443c92664 ...

  8. docker垃圾处理

    1 查找docker文件夹 find / -name docker 2 列举文件夹大小 du -h --time --max-depth=1 . df -h df -TH 3 Docker占用磁盘空间 ...

  9. 不能获取到镜像,ImagePullBackoff或者Pending

    Pending 应用长时间处于 Pending 状态时,也可以按照这个办法查看镜像的下载进度. 安装 Kubernetes 过程中,或者向 Kubernetes 部署应用的过程中,有可能会碰到 Ima ...

  10. (四)JPA - JQPL 实现增删改查

    (一)JPA的快速入门 建议在需要使用时,看看之前的文章,先把环境搭起来. 5.JPQL JPQL和SQL 1.JPQL和SQL很像,查询关键字都是一样的 2.唯一的区别是:JPQL是面向对象的 JP ...