Как найти утечку в пользовательских объектах
Наше приложение.Net 4.0 имеет утечку, которая вызывает его сбой после длительного использования. После расследования я установил, что "объекты пользователя" протекают. Пользовательский объект - это ресурс Windows, как описано здесь:
http://msdn.microsoft.com/en-us/library/ms725486%28v=VS.85%29.aspx
Windows выделяет 10000 пользовательских объектов на процесс. Другие ресурсы Windows, такие как объекты GDI и дескрипторы, являются постоянными во время работы приложения.
Я нашел аналогичный вопрос для C++, где решение требовало загрузки пакета под названием "обходной путь" из поиска Microsoft - подвох? $10K.
Использование профиля памяти Ant, я подозреваю, это связано с меню. Мы используем меню от SyncFusion, поэтому жизненный цикл вещей, связанных с меню, не может быть найден при просмотре кода. Так что это может быть ошибка, которую SynFusion должен решить.
Кто-нибудь имеет подобную утечку, используя меню SyncFusion? Ants говорит мне, что некоторые объекты PopupMenu находятся вокруг, но Ants не дает информацию о том, как найти, где объекты созданы (и, таким образом, определить, где их утилизировать).
Упомянутое в приведенном выше сообщении SO сообщение об утечке / обходе выглядит интересным, поскольку казалось, что оно перехватывает конкретные вызовы выделения объекта USER.
Предложения приветствуются
1 ответ
Если вы знаете, что меню висят вокруг, вы должны иметь возможность перечислять объекты GDI для вашего процесса и обрабатывать их с помощью DeleteMenu().
окна должны уведомлять ваше родительское окно, когда всплывающие меню отображаются и закрываются, так что это было бы идеальным местом для того, чтобы сделать снимки дескрипторов меню GDI и удалить более новые.
его довольно грубая сила и не рекомендуется для.net, где выполнение такого рода низкоуровневой манипуляции с GDI, возможно, капризно
я бы сделал простое тестовое приложение с меню SyncFusion, чтобы доказать свою точку зрения, и если проблема не исчезнет, обратитесь к поставщику