powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечка Device Context + EurekaLog
8 сообщений из 8, страница 1 из 1
Утечка Device Context + EurekaLog
    #40078564
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Имеется приложение Delphi использующее стороннюю библиотеку CadVCL для рисования чертежей.
В данной библиотеке происходит утечка ресурса DeviceContext - приводящая к краху приложения.
Я с помощью Win Hook перехватываю функции WinAPI создания/удаления DC.
Для выявления места утечки, я добавил в список созданных DC стек вызова (использую Eurekalog)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function GetCallstack: string;
var
  CallStack: TEurekaBaseStackList;
begin
  if IsEurekaLogActive then
  begin
    CallStack := GetTracer(TracerRawJCL{TracerWindows});
    try
      CallStack.Build(CallStack.GetCurrentInstruction, nil, nil, -1, -1, [ddProcedure]);
      Result := CallStack.ToString;
    finally
      FreeAndNil(CallStack);
    end;
  end
  else
    Result := '';
end;


У тут начался треш - программа стала не работоспособна - очень медленно работает.
Вопрос:
1. Как оптимизировать время получения стека (можно с минимальной информацией) с помощью Eurekalog (вызовов на создание DC сотни)
2. Есть ли другой способ выявления утечки DC (кроме сторонних/платных профайлеров типа AQTime)

С Уважением,
Александр.

P.S. Исходники библиотеки CADVCL естественно есть.
...
Рейтинг: 0 / 0
Утечка Device Context + EurekaLog
    #40078566
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lisichkin
Как оптимизировать время получения стека
Не нужно его преобразовывать в строку. Стек вызовов - это список адресов. Вот список адресов и храните. А уже в конце работы программы преобразуйте адреса в строки. Ну и по завершению работы программы окажется, что стек остался только от утекших хендлов. А для тех хендлов, которые были закрыты и переводить в строки не нужно
...
Рейтинг: 0 / 0
Утечка Device Context + EurekaLog
    #40078593
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Спасибо! Заработало
...
Рейтинг: 0 / 0
Утечка Device Context + EurekaLog
    #40078611
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет не заработало - стек показывается не для того состояния, когда был вызван создание DC, а для того когда вызывается Stack.Build :(
Нужна помощь знатоков EurekaLog
Сохраняю две переменные:
Result := TStackItem.Create;
Result.FStack := GetTracer(TracerRawJCL); // TEurekaBaseStackList
Result.FCurrentInstruction := Result.FStack.GetCurrentInstruction; // Pointer
...
Рейтинг: 0 / 0
Утечка Device Context + EurekaLog
    #40078658
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gunsmoker - Как самый большой специалист по Eurekalog, как нужно поступить ?
...
Рейтинг: 0 / 0
Утечка Device Context + EurekaLog
    #40078721
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lisichkin
Нет не заработало - стек показывается не для того состояния, когда был вызван создание DC, а для того когда вызывается Stack.Build :(
Нет загрузки/выгрузки dll в процессе накопления стека? Если нет, то расшифровка изменяться не может. Если есть, то нужно еще сохранять адреса загрузки dll
...
Рейтинг: 0 / 0
Утечка Device Context + EurekaLog
    #40078734
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строить стек - это надо время. Просмотреть все адреса, каждый проверить их на допустимость - а это вызовы в ядро, между прочим. Медленно это. Особливо, если ещё и отладочную инфу искать.

Если создавать стек на каждый чих (читай: операцию рисования с DC) - само собой, программа будет очень медленно работать.

EurekaLog - это трейсер исключений (штуки, которые происходят редко) и она не очень заточена под тыщу вызовов в секунду.

В простейшем случае - сделайте тупо дамп стека (ну т.е. AllocMem + Move(ESP, Dump)). Это быстро, т.к. разбора стека не будет. Как нашли утечку - пробегитесь по ассоциированному дампу с GetLocationInfoStr(адрес_в_дампе). Там куча мусора будет, но ручками можно разобрать.
...
Рейтинг: 0 / 0
Утечка Device Context + EurekaLog
    #40078783
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала весь стэк вообще не нужен, достаточно определить адрес, где вызывается
утекающий хэндл. На второй стадии теда можно просто воткнуть точку останова в отладчике и
смотреть стэк и всё остальное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечка Device Context + EurekaLog
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]