免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2592 | 回复: 2
打印 上一主题 下一主题

请问下GCC -O2编译的问题。 [复制链接]

论坛徽章:
1
巳蛇
日期:2014-04-17 19:22:10
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-25 16:31 |只看该作者 |倒序浏览
本帖最后由 wuchengyang 于 2012-10-25 19:36 编辑

现在在一工程里用了-O2选项进行编译,当程序crash后,我想记录下来出错的程序CALL STACK,程序如下(64位):
struct stack_context_s {
    uint8_t *bp;
    uint8_t* pc;
};
void dump_stack(uint8_t* rbp, uint8_t* pc)
{
    int32_t max_stack = 0;
    struct stack_context_s szStackContext[10] = {0};
   
    while (max_stack < 10) {
        if (!rbp)
            break;
        szStackContext[max_stack].pc = *((uint8_t**)rbp+);
        szStackContext[max_stack].rbp = *((uint8_t**)rbp);
        max_stack--;
    }
}

但是,后来发现rbp寄存器记录的数据不对,在网上查了一下,说是GCC 优化后部在使用rbp寄存器。请问下各位大神,这样的话,我要记录调用栈,该怎么弄?多谢了。

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [报告]
发表于 2012-10-25 16:58 |只看该作者
本帖最后由 EricFisher 于 2012-10-25 17:06 编辑

可能更强劲的方法是,使用调试信息,比如读取dwarf的内容来帮助记录调用栈。就像gdb调试时所做的那样,不是很熟悉这块。

或者查查-O2中是哪个选项,把它关掉。

论坛徽章:
1
巳蛇
日期:2014-04-17 19:22:10
3 [报告]
发表于 2012-10-25 18:59 |只看该作者
请问一下,GCC优化的一些细节有相关资料么?还麻烦大哥们指点一下,如果如网上所说,不在使用rbp寄存器,当调用函数执行完过后,如何返回到上层函数呢?回复 2# EricFisher


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP