| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Как найти утечку GDI - ресурсов? |
| Автор: Dreamer_0x01 31.3.2008, 16:24 |
| Спустя 20-40 минут работы приложение падает на строчке, в которой создается CreateCompatibleBitmap(). Есть подозрение, что где-то во время прорисовки не сделан DeleteObject(). Но никак не могу найти, где это, прорисовки в приложении достаточно много. Есть ли какое-нибудь средство, чтобы узнать остаток ресурсов до вызова какой-либо функции, а затем после нее? Спасибо. |
| Автор: S.A.G. 31.3.2008, 16:49 |
| Windows сама очищает память после отработки процесса. Так что совсем не обязательно удалять ресурсы. |
| Автор: Dreamer_0x01 31.3.2008, 17:09 |
| Как это сама очищает? Вообще-то всю жизнь было, забыл где-то деструктор запустить - через какое-то время приложение выжрет память и свалится. Так же и с ресурсами получается... 586, Спасибо, о том, что можно в диспетчере задач посмотреть ресурсы - не знал. Приложение действительно жрет ресурсы. Заменил сейчас в одном месте DeleteDC() на ReleaseDC() - теперь ресурсы "стоят на месте", приложение уже 10 минут работает стабильно, посмотрим, что будет дальше ;) |
| Автор: Earnest 1.4.2008, 10:06 |
После, конечно, очищает, только при исчерпании ресурсов в течении процесса от этого ни жарко, ни холодно... |
| Автор: Alca 23.1.2013, 14:34 |
| Какие еще есть способы поиска утечек с использованием GDI ? |
| Автор: Dem_max 23.1.2013, 15:44 |
| Dreamer_0x01 внимательно читай MSDN по WinAPI функциям, в конце описания на каждую функцию имеется ремарка, в которой указывается парная функция для работы с описываемой функции и пример если не понятно. |
| Автор: GremlinProg 23.1.2013, 15:58 |
Можно еще завернуть соответствующие дескрипторы GDI в классы, заменить все вхождения на указатели на объекты этих классов и искать уже обычные memory-leaks. Такой вот глобальный подход. Но после этого, скорее всего, появится еще пачка попутных проблем, которые, скорее всего, проще было бы избежать банальным анализом исходного кода на наличие "закрывающих скобок", о которых писал Dem_max |
| Автор: Alca 23.1.2013, 16:09 | ||||||
это и так понятно
С99 Есть такая утилита GDIView, пишут, что можно задетектить ресоурс лики. Но я так понял, что показывает, только общее кол-во декрипторов, т.е. если кол-во хендлов постоянно увеличивается - тогла лик. И это единственный функционал который помогает ловить утечки, который есть уже в таскменеджере. GDIView выходит, что бесполезная вещь? Я прав? Еще есть такое: http://www.relisoft.com/win32/gdileaks.html
что скажите? |
| Автор: Dem_max 23.1.2013, 16:15 | ||
можно и так, только в каждую функцию в которой вызываются GDI ресурсы нужно вставлять код в начало функции и в конец, и логгировать, тогда точно будешь знать в какой твоей функции утечки. Но со временем когда руку набъешь не будешь делать ошибок при освобождении ресурсов. |
| Автор: GremlinProg 23.1.2013, 16:21 |
| По последней ссылке, насколько я успел понять, анализ утечки так же на основе проверки числа ресурсов, т.е. ставится начальный замер (в конструкторе) и конечный - в деструкторе, соответственно, их ненулевая разница говорит о том, что на время жизни DbgGuiLeak была утечка. Постепенно сужая life-time этого объекта, можно определить точное место (метод), где утечка произошла. По моему - хорошая альтернатива. |
| Автор: artsb 23.1.2013, 16:33 |
| Я бы попробовал в такой ситуации заюзать умные указатели - просто и сердито. Правда, об этом нужно было думать изначально, т.к. теперь придётся всё это переделывать. |
| Автор: Alca 23.1.2013, 22:36 |
| Дело в том, что не я писал этот код и к тому же там чистый С (без классов). |
| Автор: deniska 25.1.2013, 14:38 |
| AQTime не пробовали? меня когдато интересовало чего с моей программой делается под Вин98 в плане графических ресурсов, тогда она этот анализ плохо делала (именно под Вин98). По XP, по-моему прям тыкала в строчку кода, где не удаленный объект создавался.(естественно Debug версия + pch enabled). |
| Автор: Alca 25.1.2013, 14:43 |
| забыл сказать, что юзаю MinGW |