2010-07-01 182 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中斷的點更早。