免费注册 查看新帖 |

Chinaunix

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

[内核入门] 关于backtrace的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-11 10:09 |显示全部楼层 |倒序浏览
请问一下:当程序出现断错误的时候,系统会产生信号SIGSEGV,若程序初始化之后注册信号SIGSEGV并且定义入口函数,在入口函数中打印出backtrace(即堆栈),通过对当前堆栈的分析,找到其上层函数在栈中的帧地址,再分析上层函数的堆栈,再找再上层的帧地址……一直找到最顶层为止,帧地址指的是一块:在栈上存放局部变量,上层返回地址,及寄存器值的空间。

请问:backtrace(即堆栈)是基于ebp还是esp来计算的,backtrace又是怎么得到他们的?
        ebp上面就是eip,那逐层查找是基于什么,eip吗?难道eip就是上一层函数的ebp吗?
        系统会打出backtrace的一系列调用地址。请问这些地址到底是什么?是eip吗?这在编译的时候就已经定义好了,可以直接在.s文件中找到。

谢谢!!

论坛徽章:
0
2 [报告]
发表于 2012-09-13 10:56 |显示全部楼层
谢谢,那再确认两个问题:
1)ebp(fp)可以从专用寄存器中得到,表示当前执行的函数的ebp。ebp前面一个地址是eip,而实际calltrace中打印出来的都是eip的地址?
2)func1                ->                  func2            -> func3
     xxx                                         xxxx                  xxxx
     eip1                                        eip2                  eip3
     ebp1                                      ebp2                  ebp3
     xxx                                         xxxx                   xxxx
     esp1                                       esp2                  esp3
如上图的话,是不是说ebp的寄存器存储的是当前正在处理的函数func3的ebp3
通过ebp3可以得到eip3, eip3是如果找到ebp2的呢。是eip3=ebp2还是*eip3=ebp2或者其它的映射关系,这样逐层查找阿?

3)esp在这过程中起什么作用。esp和ebp之间到底是什么关系?

谢谢!!

论坛徽章:
0
3 [报告]
发表于 2012-09-17 16:56 |显示全部楼层
帮忙回答一下,谢谢!!

论坛徽章:
0
4 [报告]
发表于 2012-09-24 17:29 |显示全部楼层
我看了一下汇编代码,参数,ebp等都有对应的压栈操作,怎么没有发现“返回地址”的压栈操作阿?是在“call  function”中做了吗?

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP