这个地址总是GDB调试程序的地址吗?
Is this always the address for GDB debug program?
我会缩小我的问题范围:
对于相同的程序,GDB中的入口地址保持不变(即使在重新启动和重写源代码之后)。
为什么?
例如0x80483f4为起始地址。
**0x80483f4** <main()> push %ebp │
│0x80483f5 <main()+1> mov %esp,%ebp │
│0x80483f7 <main()+3> sub $0x10,%esp │
│0x80483fa <main()+6> movl $0x3,-0x4(%ebp) │
│0x8048401 <main()+13> movl $0x3,-0x8(%ebp) │
│0x8048408 <main()+20> mov $0x0,%eax │
│0x804840d <main()+25> leave │
│0x804840e <main()+26> ret
除此之外,我们从0x80483fa得到的值总是相同的。
$2 = 0x80483fa <main()+6>
(gdb) x $2
0x80483fa <main()+6>: 0x3fc45c7
(gdb) p 0x3fc45c7
$3 = 66864583 <-- even after reboot.
这对我意味着什么?
我对每次赋值之前和之后的值感兴趣(稍后说c = a+b),而不使用断点一次执行一行。
源代码:
int main()
{
int b = 3;
int a = 3;
return 0;
}
有人能给我解释一下吗?谢谢。(我也会把它标记为家庭作业,尽管它实际上不是)
例如0x80483f4为起始地址。
这是可能的。除非您有PIE(独立于位置的可执行文件),否则它将永远保持不变(对于一个二进制文件)。
$2 = 0x80483fa <main()+6> (gdb) x $2 0x80483fa <main()+6>: 0x3fc45c7
这是main()+6
处指令的二进制表示。不会在一个二进制文件中更改。
(gdb) p 0x3fc45c7 $3 = 66864583 <-- even after reboot.
这意味着0x3fc45c7是十进制的66864583…
请注意,这些都与a
或b
无关。
在赋值前获取变量值的最佳方法是在赋值前对它们进行printf
。
您的程序(至少部分)是静态链接的,main()
几乎肯定是静态链接的。重新启动计算机不会改变可执行文件中静态链接的部分
相关文章:
- 如何在添加文件的情况下在VSCode中调试C++程序
- 如何在 VsCode 上调试 C++/C 程序
- 调试C++程序时遇到问题
- 如何模拟时间的流逝来调试程序?
- 如何在main()之前调试程序崩溃
- PIN从指令地址获取程序集操作码
- 当Visual Studio停止调试程序时会自动清理内存
- VS 代码C++:无法启动调试 - 程序路径丢失或无效
- GCC中地址清理程序的有意义的堆栈跟踪
- 如何在 arm 平台中调试 c 程序中的全局变量损坏
- 如何调试 C++ 程序
- 如何使用数组调试C++程序
- 使用Valgrind调试程序-检测分段故障
- 使用GDB查找函数对应的内存地址/调试
- 调试程序时奇怪的GDB消息C++
- 类型类的向量(地址簿程序)
- 无法使用地址簿程序 c++ 中的数组和结构向右移动
- 使用gdb在MS VC++2010 Express中编译的调试程序
- 调试C程序的断言错误
- 这个地址总是GDB调试程序的地址吗?