+ -
当前位置:首页 → 问答吧 → 请教一个关于函数调用过程中压栈相关问题

请教一个关于函数调用过程中压栈相关问题

时间:2010-08-28

来源:互联网

c的默认函数压栈
参数是从右向左压栈的,暂时不讨论对齐相关的问题(参数是默认四字节对齐,函数里边定义的变量是默认对齐方式----变量首地址是自身结构体里边最大标准数据类型字节的整数倍)

程序在运行中崩溃了,但是release版本没有相关的符号表,不能定位到具体那一行崩溃;
这个时候就得分析函数栈,而函数栈是一些bit串,没有具体的含义,要想分析他,就要清楚函数调用中
每个变量的实现细节,才能定位到栈区那个内存对应什么变量的值;

我分析出,崩溃的栈里边是从右向左压栈的,如果参数非4字节,会自动补齐,比如试验四个参数,
每个参数都是字节类型,一样占用16字节的数据,而函数体里边的变量是默认对齐的方式,一个字节变量,两个字节变量,四个字节变量占用的是12个字节,只有一个默认的填充字节;

对于具体变量对齐以及存放压栈的方式我已经搞清楚的了,不清楚的是函数压栈的时候,占用的不是函数指针4字节大小的栈区,函数指针压栈的地方,下边有一个4字节以及上边有3个四字节的数据,不知道这个是做什么的,???????除去参数,函数指针,函数体里边的局部变量,还有什么会压栈呢??

作者: zbhddt6   发布时间: 2010-08-28

举例
test1(int i1,int i2,int i3,int *pi)
{
int i=1;
int j=2;
test2(3,4,5,(int *)pData);
....
}
test2(int i1,int i2,int i3,int *pi)
{
int i=7;
int j=8;
assert(0);------在此挂起
....
}

栈区内容:

--------
00000008
00000007
00000003
00000004
00000005
00fb4050
########----------------------为什么在压栈test1的时候,还压栈其它奇怪的数据,才到压栈相关的参数以及局部变量呢/是什么呢?
########----------------------
########----------------------
******** test1地址
########----------------------
00000002
00000001
*******  test1 参数1
*******  test1 参数2
*******  test1 参数3
*******  test1 参数4
-------

作者: zbhddt6   发布时间: 2010-08-28

函数压栈前后有一些奇怪的数据不是参数也不是局部变量,这个是一些什么东西呢?------

作者: zbhddt6   发布时间: 2010-08-28