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

Why these memory values never change in GDB?

本文关键字:永远 改变 GDB 内存 为什么      更新时间:2023-10-16

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

源代码:

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 - 0 demo.cpp

为什么?

(2)另一个奇怪的事情是,在每一步之后,esp都没有改变,不像在Visual Studio中,我们可以观察到esp和ebp的变化……日志信息可以在这里找到:info registers

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


编辑是的。谢谢你!

    (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.

不能保证初始化之前的变量值总是相同的。一些调试器将内存初始化为固定值,例如0xDEADBEEF,一些将清除为零,其他将不做任何事情,您将获得内存中的内容。