Краткий ответ: используйте watch -location pObject->dPrice
или краткую форму watch -l
.
Длинный ответ: Цитирование руководства GDB :
Наблюдение за комплексомвыражения, которые ссылаются на многие переменные, также могут исчерпать ресурсы, доступные для аппаратных точек наблюдения.Это потому, что GDB необходимо отслеживать каждую переменную в выражении с отдельно выделенными ресурсами.
GDB буквально следит за самим выражением, а не по тому адресу, на который оно указывает.В этом случае это означает, что точка останова сработает, если само значение pObject
будет изменено для указания нового dPrice
;есть не только точка наблюдения для pObject->dPrice
, но и точка для pObject
.Это может быть больше, чем доступно.
Более подробный пример:
// Set a watchpoint on '*p' before running
#include <stdio.h>
int a = 0;
int b = 0;
int c = 0;
int* p = &a;
int main()
{
puts("Hi"); // Dummy lines to make the results clearer, watchpoints stop at the line after the change
*p = 1; // Breaks: *p was changed from 0 to 1
puts("Hi");
a = 2; // Breaks: a is *p, which changed from 1 to 2
puts("Hi");
p = &b; // Breaks: p is now b, changing *p from 2 to 0
puts("Hi");
p = &c; // Doesn't break: while p changed, *p is still 0
puts("Hi");
p = NULL; // Breaks: *p is now unreadable
puts("Hi");
return 0;
}
Теоретически это полезная функция;Вы можете наблюдать сложное выражение, ломающееся, как только оно ложное, что-то вроде постоянно проверяемого утверждения.Например, вы можете watch a==b
в вышеуказанной программе.
На практике это неожиданно, часто вызывает эту проблему, и обычно это не то, что вам нужно.
Чтобы смотреть только цельадрес, используйте watch -location pObject->dPrice
.(Это доступно с GDB 7.3, выпущенной в июле 2011 года; если вы используете что-то более старое, используйте print &pObject->dPrice
и watch *(double*)0x12345678
или любой другой адрес, который он печатает.)