Как отследить утечки ручки?

В одном из моих приложений я наблюдаю увеличение количества ручек. Число увеличивается примерно каждую секунду без использования приложения, поэтому в некоторой части кода фоновой обработки должна быть утечка дескриптора.

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

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

3 ответа

Решение

Я предлагаю использовать Process Explorer. Запустите его от имени администратора, чтобы убедиться, что вы видите все соответствующие данные. Там вы можете наблюдать, какие ручки у вашего процесса, а какие чрезмерно создаются и не свободны. Это должно помочь вам сузить поиск (в моем случае у меня были протечки сокетов повсюду из-за некоторых ложных предположений о поведении winsocks.). Возможно, тогда вы сможете выделить соответствующий код и опубликовать его здесь, чтобы мы могли проверить, есть ли что-то не так. Удачи!

Некоторые профилировщики (например, AQTime) могут профилировать приложения ресурсов Windows. Если вы используете XE, у вас есть базовая версия AQTime.

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

  1. В win10 загрузите инструмент «Handle» по адресу https://docs.microsoft.com/en-us/sysinternals/downloads/handle ,

  2. Применение:

    ручка [[-a] [-u] | [-c [-l] [-y]] | [-s]] [-p |> [имя]

  3. пример:

    чтобы показать все типы дескрипторов и их количество в процессе 33920: в cmd запустите "handle64 -s -p 33920"

  4. результат выглядит так:

  1. запустите шаг 3, получите результат 4 несколько раз, затем проверьте diff и возьмите те, которые перегружают память
Другие вопросы по тегам