我将缩小我的问题范围:
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;
}
有人可以向我解释一下吗?谢谢。 (我也会把它标记为作业,虽然它确实不是。)
答案 0 :(得分:2)
例如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
无关。
BTW在分配之前获取变量值的最佳方法是在赋值之前将printf
变为它们。
答案 1 :(得分:0)
您的程序(至少部分)静态链接,main()
几乎肯定是。重新启动计算机不会改变可执行文件中静态链接的部分。