x86手推调用栈
作者:互联网
当程序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