使用gdb查看栈帧的情况, 没有ebp
0x7fffffffdb58: 0x004005ba 0x00000000 0x00000000 0x00000000 <-----funcb的栈帧 [0x7fffffffdb60, 0x7fffffffdb80],其中a=0x1a,其中这个栈的栈底是返回地址4005d
0x7fffffffdb68: 0x00000000 0x0000001a 0x00000000 0x00000000 0x4005d8,是函数funca的返回地址,然后往上就逐渐是各种局部变量
0x7fffffffdb78: 0x004005d8 0x00000000 0x00400470 0x00000000
0x7fffffffdb88: 0xffffdd90 0x00000019 0x00000000 0x00000000 <-----funca的栈帧,这个栈帧[0x7fffffffdb80, 0x7fffffffdba0], 其中a=0x19
0x7fffffffdb98: 0x0040060d 0x00000000 0x00000000 0x00000000 <----add的栈帧stack frame [0x7fffffffdba0,0x7ffffffdbd0],其中a=0x18,b=0x27
0x7fffffffdba8: 0x00000028 0x00000018 0x00000001 0x00000000
0x7fffffffdbb8: 0x00000040 0x00000000 0x6562b026 0x00000000
0x7fffffffdbc8: 0x0040069f 0x00000000 0xffffdd60 0x00007fff
0x7fffffffdbd8: 0xf7dee923 0x00000002 0x00000000 0x00000017
0x7fffffffdbe8: 0x00000027 0x00000000 0x00000000 0x00000000
0x7fffffffdbf8: 0x00000003 0x00000000 0xffffdda8 0x00007fff
0x7fffffffdc08: 0x00000000 0x00000000 0x00400750 0x00000000
0x7fffffffdc18: 0xf7de7ab0 0x00007fff 0x000000ff 0x00000000
0x7fffffffdc28: 0xff000000 0x00000000 0x00000000 0x00000000
0x7fffffffdc38: 0x00000000 0x00000000 0x00000000 0x00000000
所以说一个栈的栈帧,最开始是上一个函数的返回地址,以及本函数的堆栈
gdb中显示出来的栈帧的信息中,“Stack frame at 0x7fffffffdb80” 都是指栈帧的基地址。
(gdb) info frame 1
Stack frame at 0x7fffffffdb80:
rip = 0x4005ba in funcb (sleep.c:15); saved rip = 0x4005d8
called by frame at 0x7fffffffdba0, caller of frame at 0x7fffffffdb60
source language c.
Arglist at 0x7fffffffdb58, args: a=26
Locals at 0x7fffffffdb58, Previous frame's sp is 0x7fffffffdb80
Saved registers:
rip at 0x7fffffffdb78
(gdb) info frame 2
Stack frame at 0x7fffffffdba0:
rip = 0x4005d8 in funca (sleep.c:19); saved rip = 0x40060d
called by frame at 0x7fffffffdbd0, caller of frame at 0x7fffffffdb80
source language c.
Arglist at 0x7fffffffdb78, args: a=25
Locals at 0x7fffffffdb78, Previous frame's sp is 0x7fffffffdba0
Saved registers:
rip at 0x7fffffffdb98
(gdb) info frame 3
Stack frame at 0x7fffffffdbd0:
rip = 0x40060d in add (sleep.c:27); saved rip = 0x40069f
called by frame at 0x7fffffffdcb0, caller of frame at 0x7fffffffdba0
source language c.
Arglist at 0x7fffffffdb98, args: a=24, b=40
Locals at 0x7fffffffdb98, Previous frame's sp is 0x7fffffffdbd0
Saved registers:
rip at 0x7fffffffdbc8
(gdb) info frame 4
Stack frame at 0x7fffffffdcb0:
rip = 0x40069f in print (sleep.c:35); saved rip = 0x4006c7
called by frame at 0x7fffffffdcc0, caller of frame at 0x7fffffffdbd0
source language c.
Arglist at 0x7fffffffdbc8, args: i=2
Locals at 0x7fffffffdbc8, Previous frame's sp is 0x7fffffffdcb0
Saved registers:
rip at 0x7fffffffdca8
以函数funca->funcb来看一一下函数的调用过程
00000000004005a2 <funcb>:
4005a2: 48 83 ec 18 sub $0x18,%rsp rsp这个时候的值就确定了
4005a6: 89 7c 24 0c mov %edi,0xc(%rsp)
4005aa: 83 44 24 0c 01 addl $0x1,0xc(%rsp)
4005af: 8b 44 24 0c mov 0xc(%rsp),%eax
4005b3: 89 c7 mov %eax,%edi
4005b5: e8 ac ff ff ff callq 400566 <funcc>
4005ba: 90 nop
4005bb: 48 83 c4 18 add $0x18,%rsp
4005bf: c3 retq 00000000004005c0 <funca>:
4005c0: 48 83 ec 18 sub $0x18,%rsp
4005c4: 89 7c 24 0c mov %edi,0xc(%rsp)
4005c8: 83 44 24 0c 01 addl $0x1,0xc(%rsp)
4005cd: 8b 44 24 0c mov 0xc(%rsp),%eax
4005d1: 89 c7 mov %eax,%edi
4005d3: e8 ca ff ff ff callq 4005a2 <funcb> callq是push ip;rsp++
4005d8: 90 nop
4005d9: 48 83 c4 18 add $0x18,%rsp
4005dd: c3 retq
dwarf当中存储的信息是啥样子的呢?
< 1><0x000000ca> DW_TAG_subprogram
DW_AT_external yes(1)
DW_AT_name "funcb"
DW_AT_decl_file 0x00000001 /home/hon/codebox/gcc/sleep.c
DW_AT_decl_line 0x0000000d
DW_AT_prototyped yes(1)
DW_AT_type <0x00000049>
DW_AT_low_pc 0x004005a2
DW_AT_high_pc <offset-from-lowpc>30
DW_AT_frame_base len 0x0001: 9c: DW_OP_call_frame_cfa
DW_AT_GNU_all_tail_call_sitesyes(1)
DW_AT_sibling <0x000000f8>
< 2><0x000000eb> DW_TAG_formal_parameter
DW_AT_name "a"
DW_AT_decl_file 0x00000001 /home/hon/codebox/gcc/sleep.c
DW_AT_decl_line 0x0000000d
DW_AT_type <0x00000049>
DW_AT_location len 0x0002: 916c: DW_OP_fbreg -20
funca中的信息是啥样子的?
< 1><0x000000f8> DW_TAG_subprogram
DW_AT_external yes(1)
DW_AT_name "funca"
DW_AT_decl_file 0x00000001 /home/hon/codebox/gcc/sleep.c
DW_AT_decl_line 0x00000011
DW_AT_prototyped yes(1)
DW_AT_type <0x00000049>
DW_AT_low_pc 0x004005c0
DW_AT_high_pc <offset-from-lowpc>30
DW_AT_frame_base len 0x0001: 9c: DW_OP_call_frame_cfa
DW_AT_GNU_all_tail_call_sitesyes(1)
DW_AT_sibling <0x00000126>
< 2><0x00000119> DW_TAG_formal_parameter
DW_AT_name "a"
DW_AT_decl_file 0x00000001 /home/hon/codebox/gcc/sleep.c
DW_AT_decl_line 0x00000011
DW_AT_type <0x00000049>
DW_AT_location len 0x0002: 916c: DW_OP_fbreg -20
使用gdb查看栈帧的情况, 没有ebp的更多相关文章
- 使用gdb查看栈帧的情况,有ebp
0x7fffffffdb30: 0x00000000 0x00000000 0xf7ffe700 0x0000001a0x7fffffffdb40: 0xffffdc98 ...
- 【Linux】GDB查看栈信息(转)
在调试程序的过程中,查看程序的函数调用堆栈是一项最基本的任务,几乎所有的图形调试器都支持这项特性. GDB调试器当然也支持这一特性,但是功能更加灵活和丰富. GDB将当前函数的栈帧编号为0,为外层函数 ...
- X86-64寄存器和栈帧--牛掰降解汇编函数寄存器相关操作
X86-64寄存器和栈帧 概要 说到x86-64,总不免要说说AMD的牛逼,x86-64是x86系列中集大成者,继承了向后兼容的优良传统,最早由AMD公司提出,代号AMD64:正是由于能向后兼容,AM ...
- X86-64寄存器和栈帧
简介 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果.除此之外,它们还各自具有一些特殊功能.通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途, ...
- Linux 如何使用gdb 查看core堆栈信息
转载:http://blog.csdn.net/mergerly/article/details/41994207 core dump 一般是在segmentation fault(段错误)的情况下产 ...
- Linux下追踪函数调用,打印栈帧
事情的起因是这样的,之前同事的代码有一个内存池出现了没有回收的情况.也就是是Pop出来的对象没有Push回去,情况很难复现,所以在Pop里的打印日志,跟踪是谁调用了它,我想在GDB调试里可以追踪调用的 ...
- GDB查看堆栈局部变量
GDB查看堆栈局部变量 “参数从右到左入栈”,“局部变量在栈上分配空间”,听的耳朵都起茧子了.最近做项目涉及C和汇编互相调用,写代码的时候才发现没真正弄明白.自己写了个最简单的函数,用gdb跟踪了调用 ...
- Windows x64 栈帧结构
0x01 前言 Windows 64位下函数调用约定变为了快速调用约定,前4个参数采用rcx.rdx.r8.r9传递,多余的参数从右向左依次使用堆栈传递.本次文章是对于Windows 64位下函数调用 ...
- 2.Jvm 虚拟机栈和栈帧
Jvm 虚拟机栈和栈帧 1.栈帧(frames) 官网描述 A frame is used to store data and partial results, as well as to perfo ...
随机推荐
- 解决应用程序无法正常启动0xc0150002等问题
1.在程序运行出错的时候,右键“我的电脑”,然后点击“管理”→“事件查看器”→“Windows 日志”→“应用程序”,查看错误信息: 1> “E:\IPCam_share\ARP\數據處理\Hg ...
- EEPROM读写学习笔记与I2C总线(二)
无论任何电子产品都会涉及到数据的产生与数据的保存,这个数据可能并不是用来长久保存,只是在运行程序才会用到,有些数据体量较大对于获取时效性并不太强,各种各样的数据也就有不同的存储载体,这次在EEPROM ...
- [BZOJ4552][Tjoi2016&Heoi2016]排序(二分答案+线段树)
二分答案mid,将>=mid的设为1,<mid的设为0,这样排序就变成了区间修改的操作,维护一下区间和即可 然后询问第q个位置的值,为1说明>=mid,以上 时间复杂度O(nlog2 ...
- 20145234黄斐《信息安全系统设计基础》第八周(Linux下vim相关命令)
Linux下vim相关命令 在编辑程序时经常使用vim,所以记住一些常用的指令还是很有必要的 文件命令 vim file 打开单个文件vim file vim file1 file2 file3 .. ...
- 北京Uber优步司机奖励政策(4月6日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 成都Uber优步司机奖励政策(3月11日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- JavaScript---设计模式之职责链模式
概念 职责链模式是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 链中收到请求的对象要么亲自处理它,要 ...
- 13、Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- 吴裕雄 python 机器学习——混合高斯聚类GMM模型
import numpy as np import matplotlib.pyplot as plt from sklearn import mixture from sklearn.metrics ...
- 加油吧 骚年QAQ
本随笔文章,由个人博客(鸟不拉屎)转移至博客园 写于:2017 年 11 月 08 日 原地址:https://niaobulashi.com/archives/fighting.html --- 想 ...