Почему эти значения памяти никогда не меняются в GDB? - PullRequest
0 голосов
/ 05 октября 2011

Еще раз, спасибо вам за большую помощь до сих пор.

Исходный код:

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) Другая странная вещь в том, чтопосле каждого шага esp никогда не менялся, в отличие от Visual Studio, мы можем наблюдать изменение esp и ebp ... Журнал можно найти здесь: информационные регистры

Что такоепроблема здесь?Большое спасибо.


РЕДАКТИРОВАТЬ Да.Спасибо.Вот такие вот дисасы

    (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 Ответ

1 голос
/ 05 октября 2011

Нет гарантии, что значения переменных до инициализации всегда будут одинаковыми.Некоторые отладчики инициализируют память фиксированными значениями, например, 0xDEADBEEF, некоторые сбрасывают в ноль, другие ничего не делают, и вы получаете то, что было в памяти.

...