Что может вызвать утечку рукоятки секции?

Это дополнительный вопрос к моему предыдущему вопросу.

Как было предложено в этот ответ на мой предыдущий вопрос, я использовал ProcessExplorer для анализа списка дескрипторов, которые мое приложение использует для поиска утечки дескрипторов.

Протекающие дескрипторы относятся к типу Section.

Что такое дескриптор раздела, где он используется и что может привести к утечке дескрипторов раздела?

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


person jpfollenius    schedule 21.10.2011    source источник
comment
Вы не используете файлы с отображением памяти, кто-то еще? Какие компоненты вы используете? Любые сторонние dll?   -  person Harriv    schedule 21.10.2011


Ответы (4)


Цитируя книгу Марка Руссиновича Inside Windows 2000 (то, что сейчас называется Windows Internals),

Объект раздела, который подсистема Win32 называет объектом сопоставления файлов, представляет собой блок памяти, который могут совместно использовать два или более процессов.

Итак, это файл с отображением памяти. Они утекут, если вы создадите файл с отображением памяти и не сможете его закрыть. Довольно сложно быть более конкретным.

person David Heffernan    schedule 21.10.2011
comment
Спасибо. Плохая новость: я вообще не использую файлы с отображением памяти :( - person jpfollenius; 21.10.2011

Оказывается, проблема была в низкоуровневой функции, считающей количество потоков текущего процесса. Эта функция использовала

CreateToolhelp32Snapshot

Функция API, которая возвращает дескриптор, который не был закрыт должным образом. Я не уверен, почему это приводит к утечке дескриптора раздела.

person jpfollenius    schedule 28.11.2011
comment
Верно, но это довольно неожиданное объяснение утечек дескрипторов разделов, так что оно отвечает по крайней мере на часть вопроса. - person jpfollenius; 28.11.2011

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

Первое действие, которое необходимо предпринять, — это отследить любую утечку памяти (используя режим отладки FastMM4), и вы обязательно обнаружите в своем коде некоторые невыпущенные объекты.

Поскольку дескрипторы обычно выделяются объектами, из моего эксперимента устранение всех утечек памяти устранит утечки дескрипторов.

Если у вас нет утечки памяти, есть некоторая ссылка CreateFileMapping() вызывается для проверки наличия соответствующего CloseHandle() во всем исходном коде (включая сторонний).

person Arnaud Bouchez    schedule 21.10.2011

Утечка дескриптора раздела в .net связана с исправлением Microsoft KB2670838. Удалите это обновление, и проблема утечки дескриптора раздела (недостаточно памяти) будет устранена.

Parameter is not valid. at System.Drawing.Image.get_Width()
at System.Drawing.Image.get_Size()
person Pankaj Gupta    schedule 26.02.2014