Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как найти утечку GDI - ресурсов?


Автор: Dreamer_0x01 31.3.2008, 16:24
Спустя 20-40 минут работы приложение падает на строчке, в которой создается CreateCompatibleBitmap().

Есть подозрение, что где-то во время прорисовки не сделан DeleteObject(). Но никак не могу найти, где это, прорисовки в приложении достаточно много.


Есть ли какое-нибудь средство, чтобы узнать остаток ресурсов до вызова какой-либо функции, а затем после нее?

Спасибо.

Автор: 586 31.3.2008, 16:39
http://forum.vingrad.ru/index.php?showtopic=202016&view=findpost&p=1456493 - тоже проблемы с CreateCompatibleBitmap.

Цитата(Dreamer_0x01 @  31.3.2008,  17:24 Найти цитируемый пост)
Есть ли какое-нибудь средство, чтобы узнать остаток ресурсов до вызова какой-либо функции, а затем после нее?

Диспетчер задач -> Процессы -> Вид -> Выбрать столбцы -> [v] Объекты GDI. Или ProcessExplorer.

Автор: 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
Цитата(S.A.G. @  31.3.2008,  17:49 Найти цитируемый пост)
Windows сама очищает память после отработки процесса. 

После, конечно, очищает, только при исчерпании ресурсов в течении процесса от этого ни жарко, ни холодно... 

Автор: Alca 23.1.2013, 14:34
Какие еще есть способы поиска утечек с использованием GDI ?

Автор: Dem_max 23.1.2013, 15:44
Dreamer_0x01
внимательно  читай MSDN по WinAPI функциям, в конце описания на каждую функцию имеется ремарка, в которой указывается парная функция для работы с описываемой функции и пример если не понятно.

Автор: GremlinProg 23.1.2013, 15:58
Цитата(Alca @  23.1.2013,  16:34 Найти цитируемый пост)
Какие еще есть способы поиска утечек с использованием GDI ?


Можно еще завернуть соответствующие дескрипторы GDI в классы, заменить все вхождения на указатели на объекты этих классов и искать уже обычные memory-leaks.

Такой вот глобальный подход. Но после этого, скорее всего, появится еще пачка попутных проблем, которые, скорее всего, проще было бы избежать банальным анализом исходного кода на наличие "закрывающих скобок", о которых писал Dem_max  smile 

Автор: Alca 23.1.2013, 16:09
Цитата

внимательно  читай MSDN по WinAPI функциям, в конце описания на каждую функцию имеется ремарка,
в которой указывается парная функция для работы с описываемой функции и пример если не понятно.

это и так понятно

Цитата

Можно еще завернуть соответствующие дескрипторы GDI в классы

С99

Есть такая утилита GDIView, пишут, что можно задетектить ресоурс лики.
Но я так понял, что  показывает, только общее кол-во декрипторов,
т.е. если кол-во хендлов постоянно увеличивается - тогла лик.
И это единственный функционал который помогает ловить утечки,
который есть уже в таскменеджере.
GDIView выходит, что бесполезная вещь? Я прав?

Еще есть такое: http://www.relisoft.com/win32/gdileaks.html
Код

class DbgGuiLeak
{
public:
    explicit DbgGuiLeak ()
    {
        _guiResCount = ::GetGuiResources (::GetCurrentProcess (),
                                          GR_GDIOBJECTS);
    }
    ~DbgGuiLeak ()
    {
        int leaks = ::GetGuiResources (::GetCurrentProcess (), 
                                       GR_GDIOBJECTS) - _guiResCount;
        if (leaks != 0)
        {
            std::cout << "Gui Resources Leaked: " << leaks << std::endl;
        }
    }
private:
    unsigned _guiResCount;
};

что скажите?

Автор: 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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)