GDB: перерыв при сбросе переменной

Я пытаюсь отладить программу, которая, кажется, имеет проблемы с передачей указателя. У меня есть класс, определенный как ниже:

class data{
public:
data(int x, int y){
a=x;
b=y;
md = new metadata();
}
~data(){
delete md;
}

int a;
int b;

metadata* md; //metadata is another class
};

и несколько функций, которые получают указатель на объект данных:

void function1(data* d){
//do stuff
}

void function2(data* d){
//do stuff
function1(d);
}

void function3(data* d){
//do stuff
function2(d);
}

int main(){
//stuff
data* data = new data(1,2);
function3(d);
//other stuff
}

У меня установлена ​​точка останова в function1 и один в function3, где-то между этими двумя точками останова, md переназначается для указания на другой объект метаданных (dТем не менее, все еще указывает на тот же адрес памяти). Между двумя контрольными точками выполняются тысячи строк, поэтому просто невозможно просто пройти через них, поэтому я хочу смотреть и прерывать, когда md указатель изменен тем не мение, watch d->md для перерыва в function1 не работает, так как я получаю сообщение о том,

Watchpoint 1 deleted because the program has left the block in which its expression is valid

что предположительно происходит потому, что в d является локальным для контекста функции. Есть ли способ посмотреть адрес памяти, по которому md указатель хранится, чтобы увидеть, когда он будет изменен (т.е. когда md переназначается) и сломаться там?

1

Решение

Получить адрес d->md с помощью print d->md и смотреть выражение *((metadata *)0x....) вместо использования имени d,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]