Посоветуйти способ которым можно было бы отслеживать всю выделяемую память во время работы приложения.
Поясню зачем мне это нужно: У меня происходит краш в приложении. Причем я знаю точно что происходит это в следствии вызова метода объекта который уже удален. Мне необходимо найти место в приложении в котором происходит удаление данного объекта. Поставить брэйкпоинт в деструкторе и др. простые методы здесь не подходя. Так вот, в стеке вызовов, когда произошел краш, я могу узнать адресс этого объекта. В идеале, зная этот адресс, я хотел бы в неком лог файле в котором бы во время выполнения приложения фиксировались все выделения памяти а также мето где это выделение происходило, найти по данному адресу где произошло выделение памяти. Затем, при запуске прогрммы получить адресс этого объекта и установить "breakpont on access", тоесть брейкпоинт на доступ к этому объекту. И когда сработает этот боэйкпоинт, я смогу установить кто удалил данный объект.
Спасибо
Re: Отслеживание выделения памяти во время работы приложения
Здравствуйте, barberis, Вы писали:
B>Добрый день,
B>Посоветуйти способ которым можно было бы отслеживать всю выделяемую память во время работы приложения.
[scip]
А язык программирования и Ось являются большим секретом? Но можно попробовать угадать. Если это с\с++ и Linux — то несомненно Valgrind. Если правильно настроить, то после чтения лога можно поставить диагноз. Если это делфи+виндовс, то FastMM. Для Visual Studio вроде даже встроенные инструменты есть
B>Спасибо
Re: Отслеживание выделения памяти во время работы приложения
Здравствуйте, barberis, Вы писали:
B>Добрый день,
B>Посоветуйти способ которым можно было бы отслеживать всю выделяемую память во время работы приложения.
B>Поясню зачем мне это нужно: У меня происходит краш в приложении. Причем я знаю точно что происходит это в следствии вызова метода объекта который уже удален. Мне необходимо найти место в приложении в котором происходит удаление данного объекта. Поставить брэйкпоинт в деструкторе и др. простые методы здесь не подходя. Так вот, в стеке вызовов, когда произошел краш, я могу узнать адресс этого объекта. В идеале, зная этот адресс, я хотел бы в неком лог файле в котором бы во время выполнения приложения фиксировались все выделения памяти а также мето где это выделение происходило, найти по данному адресу где произошло выделение памяти. Затем, при запуске прогрммы получить адресс этого объекта и установить "breakpont on access", тоесть брейкпоинт на доступ к этому объекту. И когда сработает этот боэйкпоинт, я смогу установить кто удалил данный объект.
Судя по всему у вас плюсы. Замените стандартный аллокатор памяти на свой отладочный с трэйсом вызовов. Хотя я з плюсами уже года 3 не имею дел, мне кажется что должны быть простые методы или инструменты. Но нужно знание хотя бы что за платформа. Тотже STLPort имел специальную отадочную версию библиотеки для таких случаев.
А вообще не знать места инстанциирования конкретного объекта это как же писать надо?
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Re: Отслеживание выделения памяти во время работы приложения
Здравствуйте, OdesitVadim, Вы писали:
OV>Здравствуйте, barberis, Вы писали:
B>>Добрый день,
B>>Посоветуйти способ которым можно было бы отслеживать всю выделяемую память во время работы приложения. OV>[scip] OV>А язык программирования и Ось являются большим секретом? Но можно попробовать угадать. Если это с\с++ и Linux — то несомненно Valgrind. Если правильно настроить, то после чтения лога можно поставить диагноз. Если это делфи+виндовс, то FastMM. Для Visual Studio вроде даже встроенные инструменты есть
B>>Спасибо
Вы правильно сказали. C++ Windows, Linux. О Valgrind: пересмотрел всю документацию. Не нашел. Можете подсказать конкетную опцию которую я должен использовать ?
Re[2]: Отслеживание выделения памяти во время работы приложе
Здравствуйте, Stoune, Вы писали:
S>Здравствуйте, barberis, Вы писали:
B>>Добрый день,
B>>Посоветуйти способ которым можно было бы отслеживать всю выделяемую память во время работы приложения.
B>>Поясню зачем мне это нужно: У меня происходит краш в приложении. Причем я знаю точно что происходит это в следствии вызова метода объекта который уже удален. Мне необходимо найти место в приложении в котором происходит удаление данного объекта. Поставить брэйкпоинт в деструкторе и др. простые методы здесь не подходя. Так вот, в стеке вызовов, когда произошел краш, я могу узнать адресс этого объекта. В идеале, зная этот адресс, я хотел бы в неком лог файле в котором бы во время выполнения приложения фиксировались все выделения памяти а также мето где это выделение происходило, найти по данному адресу где произошло выделение памяти. Затем, при запуске прогрммы получить адресс этого объекта и установить "breakpont on access", тоесть брейкпоинт на доступ к этому объекту. И когда сработает этот боэйкпоинт, я смогу установить кто удалил данный объект.
S>А вообще не знать места инстанциирования конкретного объекта это как же писать надо?
Я использую Qt фреймворк. Объекты создаются внутри Qt.
Re[3]: Отслеживание выделения памяти во время работы приложе
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]: Отслеживание выделения памяти во время работы приложе
Здравствуйте, 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]: Отслеживание выделения памяти во время работы приложе
Здравствуйте, barberis, Вы писали:
B>Спасибо, но мне нужно фиксировать не утечки памяти. Я перед тем как постить тему на форуме прогонял приложение в Valgrind — он ничего не нашел. Пробовал также экспериментальную тулзу ptr_check — валгринд крашится. Но вопрос не в этом. Я бы хотел выводить в лог адреса всей выделяемой во время работы приложения памяти. Но еще раз повторюсь: я среди параметров такой опции не нашел и как я понимаю ее вообще не существует. Или я не прав ?
Странно, что ничего не нашло.
думаю можно, если перекрыть у классов new. У всех не обязательно перекрывать, можно только у подозрительных.