gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:12:03 28 4
gpt4 key购买 nike

当我执行以下命令时,我得到不同的 function() 地址
(gdb) 中断函数()
function() 0x804834a 处的断点 1。
(gdb) 打印函数()
function() 0x8048344 处的断点 1。
为什么两个地址不同?

最佳答案

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

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)

这里 func 指向函数中的第一条指令,push %ebp,但是当您设置断点时,gdb 在堆栈帧初始化指令之后设置它:

   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

这里是指令:

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

这部分是:

int a = 10;

关于gdb - 为什么使用 gdb break 和 gdb print 时函数的地址存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19546412/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com