Перейти к содержимому

Фото
- - - - -

C# утечка памяти в приложении


  • Вы не можете создать новую тему
  • Please log in to reply
4 ответов в этой теме

#1 Вырвиглаз

Вырвиглаз

    Убийца травы

  • Постоялец
  • 15 928 сообщений
  • Откуда:Эстония, Таллин

Отправлено 30 июля 2016 - 15:29

Всем привет.

Есть некая софтина на C#, писанная под Visual Studio 2015. Она взаимодействует по USB с некоторой приблудой на ARM STM32 по протоколу HID. Библиотека USBHIDDRIVER.dll свиснута с просторов интернета. Сборщик данных по event'у кладет 64 байта в очередь, которую собирает некий поток и выводит на элементы управления через invoke. Еще есть поток, который следит за подключением девайса и закрывает handler, если связь теряется (hot plug). Так вот проект медленно, но верно расширяется в памяти. Пробовал отключать все - утечка останавливается. Странно то, что классы я сделал статические. Никаких экземпляров. Казалось бы, что тут может утекать?

        private static void HID_CheckConnectionThread()
        {
            bool connection_status = false;
            while(true)
            {
                Thread.Sleep(100);
                connection_status = HID_Device.Connect();
                if (connection_status && !isConnectionAlive)
                {
                    /* Connected! */
                    HID_Device.enableUsbBufferEvent(new System.EventHandler(ReadEventHandler));
                    HID_Device.startRead();
                    isConnectionAlive = true;
                }
                
                if (!connection_status && isConnectionAlive)
                {
                    /* Disonnected! */
                    HID_Device.stopRead();
                    HID_Device.Disconnect();
                    isConnectionAlive = false;
                }
            }
        }

В обработчик (if!....) она даже не заходит. Если убрать "connection_status = HID_Device.Connect();" утечка остается! Хоть по факту, в процессе кроме Sleep больше ничего нет.

Я в замешательстве!


  • 0
Кто живет и грешит в Эстонии, тот опять родится в Эстонии.

#2 Zero

Zero

    TRUST NO ONE

  • Постоялец
  • 10 668 сообщений
  • Откуда:Таллин

Отправлено 30 июля 2016 - 16:37

Менеджер памяти с детектором утечек подключить нельзя? Или те не можешь производить отладку непосредственно?


isConnectionAlive еще кем-то изменяется?


Сообщение изменено: Zero (30 июля 2016 - 16:45 )

  • 0
Моя Родина - СССР! Пролетарии всех стран, соединяйтесь!
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!

#3 Вырвиглаз

Вырвиглаз

    Убийца травы

  • Постоялец
  • 15 928 сообщений
  • Откуда:Эстония, Таллин

Отправлено 30 июля 2016 - 16:48

Менеджер памяти с детектором утечек подключить нельзя? Или те не можешь производить отладку непосредственно?


isConnectionAlive еще кем-то изменяется?

Менеджер памяти выдает много информации, мало понятной, разумеется.

Нет, переменная только для этого участка кода.

Прикрепленный файл  память.PNG   184,7К   1 Количество загрузок


  • 0
Кто живет и грешит в Эстонии, тот опять родится в Эстонии.

#4 Zero

Zero

    TRUST NO ONE

  • Постоялец
  • 10 668 сообщений
  • Откуда:Таллин

Отправлено 30 июля 2016 - 17:28

https://msdn.microso...issue_in_an_app

 

Здесь есть такая строка:

  • For an object selected from the instance of a type, Paths to Root shows a graph of the actual objects that hold a reference to the instance. You can hover over the name of the object to view its data values in a data tip

Т.е. можн проследить родителя. Мне кажется, дело не в твоем потоке (если ты говоришь, что убираешь connection_status = HID_Device.Connect();, тогда в первый if он точно не зайдет, во второй - в зависимости от второй переменной. Пустой поток не будет плодить объекты.


  • 0
Моя Родина - СССР! Пролетарии всех стран, соединяйтесь!
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!

#5 Вырвиглаз

Вырвиглаз

    Убийца травы

  • Постоялец
  • 15 928 сообщений
  • Откуда:Эстония, Таллин

Отправлено 30 июля 2016 - 18:11

Похоже, жрет механизм изменения свойств объекта, вызванного через invoke. У меня этот механизм реализован так:

        static public void ChangeCheckBoxState(CheckBox CHB, bool State)
        {
            CHB.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
            {              
                CHB.IsChecked = State;
            }));
        }

Я не силен в объектном программировании. Может есть способ попроще?

У меня что-то подобное происходит:

https://nevlabs.ru/a...net/memoryleak/


Сообщение изменено: Вырвиглаз (30 июля 2016 - 18:20 )

  • 0
Кто живет и грешит в Эстонии, тот опять родится в Эстонии.