У меня есть C ++ DLL, которая используется для аутентификации, которая загружается службой Windows для каждого входа в систему.
В этой DLL я использую функцию Windows ADSI ADsOpenObject () чтобы получить объект пользователя из Active Directory.
HRESULT hr = ADsOpenObject(L"LDAP://rootDSE",
L"username",
L"password",
m_dwADSFlags,
IID_IDirectorySearch,
(void**)&m_DSSearch);
Как правило, это работает с годами. Но в настоящее время я получаю код ошибки
-2147024882 (0x8007000E)
который НЕДОСТАТОЧНО ПАМЯТИ. Когда я перезапускаю службу, использующую мою DLL, она работает нормально в течение нескольких недель, но затем начинают возникать ошибки.
Сейчас не могу найти какие не хватает памяти Планировщик задач выглядит отлично, и свободной памяти достаточно.
Что я могу сделать, чтобы это исправить?
который является OUT_OF_MEMORY.
Это E_OUTOFMEMORY, код ошибки COM. Описание не очень полезно, этот код ошибки, как правило, возвращается для любой ошибки «нехватки ресурсов» по коду Microsoft, а не только по памяти. Может быть достигнуто внутреннее ограничение, может быть вызов Winapi, который не удается.
И это не обязательно ограничено прямым вовлеченным программным обеспечением. Например, причиной сбоя может быть некачественный драйвер устройства, который приводит к утечке памяти из пула ядра.
Вам повезет, если вы сможете найти что-то обратно в журнале событий приложений, посмотрите как на машине, которая сообщает об ошибке, так и на сервере домена. Диспетчер задач может дать подсказку, добавить столбцы «Ручки», «Объекты GDI», «Объект USER», «Размер фиксации», «Пул страниц» и «Пул NP». Довольно сложно дать конкретный совет помимо этого. Это, без сомнения, утечка, громко крякает, как одна, когда вам приходится периодически перезагружать машину для восстановления. Удачи в охоте.
Вы звоните Release на m_DSSearch? Также, если вы ищете, вам нужно вызвать CloseSearchHandle или AbandonSearch. Если вы не делаете ни одного из них, у вас может медленно вытекать память.
Ваш процесс может фрагментировать кучу до такой степени, что ADsOpenObject не может найти последовательный фрагмент памяти, который достаточно велик.
Вы можете использовать VMMap для профилирования использования памяти:
http://technet.microsoft.com/en-us/sysinternals/dd535533
Вы можете попробовать включить кучу с низкой фрагментацией:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366750(v=vs.85).aspx
Если он сейчас начинает появляться, и его не было раньше, я бы предположил одну из двух возможностей: это связано со временем (точнее, годом, каким-то тысячелетним жуком). Другим вариантом будет проблема с 32/64 битной архитектурой.
Теперь учтите, что я не программирую на C ++. Но я немного знаю об ошибках MS (я работал в службе поддержки MS …)