Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: qtnoob1k от Сентябрь 29, 2010, 13:36



Название: Точка останова на участок памяти
Отправлено: qtnoob1k от Сентябрь 29, 2010, 13:36
Всем привет! Как в Qt Creator можно пометить участок памяти при изменении которого срабатывает точка останова?


Название: Re: Точка останова на участок памяти
Отправлено: b-s-a от Сентябрь 29, 2010, 13:57
ставишь обычную точку останова. Запускаешь, дожидаешься пока программа на нее встанет. Открываешь вкладку "точки останова", щелкаешь правой кнопкой на переменной (или на пустом месте) и выбираешь соответствующий пункт.


Название: Re: Точка останова на участок памяти
Отправлено: qtnoob1k от Сентябрь 29, 2010, 21:49
b-s-a, что-то я там не нашёл как это можно сделать. Может я плохо сформулировал, что же мне надо. Попробую написать яснее. Есть например глобальный int arr[10]; Где-то в программе, в каком-то потоке, не известно где в общем, значения элементов этого массива затираются, тоесть кто-то портит память. Хотелось бы остановиться в момент порчи памяти, чтобы узнать кто же это сделал. В отладчике windbg есть такая возможность и в Visual C++ тоже, мне интересно можно ли это сделать в Qt Creator.


Название: Re: Точка останова на участок памяти
Отправлено: Авварон от Сентябрь 30, 2010, 08:20
не уверен что gdb это вообще умеет.
вы уверены что у вас программа правильно спроектирована? если есть доступ к переменным из разных потоков, обычно делают геттеры/сеттеры, защищая мьютексами переменную.
а поставить брейкпоинт в ф-ию труда не составляет. можно тупо подвенить массив и перегрузить operator[], но это уже из области шаманства


Название: Re: Точка останова на участок памяти
Отправлено: b-s-a от Сентябрь 30, 2010, 09:44
Я ошибся, надо жать на раздел "переменные", затем правой кнопкой на переменной и выбрать пункт "Останов при изменении по адресу объекта..."


Название: Re: Точка останова на участок памяти
Отправлено: qtnoob1k от Октябрь 01, 2010, 15:48
вы уверены что у вас программа правильно спроектирована? если есть доступ к переменным из разных потоков, обычно делают геттеры/сеттеры, защищая мьютексами переменную.
а поставить брейкпоинт в ф-ию труда не составляет. можно тупо подвенить массив и перегрузить operator[], но это уже из области шаманства
Например ошибка в арифметике с указателем при которой он портит память какого-то объекта к данным которого можно обратиться только с помощью get/set.
Я ошибся, надо жать на раздел "переменные", затем правой кнопкой на переменной и выбрать пункт "Останов при изменении по адресу объекта..."
Странно, у меня такого пункта нет. Пользуюсь Qt Creator из SDK с gcc


Название: Re: Точка останова на участок памяти
Отправлено: navrocky от Октябрь 01, 2010, 16:17
gdb умеет точки ставить на память. Так что смотрите свежий creator или другие среды, ну или напрямую используйте gdb...

пруф - http://stackoverflow.com/questions/58851/can-i-set-a-breakpoint-on-memory-access-in-gdb


Название: Re: Точка останова на участок памяти
Отправлено: b-s-a от Октябрь 03, 2010, 21:29
Странно, у меня такого пункта нет. Пользуюсь Qt Creator из SDK с gcc
А какая версия? Не забывай, что это все обновляется периодически


Название: Re: Точка останова на участок памяти
Отправлено: qtnoob1k от Октябрь 05, 2010, 15:38
А какая версия? Не забывай, что это все обновляется периодически
Последния версия 4.7, я скачал неделю назад с сайта qt.nokia.com.