为什么在使用gdb break和gdb print时函数的地址会有差异?

为什么在使用gdb break和gdb print时函数的地址会有差异?,gdb,Gdb,当我执行以下命令时,会得到函数()的不同地址 (gdb)中断函数() 函数()0x804834a处的断点1。 (gdb)打印函数() 函数()0x8048344处的断点1。 为什么两个地址都有差异?Gdb在设置断点之后,与正确设置之前一样,它无法显示预期的状态,如局部变量等 Break设置断点并打印序言后第一条指令的地址,而print打印函数中实际第一条指令的地址 您可以通过执行break*0x8048344将断点设置为实际的第一条指令,然后在序言中和序言之后观察局部变量的值。此输出可能不正确,

当我执行以下命令时,会得到函数()的不同地址
(gdb)中断函数()

函数()0x804834a处的断点1。
(gdb)打印函数()

函数()0x8048344处的断点1。

为什么两个地址都有差异?

Gdb在设置断点之后,与正确设置之前一样,它无法显示预期的状态,如局部变量等

Break设置断点并打印序言后第一条指令的地址,而print打印函数中实际第一条指令的地址


您可以通过执行break*0x8048344将断点设置为实际的第一条指令,然后在序言中和序言之后观察局部变量的值。

此输出可能不正确,如果您执行以下操作:

int func(void) {
  int a = 10;
  printf("%d\n", a);
  return 1;
}
将其加载到gdb后:

(gdb) p func
$1 = {int (void)} 0x4016b0 <func>
(gdb) b func
Breakpoint 1 at 0x4016b6: file file.c, line 4.
(gdb) disassemble func
Dump of assembler code for function func:
   0x004016b0 <+0>:     push   %ebp
   0x004016b1 <+1>:     mov    %esp,%ebp
   0x004016b3 <+3>:     sub    $0x28,%esp
   0x004016b6 <+6>:     movl   $0xa,-0xc(%ebp)
   0x004016bd <+13>:    mov    -0xc(%ebp),%eax
   0x004016c0 <+16>:    mov    %eax,0x4(%esp)
   0x004016c4 <+20>:    movl   $0x405064,(%esp)
   0x004016cb <+27>:    call   0x403678 <printf>
   0x004016d0 <+32>:    mov    $0x1,%eax
   0x004016d5 <+37>:    leave
   0x004016d6 <+38>:    ret
End of assembler dump.
(gdb)
函数指令实际开始的位置:

=> 0x004016b6 <+6>:     movl   $0xa,-0xc(%ebp)
   0x004016bd <+13>:    mov    -0xc(%ebp),%eax
   0x004016c0 <+16>:    mov    %eax,0x4(%esp)
   0x004016c4 <+20>:    movl   $0x405064,(%esp)
   0x004016cb <+27>:    call   0x403678 <printf>
   0x004016d0 <+32>:    mov    $0x1,%eax
   0x004016d5 <+37>:    leave
   0x004016d6 <+38>:    ret
这部分是:

int a = 10;
movl   $0xa,-0xc(%ebp) ; 0xa = 10
int a = 10;