为什么这些内存值在GDB中永远不会改变?

时间:2011-10-04 22:19:47

标签: c++ debugging gdb stack-trace

再次感谢您迄今为止的大力帮助。

源代码:

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) 我注意到,无论重启调试或重启多少次,任何赋值之前的a,b和c的值都保持不变。

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

为什么?

(2) 另一个奇怪的事情是,在每个stepi之后,esp永远不会改变,与Visual Studio不同,我们可以观察到esp和ebp的变化...... 可以在此处找到日志:info registers

这是什么问题? 非常感谢你。


EDIT  是。谢谢。这是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.

1 个答案:

答案 0 :(得分:1)

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