2011-10-04 125 views
0

再一次感谢您迄今为止所给予的巨大帮助。为什么这些内存值在GDB中永远不会改变?

的源代码:

int main() 
{ 
    int a = 20; 
    int b = 10; 
    int c; 
    c = a + b; 
return 0; 
} 

Reading symbols from /home/jwxie/a.out...done. 
(gdb) start 
Temporary breakpoint 1 at 0x80483fa: file demoo.cpp, line 3. 
Starting program: /home/jwxie/a.out 

Temporary breakpoint 1, main() at demoo.cpp:3 
3  int a = 20; 
(gdb) x/wx $ebp-8 
0xbffff3a0: 0x08048420 
(gdb) x/wx $ebp-4 
0xbffff3a4: 0x00000000 
(gdb) info locals 
a = 0 
b = 134513696 
c = 3903476 
(gdb) x/wx $ebp-8 
0xbffff3a0: 0x08048420 
(gdb) x/wx $ebp-12 
0xbffff39c: 0x003b8ff4 

-- Now execute int a = 20; 
(gdb) stepi 
4  int b = 10; 

(gdb) x/wx $ebp-4 
0xbffff3a4: 0x00000014 

(gdb) info locals 
a = 20 
b = 134513696 
c = 3903476 

(1) 我注意到的,b和c之前任何转让给值保持相同,不管有多少次重新启动调试或重新启动。

我甚至禁用优化:G ++ -g -O0 demo.cpp

这是为什么?

(2) 另一个奇怪的是,每个步骤1后,ESP从来没有改变过,不像在Visual Studio中,我们可以观察到ESP和EBP ...的变化 该日志可以在这里找到:info registers

这里有什么问题? 非常感谢。


编辑 是的。谢谢。这里是disas

(gdb) disas /m main 
Dump of assembler code for function main(): 
2 { 
    0x080483f4 <+0>: push %ebp 
    0x080483f5 <+1>: mov %esp,%ebp 
    0x080483f7 <+3>: sub $0x10,%esp 

3  int a = 20; 
    0x080483fa <+6>: movl $0x14,-0x4(%ebp) 

4  int b = 10; 
    0x08048401 <+13>: movl $0xa,-0x8(%ebp) 

5  int c; 
6  c = a + b; 
    0x08048408 <+20>: mov -0x8(%ebp),%eax 
    0x0804840b <+23>: mov -0x4(%ebp),%edx 
    0x0804840e <+26>: lea (%edx,%eax,1),%eax 
    0x08048411 <+29>: mov %eax,-0xc(%ebp) 

7 return 0; 
    0x08048414 <+32>: mov $0x0,%eax 

8 } 
    0x08048419 <+37>: leave 
    0x0804841a <+38>: ret  

End of assembler dump. 
+0

你能告诉我们main()的反汇编吗?我怀疑,那里没有太多(如果有的话)代码来处理a,b和c。 –

+0

你尝试过'而不是'stepi'吗? 'stepi'执行一个单独的命令。 'step'步骤1行C++ – Alan

+0

@Alan是的。 ESP不会改变。在VS中,当我们逐步执行每条指令时,ESP正在发生变化(无论是step还是stepi)。 – CppLearner

回答

1

不能保证变量值,在初始化之前,将始终是相同的。某些调试器会将存储器初始化为固定值,例如0xDEADBEEF,有些会清零,其他人不会做任何事情,你会得到内存中的内容。

+0

好的。是。看起来第一个变量总是为零,经过3个不同的测试。谢谢。 – CppLearner

+0

如果您接受此答案,请单击复选标记。 –

+0

我的不好。我通常在完成作业后检查答案或完全理解答案。谢谢。 – CppLearner

相关问题