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

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

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

Ручки, которые протекают, имеют тип Раздел.

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

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

4 ответа

Решение

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

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

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

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

CreateToolhelp32Snapshot

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

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

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

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

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

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

Parameter is not valid. at System.Drawing.Image.get_Width()
at System.Drawing.Image.get_Size()
Другие вопросы по тегам