关于-fno-omit-frame-pointer与-fomit-frame-pointer

来源:互联网 发布:淘宝网官网注册 编辑:程序博客网 时间:2024/06/06 01:29

转:  http://www.trueeyu.com/?p=1694

在GDB core的时候,经常去查看EBP,ESP寄存器,来查找一些有用的调用信息,但是感觉这个EBP,ESP中值的变化,并不是像书中描述的那种函数调用的标准流程。

在用perf做性能分析,打印函数的调用路径时,打印调用路径也有问题。

后来才清楚,原来是-fno-omit-frame-pointer这个优化导致的问题。

下面以一个实例来说明:

#include <stdio.h>int add(int a, int b){  return a + b;}int main(void){  int sum = 0;  sum = add(1, 2);  printf("%d\n", sum);  return 0;}

gcc -o a.s -S a.c -fno-omit-frame-pointer

vim a.s

add函数汇编:
.LFB0:  .cfi_startproc  pushq %rbp             #保存栈基址  .cfi_def_cfa_offset 16  .cfi_offset 6, -16  movq %rsp, %rbp       #将栈顶做为新的栈基址  .cfi_def_cfa_register 6  movl %edi, -4(%rbp)    movl %esi, -8(%rbp)  movl -8(%rbp), %eax   #取参数1  movl -4(%rbp), %edx   #取参数2  leal (%rdx,%rax), %eax  #相加  leave  .cfi_def_cfa 7, 8  ret #返回

gcc -o a.s -S a.c -fomit-frame-pointer

vim a.s

add函数汇编

add:

.LFB0:  .cfi_startproc  movl %edi, -4(%rsp)    #取参数1  movl %esi, -8(%rsp)    #取参数2  movl -8(%rsp), %eax  movl -4(%rsp), %edx  leal (%rdx,%rax), %eax #相加  ret

从汇编结果可以看出,第二种少了几条切换栈基址的指令,会有性能提升,但会带来一个问题,由于没有存储rbp,那么从add函数并不能追溯整个函数的调用栈。

比如,当perf采样到add函数内的时候,它只能打印当前的指令是在哪个函数内,但不能打印整个调用函数栈。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子6个月奶水越来越少怎么办 孩子快三个月了奶水越来越少怎么办 老婆生完孩子乳房肿胀不下奶怎么办 大人吃了退烧药不出汗怎么办 三岁宝宝抵抗力差总生病怎么办 8个月宝宝发烧39度怎么办 小孩发烧吃了药不退烧怎么办 小孩一直发烧39度左右不退怎么办 九个月宝宝反复发烧39度怎么办 八个月宝宝反复发烧39度怎么办 十个月宝宝反复发烧39度怎么办 2岁宝宝反复发烧怎么办39度左右 宝宝两周岁光吃水果不吃饭怎么办 3岁宝宝光吃水果不吃饭怎么办 中学生就爱玩儿游戏不爱学习怎么办 一岁宝宝只吃水果不吃饭怎么办 孩子发烧咳嗽怎么办最有效的方法 打了百白破孩子一直发烧咳嗽怎么办 顺产侧切肛门坠胀解大便难受怎么办 2岁拉肚子拉水怎么办吃什么药 三岁宝宝三天没拉大便怎么办 3个月宝宝3天没大便怎么办 3个月宝宝4天不拉大便怎么办 17个月宝宝看见生人害怕怎么办 大人给四个月婴儿喂糖水怎么办 宝宝12个月了还一直坐着玩怎么办 七个月宝宝发烧不到38℃怎么办 一个月大的婴儿头立不起来怎么办 18个月的宝宝晚上总找妈妈怎么办 婴儿吃了妈妈生气的奶上火怎么办 3个月的宝宝认人怎么办 十天大的婴儿大便是泡沫该怎么办 婴儿3天没有拉大便了怎么办 儿童两三天拉一次大便是稀便怎么办 五个月的婴儿一星期没大便怎么办 宝宝53天几天没大便了怎么办 42天宝宝4天没有大便怎么办 42天的宝宝3天没大便怎么办 6个月宝宝前额头碰青了怎么办 三个月的婴儿喝牛奶拉绿大便怎么办 已经喂了猫一个多月的高钙奶怎么办