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

Is this always the address for GDB debug program?

本文关键字:地址 调试程序 GDB      更新时间:2023-10-16

我会缩小我的问题范围:

对于相同的程序,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…

请注意,这些都与ab无关。

在赋值前获取变量值的最佳方法是在赋值前对它们进行printf

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