这总是GDB调试程序的地址吗?

时间:2011-10-01 23:46:58

标签: c++ gdb

我将缩小我的问题范围:

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;   
}

有人可以向我解释一下吗?谢谢。 (我也会把它标记为作业,虽然它确实不是。)

2 个答案:

答案 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 ...

请注意,这些与ab无关。

BTW在分配之前获取变量值的最佳方法是在赋值之前将printf变为它们。

答案 1 :(得分:0)

您的程序(至少部分)静态链接,main()几乎肯定是。重新启动计算机不会改变可执行文件中静态链接的部分。