2011-10-01 29 views
0

我将缩小我的问题范围:这是否始终是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

例如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

+0

而不使用断点,是否真的有办法查看此时地址0x80483fa中存储了什么值? (使用断点就意味着我正在执行,因此我可以查看寄存器。)谢谢jpalecek – CppLearner

+0

你是对的。但是,我无法直接从源代码使用printf(或cout)。我必须使用GDB来查看内存。我甚至尝试过其他的东西,比如ndisasm和hexdump。他们只告诉我说明。 – CppLearner

+0

你已经有了这个值 - 它是0x3fc45c7。但地址是错的,它指向的是代码,而不是数据。 – jpalecek

0

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

+0

谢谢你的回应。我该如何纠正呢? – CppLearner

+0

静态链接与此处的* anything *无关。 –

+0

@EmployedRussian:静态链接与提出的第一个问题有关,即“* GDB中的入口地址对于相同的程序保持不变(即使在重新引导之后,并且在重写源代码之后)。 为什么?*“报告的地址是虚拟地址,而不是物理地址。没有重新链接程序,该虚拟地址不会改变。 –

相关问题