Отслеживание создания / удаления маркера - PullRequest
2 голосов
/ 17 ноября 2009

У меня есть большая старая программа, которая имеет довольно сложные графические дисплеи (все через стандартные вызовы API). Программа, кажется, работает нормально, но я недавно посмотрел на поле «дескрипторы» диспетчера задач Windows, когда эта программа работала, и заметил, что число дескрипторов постепенно и неуклонно растет вверх.

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

Я ожидал бы, что программа создаст большое количество дескрипторов, но я бы также ожидал, что это достигнет предела. Так что я действительно хочу увидеть, какая часть кода создавала самые последние дескрипторы.

РЕДАКТИРОВАТЬ: После некоторого исследования с "Process Explorer" я обнаружил, что нарастает "Ручки", а не "Ручки GDI". Так что, я думаю, это не имеет ничего общего со сложной графикой.

Ответы [ 5 ]

3 голосов
/ 17 ноября 2009

Пожалуйста, попробуйте эту ссылку для совета. Проблема сложная, и кто-то написал учебник о том, как ее решить. Обновление: здесь еще одна ссылка, которая может помочь.

0 голосов
/ 17 ноября 2009

Другими функциями, которые создают РУЧКИ, являются CreateThread, OpenThread, CreateProcess, OpenProcess, CreateMutex, OpenMutex, LoadLibrary и, возможно, InitializeCriticalSection (не уверен в этом).

Я не знаю, относятся ли они к дескрипторам событий в том инструменте, который вы используете, но их стоит проверить.

0 голосов
/ 17 ноября 2009

Вы можете использовать Memory Validator , чтобы найти утечки ручек. Попробуйте версию Eval.

0 голосов
/ 17 ноября 2009

Дескрипторами может быть много вещей, не только файловые дескрипторы, но и объекты с графическим интерфейсом (причуды, такие как создание значка и удаление его с помощью DeleteObject (), а не DestroyIcon ()).

Есть статья MSDN с различными приемами: http://msdn.microsoft.com/en-us/magazine/cc301756.aspx и пакет программ под названием Leaks.exe (при условии, что вы все еще можете запускать свой код под W95)

0 голосов
/ 17 ноября 2009

Лучший способ решить эту проблему - использовать шаблон проектирования RAII .

В которой для каждого созданного вами дескриптора вы заключаете его в класс.

Например:

class CAutoHandle
{
public:
  CAutoHandle(HANDLE handle) : m_handle(handle)
  {
  }

  ~CAutoHandle()
  {
    CloseHandle(m_handle);
  }

  HANDLE m_handle;
};

@ JaredPar также предлагает другое решение здесь , в котором вы переопределяете CreateFile для вызова собственной функции с отслеживанием.

...