当我执行以下命令时,我得到函数的不同地址()
(gdb) break function()
函数()0x804834a处的断点1。
(gdb) print function()
函数()0x8048344处的断点1。
为什么这两个地址有区别?为什么在使用gdb break和gdb print时函数的地址有所不同?
3
A
回答
3
GDB设置断点function prologue后,像以前一样设置正确的东西也不能证明像局部变量的预期状态等
歇为此套断点和开幕后第一条指令的地址打印,而打印功能中打印实际第一条指令的地址。
你可以通过执行break * 0x8048344来设置一个断点到实际的第一条指令,然后在那里和序言之后观察局部变量的值。
4
该输出可以是不正确的,这将是,如果你做了一件为:
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;
相关问题
- 1. 为什么gdb显示的函数地址与nm不同?
- 2. gdb print或stack alloc有什么问题?
- 3. 为什么跳进不可用的地址(GDB)
- 4. 为什么一个局部变量的地址在执行多次时会有所不同,但在使用GDB进行调试时不会有所不同?
- 5. gdb,break vs tbreak和watchpoint
- 6. 为什么我不能在gdb中使用函数?
- 7. GDB'地址'。他们是什么?
- 8. break * main VS break main()在GDB中
- 9. 返回地址GDB:.exe与.elf不同。
- 10. gcc -gdb-pretty print stl
- 11. gdb print NSString调试
- 12. 如何grep gdb print
- 13. 为什么cortex-m3在gdb中重置为地址0?
- 14. 为什么gdb中的print命令为C++ std :: strings返回\ 035?
- 15. 在没有gdb的libc(execve)中获取函数的地址
- 16. GDB的break break标签跳线
- 17. 为什么这个地址在gdb中改变?
- 18. (gdb)p/x在gdb python脚本中相当于什么?
- 19. gdb为什么会挂起?
- 20. GDB不能调用函数
- 21. 为什么GDB中的一些内存地址比其他内存地址短?
- 22. gdb&找出什么时候写入内存地址
- 23. C/GDB:显示地址
- 24. GDB:地址范围映射
- 25. 在gdb
- 26. 为什么使用java -jar调用print函数时不打印?
- 27. 为什么gfortran/gdb在调试时产生不同的数字结果?
- 28. GDB的“这里”是什么?
- 29. 为什么GDB不显示行号或函数名称?
- 30. 在gdb为什么我不能用printf临时结构