2010-07-01 149 views
1

考虑这个问题:解决问题!

[mdstest:~/onkar/test]$cat test.c 
#include<stdio.h> 

int main(int argc,char **argv) 
{ 
     printf("%p\n",main); 
     return 0; 
} 
[mdstest:~/onkar/test]$make 
gcc -g -Wall -o test test.c 
[mdstest:~/onkar/test]$./test 
0x8048368 ------------------------------------- (1) 
[mdstest:~/onkar/test]$gdb test 
::::::::::: 
::::::::::: 
(gdb) b main 
Breakpoint 1 at 0x8048384: file test.c, line 5. 
(gdb) r 
Starting program: /home/mdstest/onkar/test/test 
[Thread debugging using libthread_db enabled] 

Breakpoint 1, main (argc=1, argv=0xbffff2d4) at test.c:5 
5    printf("%p\n",main); 
(gdb) disassemble 
Dump of assembler code for function main: 
    0x08048368 <+0>:  push %ebp 
    0x08048369 <+1>:  mov %esp,%ebp 
    0x0804836b <+3>:  sub $0x8,%esp 
    0x0804836e <+6>:  and $0xfffffff0,%esp 
    0x08048371 <+9>:  mov $0x0,%eax 
    0x08048376 <+14>: add $0xf,%eax 
    0x08048379 <+17>: add $0xf,%eax 
    0x0804837c <+20>: shr $0x4,%eax 
    0x0804837f <+23>: shl $0x4,%eax 
    0x08048382 <+26>: sub %eax,%esp 
=> 0x08048384 <+28>: sub $0x8,%esp -----------------------------(2) 
    0x08048387 <+31>: push $0x8048368 
    0x0804838c <+36>: push $0x8048480 
    0x08048391 <+41>: call 0x80482b0 <[email protected]> 
    0x08048396 <+46>: add $0x10,%esp 
    0x08048399 <+49>: mov $0x0,%eax 
    0x0804839e <+54>: leave 
    0x0804839f <+55>: ret 
End of assembler dump. 

为什么(1)和(2)不同的地址?也就是说,为什么其他地址 正在打印(1),而调试器在其他位置停止?

回答

0

main”的地址确实是0x08048368 - 设置断点的源线5的地址恰好在代码准备好printf的参数之前的标准函数样板文件之后,调用它(以便n将执行例如printf-call语句)。

2

当一个函数被调用时,调用函数会执行一些操作,然后发出一个指向被调用函数的指令call

的被叫然后做了很多自己的样板 - 保存寄存器,移堆栈指针,为堆栈变量分配空间等

当你问GDB在函数的开始打破,它在之后打破样板文件,在的起始处您的实际代码为 - 因此该函数的地址将比gdb中断的点更早。