问题描述
省略帧指针确实会使调试变得非常困难。如果没有帧指针来帮助,局部变量将更难定位,堆栈跟踪也将难以重构。另外,由于参数距离堆栈的顶部很远,因此访问参数可能会变得更加昂贵,并且可能需要更昂贵的寻址模式。
因此,-fno-omit-frame-pointer
选项指导编译器生成可维护并使用所有功能的堆栈框架指针的代码,以便调试器即使具有优化标志也仍可产生堆栈回溯。
所以我很好奇为什么将-fno-omit-frame-pointer
与GCC的优化标志一起使用时没有区别。
我用于测试的代码:
int f() {
return 42;
}
使用Clang的区别:
$ diff <(clang -S test.c -Os -fno-omit-frame-pointer -o -) <(clang -S test.c -Os -o -)
8,12d7
< pushq %rbp
< .cfi_def_cfa_offset 16
< .cfi_offset %rbp,-16
< movq %rsp,%rbp
< .cfi_def_cfa_register %rbp
14,15d8
< popq %rbp
< .cfi_def_cfa %rsp,8
但是使用GCC并没有区别:
$ diff <(gcc -S test.c -Os -fno-omit-frame-pointer -o -) <(gcc -S test.c -Os -o -) | wc -l
0
当然,我也使用-g
进行了测试。也没有区别。
我用于测试的规格:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)