Я начал писать этот вопрос на сайте softwareengineering , но там, похоже, нет тега Dump
, поэтому я решил написать свой вопрос здесь.
Чтобы решитьутечки памяти в собственных приложениях C ++, я использую скрипт ( heap_stat.py ), основанный на библиотеке PYKD, в Windbg.Это дает отчет, подобный следующему:
...
0x0c3c88bc OwnApplication!CArray<ColumnInfo *,ColumnInfo *> Size:[0]
0x0c3c8900 mfc140u!CMapStringToString Size:[0], hashTable_Size:[17]
0x0c3c891c mfc140u!CMapStringToString Size:[264], hashTable_Size:[17]
0x0c3c8938 mfc140u!CMapStringToString Size:[0], hashTable_Size:[17]
...
(записи Size
и hashTable_Size
являются настраиваемыми дополнениями)
Создание двух из этих отчетов и учет их различий позволяет мне искатьдля утечки памяти.(Я иногда использую heap_stat.py -stat
)
Существуют различные проблемы с подходом heap_stat:
- heap_stat находит только объекты, имеющие виртуальные методы (он использует запись
vftable
вопределение класса символов для поиска первого поля классов. Это делается с помощью команды Windbg x /2 *!*vftable*
).
Если у класса нет виртуальных методов, соответствующие объекты не обнаруживаются heap_stat. - heap_stat кажется ошибочным: сегодня утром я имел дело с
CServiceModule
(это класс с виртуальными методами), но в отчете heap_stat не упоминается ни один объект CServiceModule
(скорее всего, команда Windbg heap -h 0
не делаетплохо разбирается).
Поэтому я начал задаваться вопросом: есть ли какой-либо другой настраиваемый инструмент (я бы хотел, чтобы он был изменяемым, чтобы я мог добавлять свои собственные запросы), который может перечислить всеобъекты (адрес памяти) и соответствующий им тип / класс?
Для вашей информации: я работаю с приложениями C ++, дампы памяти принимаютсяиспользуя procdump -e -ma
.