Отслеживание выделения памяти во время работы приложения
От: barberis  
Дата: 15.05.09 18:51
Оценка:
Добрый день,

Посоветуйти способ которым можно было бы отслеживать всю выделяемую память во время работы приложения.

Поясню зачем мне это нужно: У меня происходит краш в приложении. Причем я знаю точно что происходит это в следствии вызова метода объекта который уже удален. Мне необходимо найти место в приложении в котором происходит удаление данного объекта. Поставить брэйкпоинт в деструкторе и др. простые методы здесь не подходя. Так вот, в стеке вызовов, когда произошел краш, я могу узнать адресс этого объекта. В идеале, зная этот адресс, я хотел бы в неком лог файле в котором бы во время выполнения приложения фиксировались все выделения памяти а также мето где это выделение происходило, найти по данному адресу где произошло выделение памяти. Затем, при запуске прогрммы получить адресс этого объекта и установить "breakpont on access", тоесть брейкпоинт на доступ к этому объекту. И когда сработает этот боэйкпоинт, я смогу установить кто удалил данный объект.

Спасибо
Re: Отслеживание выделения памяти во время работы приложения
От: OdesitVadim Украина  
Дата: 16.05.09 19:50
Оценка:
Здравствуйте, barberis, Вы писали:

B>Добрый день,


B>Посоветуйти способ которым можно было бы отслеживать всю выделяемую память во время работы приложения.

[scip]
А язык программирования и Ось являются большим секретом? Но можно попробовать угадать. Если это с\с++ и Linux — то несомненно Valgrind. Если правильно настроить, то после чтения лога можно поставить диагноз. Если это делфи+виндовс, то FastMM. Для Visual Studio вроде даже встроенные инструменты есть

B>Спасибо
Re: Отслеживание выделения памяти во время работы приложения
От: Stoune  
Дата: 17.05.09 09:34
Оценка:
Здравствуйте, barberis, Вы писали:

B>Добрый день,


B>Посоветуйти способ которым можно было бы отслеживать всю выделяемую память во время работы приложения.




B>Поясню зачем мне это нужно: У меня происходит краш в приложении. Причем я знаю точно что происходит это в следствии вызова метода объекта который уже удален. Мне необходимо найти место в приложении в котором происходит удаление данного объекта. Поставить брэйкпоинт в деструкторе и др. простые методы здесь не подходя. Так вот, в стеке вызовов, когда произошел краш, я могу узнать адресс этого объекта. В идеале, зная этот адресс, я хотел бы в неком лог файле в котором бы во время выполнения приложения фиксировались все выделения памяти а также мето где это выделение происходило, найти по данному адресу где произошло выделение памяти. Затем, при запуске прогрммы получить адресс этого объекта и установить "breakpont on access", тоесть брейкпоинт на доступ к этому объекту. И когда сработает этот боэйкпоинт, я смогу установить кто удалил данный объект.


Судя по всему у вас плюсы. Замените стандартный аллокатор памяти на свой отладочный с трэйсом вызовов. Хотя я з плюсами уже года 3 не имею дел, мне кажется что должны быть простые методы или инструменты. Но нужно знание хотя бы что за платформа. Тотже STLPort имел специальную отадочную версию библиотеки для таких случаев.
А вообще не знать места инстанциирования конкретного объекта это как же писать надо?
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Re: Отслеживание выделения памяти во время работы приложения
От: ambel-vlad Беларусь  
Дата: 18.05.09 17:19
Оценка:
Hi barberis

попробуй стукнуться к CreatorCray. Он что-то подобное писал, когда у него на проекте были, вроде, похожие вопросы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Отслеживание выделения памяти во время работы приложе
От: barberis  
Дата: 19.05.09 17:32
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Здравствуйте, barberis, Вы писали:


B>>Добрый день,


B>>Посоветуйти способ которым можно было бы отслеживать всю выделяемую память во время работы приложения.

OV>[scip]
OV>А язык программирования и Ось являются большим секретом? Но можно попробовать угадать. Если это с\с++ и Linux — то несомненно Valgrind. Если правильно настроить, то после чтения лога можно поставить диагноз. Если это делфи+виндовс, то FastMM. Для Visual Studio вроде даже встроенные инструменты есть

B>>Спасибо


Вы правильно сказали. C++ Windows, Linux. О Valgrind: пересмотрел всю документацию. Не нашел. Можете подсказать конкетную опцию которую я должен использовать ?
Re[2]: Отслеживание выделения памяти во время работы приложе
От: barberis  
Дата: 19.05.09 17:35
Оценка:
Здравствуйте, Stoune, Вы писали:

S>Здравствуйте, barberis, Вы писали:


B>>Добрый день,


B>>Посоветуйти способ которым можно было бы отслеживать всю выделяемую память во время работы приложения.




B>>Поясню зачем мне это нужно: У меня происходит краш в приложении. Причем я знаю точно что происходит это в следствии вызова метода объекта который уже удален. Мне необходимо найти место в приложении в котором происходит удаление данного объекта. Поставить брэйкпоинт в деструкторе и др. простые методы здесь не подходя. Так вот, в стеке вызовов, когда произошел краш, я могу узнать адресс этого объекта. В идеале, зная этот адресс, я хотел бы в неком лог файле в котором бы во время выполнения приложения фиксировались все выделения памяти а также мето где это выделение происходило, найти по данному адресу где произошло выделение памяти. Затем, при запуске прогрммы получить адресс этого объекта и установить "breakpont on access", тоесть брейкпоинт на доступ к этому объекту. И когда сработает этот боэйкпоинт, я смогу установить кто удалил данный объект.


S>А вообще не знать места инстанциирования конкретного объекта это как же писать надо?


Я использую Qt фреймворк. Объекты создаются внутри Qt.
Re[3]: Отслеживание выделения памяти во время работы приложе
От: OdesitVadim Украина  
Дата: 20.05.09 07:57
Оценка:
Здравствуйте, barberis, Вы писали:


B>Вы правильно сказали. C++ Windows, Linux. О Valgrind: пересмотрел всю документацию. Не нашел. Можете подсказать конкетную опцию которую я должен использовать ?

Вот к примеру я обычно запускаю так
valgrind --leak-check=full --show-reachable=yes --log-file=log.txt -v --track-fds=yes ./имяподопытной параметры_подопытной
первый параметр — отслеживать утечки.
второй — делать их анализ, для начала можно убрать.
третий — сохранять в файл. По умолчанию выводит на консоль, может быть неудобно.
четвертый — делать более ошбирный вывод. Часто бывает лишняя информация.
пятый параметр — отслеживать открытые/закрытые дескрипторы
В такой конструкции, если где то происходит "нарушение", выводиться стек вызовов, некоторые параметры, адреса строк в исходном файле (если он конечно скомпилирован с поддержкой отладки, опция -g). Если проект большой — может быть много информации. Иногда бывает ложная информация — особенно внутри библиотеки stl. Поэтому лучше искать то, что сразу понятно и устранять, потом снова прогнать. Некоторые ошибки связанные, так что...
Мне valgrind помог найти один delete, где следовало бы написать delete[]. Я несколько часов разбрирал код, пока понял, что он прав. Теперь я там упростил
Re[4]: Отслеживание выделения памяти во время работы приложе
От: barberis  
Дата: 20.05.09 13:37
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Здравствуйте, barberis, Вы писали:



B>>Вы правильно сказали. C++ Windows, Linux. О Valgrind: пересмотрел всю документацию. Не нашел. Можете подсказать конкетную опцию которую я должен использовать ?

OV>Вот к примеру я обычно запускаю так
OV>valgrind --leak-check=full --show-reachable=yes --log-file=log.txt -v --track-fds=yes ./имяподопытной параметры_подопытной
OV>первый параметр — отслеживать утечки.
OV>второй — делать их анализ, для начала можно убрать.
OV>третий — сохранять в файл. По умолчанию выводит на консоль, может быть неудобно.
OV>четвертый — делать более ошбирный вывод. Часто бывает лишняя информация.
OV>пятый параметр — отслеживать открытые/закрытые дескрипторы
OV>В такой конструкции, если где то происходит "нарушение", выводиться стек вызовов, некоторые параметры, адреса строк в исходном файле (если он конечно скомпилирован с поддержкой отладки, опция -g). Если проект большой — может быть много информации. Иногда бывает ложная информация — особенно внутри библиотеки stl. Поэтому лучше искать то, что сразу понятно и устранять, потом снова прогнать. Некоторые ошибки связанные, так что...
OV>Мне valgrind помог найти один delete, где следовало бы написать delete[]. Я несколько часов разбрирал код, пока понял, что он прав. Теперь я там упростил

Спасибо, но мне нужно фиксировать не утечки памяти. Я перед тем как постить тему на форуме прогонял приложение в Valgrind — он ничего не нашел. Пробовал также экспериментальную тулзу ptr_check — валгринд крашится. Но вопрос не в этом. Я бы хотел выводить в лог адреса всей выделяемой во время работы приложения памяти. Но еще раз повторюсь: я среди параметров такой опции не нашел и как я понимаю ее вообще не существует. Или я не прав ?
Re[5]: Отслеживание выделения памяти во время работы приложе
От: OdesitVadim Украина  
Дата: 20.05.09 13:48
Оценка:
Здравствуйте, barberis, Вы писали:

B>Спасибо, но мне нужно фиксировать не утечки памяти. Я перед тем как постить тему на форуме прогонял приложение в Valgrind — он ничего не нашел. Пробовал также экспериментальную тулзу ptr_check — валгринд крашится. Но вопрос не в этом. Я бы хотел выводить в лог адреса всей выделяемой во время работы приложения памяти. Но еще раз повторюсь: я среди параметров такой опции не нашел и как я понимаю ее вообще не существует. Или я не прав ?

Странно, что ничего не нашло.
думаю можно, если перекрыть у классов new. У всех не обязательно перекрывать, можно только у подозрительных.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.