副标题#e#
栈在计较机规模中是个常常提到的名词,数据布局中有栈;网络传输中有协 议栈。本日我们接头的挪用栈(call stack),指的是在措施的执行进程中存储函 数挪用信息的动态数据布局。
这个界说大概太抽象了一些,在给出详细的例子之前,请各人先思考一个问 题,哪些信息是函数挪用进程中所需要的?可能这么问,一个编译器,在面临一 个函数的挪用指令时,该生成哪些代码?
首先,函数的返回地点要生存下来。就仿佛你和你的小狗玩仍飞碟游戏,每 一个函数挪用比如扔一个飞碟,当你的狗狗哼兹哼兹的捡来飞碟,函数完执行的 时候,它必然得知道去那边把飞碟还给你。
然后,函数的参数是个必不行少的元素,这个很直观,就不多罗嗦了。第三 ,被挪用的函数的局部变量也要存储在栈上。因为按照局部标量的界说,对沟通 函数的差异挪用,局部变量有差异的存储空间,不会相互影响,所以这些数据也 是跟函数挪用息息相关的信息。
下面,我们通过一个例子,来看看函数的挪用栈中的信息:
对付下面一段c++措施
[Ctrl+A 全部选择 提示:你可 先修改部门代码,再按运行]
#p#副标题#e#
编译之,Cl /Zi a.cpp (/Zi生成pdb,调试的时候利用)
各人选用熟悉的调试器,在这里,笔者用的是windbg 各人可以去这个地点下 载(http://www.microsoft.com/whdc/devtools/debugging/installx86.Mspx)
从调试器中启动措施:Windbg a.exe
然后在第4行配置一个断点(F9)。开始执行这个措施(F5),直到措施间断在断 点处
找到措施的挪用栈:
1.察看当前的ebp,在command窗口中应该已经看到。不然的话,在command中 输入r
2.在memory察看窗口中,virtual栏中输入ebp-10的值,而且把display format改成long hex,以利于调查栈中的值
我把我的windbg截图粘贴如下,并和各人一起调查几个处所
1.返回地点0040106b。拜见反汇编的功效,0040106b正是main调完 SumFromOne之后的那条指令。
2.参数。主措施传给他的是10,(0xa),在memory窗口ebp+8的位置找到他。
3.局部变量,我在措施中存心将sum初始化为0xabcd,各人可以在memory窗口 ebp-4的位置找到他。
有乐趣地同学可以按F5,在下一个断点中察看相关信息。
好,本日的这片博客中我们对换用栈有了感性的认识,在ebp周围找到了返回 地点,参数以及局部变量。下一片博客中,我将表明为什么这些信息存储在这些 位置,敬请等候。