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

标签 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

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


编辑 是的。谢谢。这是灾难

    (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,有些会清零,有些什么都不做,你会得到内存中的内容。

关于c++ - 为什么这些内存值在 GDB 中永远不会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7654688/

相关文章:

c++ - 在 LLVM 中,你如何检查一个 block 是否是一个合并 block

c++ - 如何提高文件读取速度?

gcc 中的编译标志用于调试 gdb 中的静态变量(在 AIX 操作系统中)

带有线程的 C++ 主程序需要两次 Ctrl+C 才能退出

c++ - 有没有一种理想的方法可以避免这种使用 Naked New 的情况?

javascript - 什么可能导致 Angular 无法正常渲染?

java - IntelliJ 中的heroku远程调试问题

c++ - 为什么每当我创建一个新的 C++ 项目时 Eclipse 默认为 Debug模式?

c++ - 无法使用 GDB 进入共享库中的函数

gdb - 如何使用 GDB 删除单个断点?