Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как найти утечку GDI - ресурсов? Где-то забыл удалить перо или кисть.... 
V
    Опции темы
Dreamer_0x01
Дата 31.3.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 12



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

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


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

Спасибо.



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
586
Дата 31.3.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



http://forum.vingrad.ru/index.php?showtopi...t&p=1456493 - тоже проблемы с CreateCompatibleBitmap.

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

Диспетчер задач -> Процессы -> Вид -> Выбрать столбцы -> [v] Объекты GDI. Или ProcessExplorer.
PM   Вверх
S.A.G.
Дата 31.3.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Windows сама очищает память после отработки процесса. Так что совсем не обязательно удалять ресурсы.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Dreamer_0x01
Дата 31.3.2008, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 12



Как это сама очищает? Вообще-то всю жизнь было, забыл где-то деструктор запустить - через какое-то время приложение выжрет память и свалится. Так же и с ресурсами получается...



586, Спасибо, о том, что можно в диспетчере задач посмотреть ресурсы  - не знал.
Приложение действительно жрет ресурсы.
Заменил сейчас в одном месте DeleteDC() на ReleaseDC() - теперь ресурсы "стоят на месте", приложение уже 10 минут работает стабильно, посмотрим, что будет дальше ;)


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Earnest
Дата 1.4.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(S.A.G. @  31.3.2008,  17:49 Найти цитируемый пост)
Windows сама очищает память после отработки процесса. 

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



--------------------
...
PM   Вверх
Alca
Дата 23.1.2013, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Какие еще есть способы поиска утечек с использованием GDI ?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Dem_max
Дата 23.1.2013, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



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


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 23.1.2013, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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


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

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

Это сообщение отредактировал(а) GremlinProg - 23.1.2013, 15:59


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Alca
Дата 23.1.2013, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Цитата

внимательно  читай 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;
};

что скажите?

Это сообщение отредактировал(а) Alca - 23.1.2013, 16:11


--------------------
PM WWW ICQ Skype Jabber   Вверх
Dem_max
Дата 23.1.2013, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Цитата

что скажите?

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


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 23.1.2013, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



По последней ссылке, насколько я успел понять, анализ утечки так же на основе проверки числа ресурсов,
т.е. ставится начальный замер (в конструкторе) и конечный - в деструкторе,

соответственно, их ненулевая разница говорит о том, что на время жизни DbgGuiLeak была утечка. Постепенно сужая life-time этого объекта, можно определить точное место (метод), где утечка произошла.

По моему - хорошая альтернатива.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
artsb
Дата 23.1.2013, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



Я бы попробовал в такой ситуации заюзать умные указатели - просто и сердито. Правда, об этом нужно было думать изначально, т.к. теперь придётся всё это переделывать.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alca
Дата 23.1.2013, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Дело в том, что не я писал этот код и к тому же там чистый С (без классов).

Это сообщение отредактировал(а) Alca - 23.1.2013, 22:50


--------------------
PM WWW ICQ Skype Jabber   Вверх
deniska
Дата 25.1.2013, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



AQTime не пробовали? меня когдато интересовало чего с моей программой делается под Вин98 в плане графических ресурсов, тогда она этот анализ плохо делала (именно под Вин98). По XP, по-моему прям тыкала в строчку кода, где не удаленный объект создавался.(естественно Debug версия + pch enabled).

Это сообщение отредактировал(а) deniska - 25.1.2013, 14:40
PM MAIL ICQ   Вверх
Alca
Дата 25.1.2013, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



забыл сказать, что юзаю MinGW


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1178 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.