标签:0xbffff048 调用 x86 int 手推 gdb test main 0xbffff078
当程序crash的时候,我们可以通过coredump文件,来定位问题。比如使用bt命令可以完整的展开函数的调用栈。但是有些时候,部分栈的数据可能被损坏,导致gdb无法直接显示函数的调用栈。那么这时就需要我们手工展开函数栈。 关于x86的函数调用栈的示意图基本如下图所示: 关于参数的压栈顺序,上图为cdecl方式,这个可以通过编译选项修改。GCC默认使用cdecl。 下面看一下例子:- #include stdlib.h>
- #include stdio.h>
- static int test(int a, int b, int c)
- {
- return a+b+c;
- }
- int main()
- {
- int a = 1;
- int b = 2;
- int c = 3;
- int d = test(a, b, c);
- printf("%d\n", d);
- return 0;
- }
- Breakpoint 1, test (a=1, b=2, c=3) at test.c:7
- 7 return a+b+c;
- Missing separate debuginfos, use: debuginfo-install glibc-2.11-2.i686
- (gdb) bt
- #0 test (a=1, b=2, c=3) at test.c:7
- #1 0x08048412 in main () at test.c:16
- eax 0x1 1
- ecx 0x2c0187d8 738297816
- edx 0x1 1
- ebx 0x73fff4 7602164
- esp 0xbffff048 0xbffff048
- ebp 0xbffff048 0xbffff048
- esi 0x0 0
- edi 0x0 0
- eip 0x80483c7 0x80483c7 test+3>
- eflags 0x286 [ PF SF IF ]
- cs 0x73 115
- ss 0x7b 123
- ds 0x7b 123
- es 0x7b 123
- fs 0x0 0
- gs 0x33 51
- (gdb) x /8x 0xbffff048
- 0xbffff048: 0xbffff078 0x08048412 0x00000001 0x00000002
- 0xbffff058: 0x00000003 0x0073fff4 0x00000001 0x00000002
- 0x08048412 in main () at test.c:16
- 16 int d = test(a, b, c);
- Value returned is $2 = 6
- (gdb) info registers
- eax 0x6 6
- ecx 0x39ff7a48 973044296
- edx 0x1 1
- ebx 0x73fff4 7602164
- esp 0xbffff050 0xbffff050
- ebp 0xbffff078 0xbffff078
标签:0xbffff048,调用,x86,int,手推,gdb,test,main,0xbffff078 来源: https://www.cnblogs.com/axjlxy/p/15711442.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。