Как отлаживать утечки объектов GDI? - PullRequest
5 голосов
/ 29 ноября 2011

Я не совсем уверен, как это сделать. Это большое приложение, и у нас GDI-объект «протекает» в большинстве наших форм.

Есть ли инструмент, чтобы помочь? Есть ли учебное пособие по использованию такого инструмента?

Должен ли я просто начать удалять код из наших форм, пока я не сузу преступника? (есть много кода).

Ответы [ 4 ]

16 голосов
/ 29 ноября 2011

Очень редко превышать ограничение в 10000 объектов только для объектов GDI, сборщик мусора позаботится о них, когда вы сами не вызовете их метод Dispose (). Гораздо более вероятный режим отказа превышает предел объекта для окон. Это очень легко сделать в Winforms, Controls.Clear () или Controls.Remove () быстро доставит вас туда, если вы явно не удалите удаленные элементы управления. Сборщик мусора не может их убрать.

Хорошую диагностику можно получить из Taskmgr.exe, вкладка Процессы. Просмотр + Выбор столбцов и отметьте маркеры, объекты пользователя и объекты GDI. Соблюдайте эти цифры для вашего процесса, пока вы его используете. Неуклонное увеличение числа одного из них является верным признаком того, что Windows заставит вашу программу бомбить, когда она откажется от вас. Квота по умолчанию составляет 10000 для каждого. Объект USER - это объект, указывающий на наличие проблемы с Controls.Clear / Remove. Объект GDI - это объект, который указывает на утечку объектов System.Drawing. Perfmon.exe - хороший инструмент, позволяющий проверить, достаточно ли часто запускается сборщик мусора для освобождения неразмещенных объектов System.Drawing.

С общей мудростью, что вызов Dispose () явно, где требуется, является хорошей практикой. Особенно для объектов Image и Bitmap, они занимают очень мало памяти GC, но много неуправляемой памяти, довольно легко бомбить программу с помощью OOM, когда вы не располагаете ими. Остерегайтесь неприятной ловушки в Properties.Resources, вы получаете новый объект каждый раз, когда используете его, и его нужно утилизировать. Всегда используйте оператор using в коде рисования.

1 голос
/ 09 мая 2015

Вы можете использовать perfmon (windows-> start-> perfmon) для мониторинга утечки GDI. Это позволяет отслеживать и регистрировать данные в CSV-файле.

1 голос
/ 30 ноября 2012

Оказывается, я просто использовал диспетчер задач и пытался воспроизвести проблему.Наша проблема с нашим приложением (и утечка объекта GDI) заключалась в том, что мы использовали статический объект и привязывали к нему.Была / есть ошибка в .net 3.5 (по крайней мере), когда форма при закрытии не будет знать, как правильно все распорядиться, и определенный графический объект останется в памяти.

1 голос
/ 29 ноября 2011

Получить копию Профилировщика Памяти Красных Ворот.http://www.red -gate.com / продукция / DotNet-разработка / Муравьи-памяти профайлер /

...