请教一个关于函数调用过程中压栈相关问题
时间:2010-08-28
来源:互联网
c的默认函数压栈
参数是从右向左压栈的,暂时不讨论对齐相关的问题(参数是默认四字节对齐,函数里边定义的变量是默认对齐方式----变量首地址是自身结构体里边最大标准数据类型字节的整数倍)
程序在运行中崩溃了,但是release版本没有相关的符号表,不能定位到具体那一行崩溃;
这个时候就得分析函数栈,而函数栈是一些bit串,没有具体的含义,要想分析他,就要清楚函数调用中
每个变量的实现细节,才能定位到栈区那个内存对应什么变量的值;
我分析出,崩溃的栈里边是从右向左压栈的,如果参数非4字节,会自动补齐,比如试验四个参数,
每个参数都是字节类型,一样占用16字节的数据,而函数体里边的变量是默认对齐的方式,一个字节变量,两个字节变量,四个字节变量占用的是12个字节,只有一个默认的填充字节;
对于具体变量对齐以及存放压栈的方式我已经搞清楚的了,不清楚的是函数压栈的时候,占用的不是函数指针4字节大小的栈区,函数指针压栈的地方,下边有一个4字节以及上边有3个四字节的数据,不知道这个是做什么的,???????除去参数,函数指针,函数体里边的局部变量,还有什么会压栈呢??
参数是从右向左压栈的,暂时不讨论对齐相关的问题(参数是默认四字节对齐,函数里边定义的变量是默认对齐方式----变量首地址是自身结构体里边最大标准数据类型字节的整数倍)
程序在运行中崩溃了,但是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
-------
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28