2016-02-28 1 views
2

Так я бегу программу в GDB, и я поставил точку наблюдения для определенной переменной (указатель на объект, чтобы быть конкретным), которая существует по адресу 0x6030b0:GDB точка наблюдения не обнаруживает изменения в переменной

(gdb) wa (TNode<UCSDStudent> **)0x6030b0 
Watchpoint 7: (TNode<UCSDStudent> **)0x6030b0 

Я знаю, что значение указателя:

(gdb) p/x *((TNode<UCSDStudent> **)0x6030b0) 
$5 = 0x603130 

я поставил точку останова в строке 115, конец моей программы. Я тогда продолжать эту точку останова:

(gdb) c 
Continuing. 

No more reverse-execution history. 
main (argc=2, argv=0x7fffffffd9a8) at Driver.c:115 
115  ST.Write(cout << "\nFinal Symbol Table:\n"); 

Это означает, что значение указателя не изменится, потому что GDB не останавливается ни на какой точки наблюдения. Теперь напечатаю значение указателя:

(gdb) p/x *((TNode`<UCSDStudent>` **)0x6030b0) 
$6 = 0x0 

Однако значение указателя явно изменилось. Что это может объяснить?

Спасибо.

ответ

1

Команда watch концептуально смотрит, меняется ли выражение. С помощью watch -location команда вместо этого отслеживает, меняется ли местоположение (разница заключается в том, что если переменная выходит за пределы области видимости, простой watch обновит ее идею выражения, тогда как -location не будет - вы обычно хотите -location).

Во всяком случае, рассмотрим ваше выражение:

(gdb) wa (TNode<UCSDStudent> **)0x6030b0 

Это является константой. Таким образом, он никогда не изменится.

Вы, вероятно, хотите:

(gdb) watch -location *(TNode<UCSDStudent> **)0x6030b0