Debugging 当中断(函数名)/中断*(函数名)时,gdb中断地址不同 #包括 内部主(空){ 整数和=0; 总和+=0xabcd; printf(“%x”,总和); 返回0; }

Debugging 当中断(函数名)/中断*(函数名)时,gdb中断地址不同 #包括 内部主(空){ 整数和=0; 总和+=0xabcd; printf(“%x”,总和); 返回0; },debugging,gdb,break,symbols,memory-address,Debugging,Gdb,Break,Symbols,Memory Address,这是我的代码,当我使用gdb时,我可以在断开main/break*main时找到不同的地址 当我刚输入反汇编main时,它显示如下: #include <stdio.h> int main(void){ int sum = 0; sum += 0xabcd; printf(“%x”, sum); return 0; } 主函数的汇编程序代码转储: 0x080483c4:推送%ebp 0x080483c5:mov%esp,%ebp 0x080483c7:和$

这是我的代码,当我使用gdb时,我可以在断开main/break*main时找到不同的地址

当我刚输入反汇编main时,它显示如下:

#include <stdio.h>

int main(void){
   int sum = 0;
   sum += 0xabcd;
   printf(“%x”, sum);
   return 0;
}
主函数的汇编程序代码转储: 0x080483c4:推送%ebp 0x080483c5:mov%esp,%ebp 0x080483c7:和$0xfffffff0,%esp 0x080483ca:子$0x20,%esp 0x080483cd:movl$0x0,0x1c(%esp) 0x080483d5:添加$0xabcd,0x1c(%esp) 0x080483dd:mov$0x80484c0,%eax 0x080483e2:mov 0x1c(%esp),%edx 0x080483e6:mov%edx,0x4(%esp) 0x080483ea:mov%eax,(%esp) 0x080483ed:调用0x80482f4 0x080483f2:mov$0x0,%eax 0x080483f7:离开 0x080483f8:ret 汇编程序转储结束。 因此,当我键入[break*main]时,它启动0x080483c4,但键入[break main]时,它启动0x080483cd


为什么起始地址不同?

完全是猜测——准备完全错了

*函数的主if地址

断开内部main是执行函数时在函数内部停止的第一个可用地址

请注意,0x080483cd是调试器在修改变量时可以停止的第一个位置(即为和赋值零)

当您在0x080483c4中断时,这是在C不知道的设置汇编程序之前

为什么地址不同

因为
中断函数
中断*地址
是(
*地址
在设置堆栈帧和参数之前指定函数的第一条指令的地址)

在第一种情况下,GDB跳过函数prolog(设置当前帧)

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.