首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >break (函数名)/ break *(函数名)时gdb中断地址不同

break (函数名)/ break *(函数名)时gdb中断地址不同
EN

Stack Overflow用户
提问于 2012-09-26 10:09:56
回答 2查看 292关注 0票数 4
代码语言:javascript
复制
#include <stdio.h>

int main(void){
   int sum = 0;
   sum += 0xabcd;
   printf(“%x”, sum);
   return 0;
}

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

当我只输入disassemble main时,它显示如下:

代码语言:javascript
复制
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

为什么起始地址不同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-26 14:56:39

为什么地址不同。

因为break functionbreak *addressnot the same thing(*address指定函数的第一条指令的地址,在堆栈帧和参数设置之前)。

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

票数 5
EN

Stack Overflow用户

发布于 2012-09-26 10:23:18

完全是猜测--并准备好完全错了。

*函数的main if地址

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

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

当您在0x080483c4处中断时,这是在安装汇编程序之前,C对此一无所知

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12593638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档