#include <stdio.h>
int main(void){
int sum = 0;
sum += 0xabcd;
printf(“%x”, sum);
return 0;
}
这是我的代码,当我使用gdb时,我可以在break main / break * main时找到不同的地址。
当我输入反汇编时,它显示如下:
Dump of assembler code for function main:
0x080483c4 <+0>: push %ebp
0x080483c5 <+1>: mov %esp,%ebp
0x080483c7 <+3>: and $0xfffffff0,%esp
0x080483ca <+6>: sub $0x20,%esp
0x080483cd <+9>: movl $0x0,0x1c(%esp)
0x080483d5 <+17>:addl $0xabcd,0x1c(%esp)
0x080483dd <+25>:mov $0x80484c0,%eax
0x080483e2 <+30>:mov 0x1c(%esp),%edx
0x080483e6 <+34>:mov %edx,0x4(%esp)
0x080483ea <+38>:mov %eax,(%esp)
0x080483ed <+41>:call 0x80482f4 <printf@plt>
0x080483f2 <+46>:mov $0x0,%eax
0x080483f7 <+51>:leave
0x080483f8 <+52>:ret
End of assembler dump.
所以当我输入[break * main]时它会启动0x080483c4但输入[break main]它会启动0x080483cd
为什么起始地址不同?
答案 0 :(得分:5)
为什么地址不同。
因为break function
和break *address
是not the same thing(*address
指定函数的第一条指令的地址,所以在堆栈框架和参数设置之前)。
在第一种情况下,GDB跳过功能prolog(设置当前帧)。
答案 1 :(得分:0)
总猜 - 并准备完全错误。
*主要是函数的地址
在main内部断开是第一个在执行函数时停在函数内的可用地址。
请注意,0x080483cd是调试器在修改变量时可以停止的第一个位置(即将零赋值给总和)
当您在0x080483c4处断开时,这是在C不知道的设置汇编程序之前