(2014-03-24 17:54:36 отредактировано ssdi)

Утечка памяти и хэндлов

Окружение: Win7x64, драйвера 6.3.0.112, GuardantDotNetApi.dll версии 6.3.0.17, GrdAPI32.DLL и
GrdAPI64.DLL версии 6.3.0.17. DotNet-приложение x86 защищаемое с использованием DotNetAPI.

Внешнее проявление - утечка памяти VirtualSize и WorkingSet, утечка хэндлов, перманентный рост количества динамических библиотек(Assemblies totaly, в частности DynamicAssembly и DynamicModule) процесса.

Отладкой под VS локализовал место генерации динамических библиотек (сборок). На каждый успешный вызов GrdApi.GrdCrypt(handle, algo, data, method, ref pIV) происходит создание новой и загрузка динамической библиотеки в процесс. VS output: 'Foo.exe' (Managed): Loaded 'DynamicAssembly',
'Foo.exe' (Managed): Loaded 'DynamicModule'. Вызов производится для одного актуально хэндла. Кроме утечек ошибка более никак не проявляется, т.е. ПО работает штатно до момента окончания памяти, затем появляются сообщения OutOfMemoryExceptions.

Даже при редком вызове функции (раз в минуту/две) за несколько суток виртуальная память процесса дорастает до 1,5 гигабайт, количество сборок дорастает до 1000 и более.

Вопросы:
* Что делать?
* Обновление до последней версии от 21 апреля 2014 года решит проблему?

Критичность проблемы высокая, т.к. касается распространяемого ПО.

Re: Утечка памяти и хэндлов

Также воспроизводится на актуальном "Комплекте разработчика Guardant 6.31" и драйверах Guardant версии 6.31.117 от 19.03.2014.

Может быть есть какой нибудь workaround?

Re: Утечка памяти и хэндлов

Нашел ошибку в библиотеке GuardantDotNetApi.dll :

public sealed class GrdApi {
....


    private static unsafe GrdE GrdCrypt(IntPtr hAddress, int algNum, byte[] data, int method, byte[] iv, byte[] key, byte[] context)
    {
      if (GrdApi.GrdCryptExInvoker == null)
      {
        Type[] parameters = new Type[8]
        {
          typeof (IntPtr),
          typeof (int),
          typeof (int),
          typeof (IntPtr),
          typeof (int),
          typeof (IntPtr),
          typeof (IntPtr),
          typeof (IntPtr)
        };
        GrdApi.GrdCryptInvoker = new PlatformInvoker("GrdCrypt", GrdApi.GrdDllName, typeof (GrdE), parameters, CallingConvention.Winapi, CharSet.Auto);
      }
      if (data == null)
        data = new byte[0];
      if (iv == null)
        iv = new byte[0];
      if (key == null)
        key = new byte[0];
      if (context == null)
        context = new byte[0];
      fixed (byte* numPtr1 = data)
        fixed (byte* numPtr2 = iv)
          fixed (byte* numPtr3 = key)
            fixed (byte* numPtr4 = context)
              return (GrdE) GrdApi.GrdCryptInvoker.Invoke((object) hAddress, (object) algNum, (object) data.Length, (object) new IntPtr((void*) numPtr1), (object) method, (object) new IntPtr((void*) numPtr2), (object) new IntPtr((void*) numPtr3), (object) new IntPtr((void*) numPtr4));
    }

...
}

Описка в

if (GrdApi.GrdCryptExInvoker == null)

, а должно быть

if (GrdApi.GrdCryptInvoker == null)

Когда ждать фикса?

Re: Утечка памяти и хэндлов

Я, конечно, понимаю, что придется воспользоваться пока функцией GrdApi.GrdCryptEx(...). Только хочу обратить внимание, что на каждую используемую функцию GrdApi  в обертке GuardantDotNetApi.dll создается и загружается динамическая библиотека/модуль в процесс, т.к. нет кеширования (это видно на дебаге и по загруженным модулям и их количестве в процессе). См. например http://msdn.microsoft.com/en-us/magazine/cc163491.aspx.

Re: Утечка памяти и хэндлов

Добрый день, ssdi.

Это действительно ошибка в нашей .Net-библиотеке. Исправленная библиотека была выслана на Вашу электронную почту (указанную при регистрации на форуме).

Re: Утечка памяти и хэндлов

Антон Тихиенко пишет:

Добрый день, ssdi.

Это действительно ошибка в нашей .Net-библиотеке. Исправленная библиотека была выслана на Вашу электронную почту (указанную при регистрации на форуме).

Спасибо. Но, тем не менее, есть существенные подозрения на утечку хэндлов. Т.к. использование другой функции полностью не решило проблемы увеличения количества хэндлов(Handles) в процессе, хотя скорость увеличения существенно уменьшилась.

Re: Утечка памяти и хэндлов

Антон Тихиенко пишет:

Добрый день, ssdi.

Это действительно ошибка в нашей .Net-библиотеке. Исправленная библиотека была выслана на Вашу электронную почту (указанную при регистрации на форуме).

В присланной библиотеке (версия 6.3.0.7) ошибка, описанная выше, присутствует. В последних релизах версии библиотеки: 6.3.0.17 и в актуальном 6.3.0.39. Вы не ошиблись с присланной библиотекой? Отписался на почту. Жду ответа.

Re: Утечка памяти и хэндлов

ssdi пишет:

В присланной библиотеке (версия 6.3.0.7) ошибка, описанная выше, присутствует. В последних релизах версии библиотеки: 6.3.0.17 и в актуальном 6.3.0.39. Вы не ошиблись с присланной библиотекой? Отписался на почту. Жду ответа.

Да, произошла ошибка, нужную библиотеку выслал.