Обнаружение утечки памяти и циклы - PullRequest
0 голосов
/ 25 мая 2018

Я пытался использовать кросс-платформенный код обнаружения утечки памяти из https://bitbucket.org/shadow_cs/.

Я написал небольшое демо-приложение для Android, содержащее цикл:

type
  TMyClassA = class(TObject)
  public
    Other : TMyClassA;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: TMyClassA;
begin
  a := TMyClassA.Create;
  b := TMyClassA.Create;

  a.Other := b;
  b.Other := a;
end;

И затем я запускаю его наAndroid (добавлены необходимые модули в проект, пути к библиотекам и т. Д.).

Когда я нажимаю кнопку и выхожу из приложения, я вижу тонны сообщений о том, что что-то просачивается в logcat, но, похоже, это никогда не заканчивается.

Это из-за моего цикла?

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

Выдержка из logcat:

05-25 21:00:14.257: W/leak(8382): Leak detected CC4BC740 size 48 B
05-25 21:00:14.266: W/leak(8382):   01 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????
05-25 21:00:14.302: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????
05-25 21:00:14.334: W/leak(8382): Leak detected CC4BCEC0 size 48 B
05-25 21:00:14.366: W/leak(8382):   01 00 00 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????
05-25 21:00:14.400: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????
05-25 21:00:14.425: W/leak(8382): Leak detected CC4B1E40 size 256 B
05-25 21:00:14.467: W/leak(8382):   40 AD 6B CA C0 0F 4C CC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | @?k???L?????????????????????????
05-25 21:00:14.503: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 12 4C CC 00 00 00 00 | ????????????????????????H?L?????
05-25 21:00:14.543: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 1C 4C CC C8 14 4C CC 00 00 00 00 00 00 00 00 | ????????????????H?L???L?????????
05-25 21:00:14.573: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????
05-25 21:00:14.605: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????
05-25 21:00:14.639: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????
05-25 21:00:14.674: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????
05-25 21:00:14.708: W/leak(8382):   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????

Проект обнаружения утечек размещен на Bitbucket.Я новичок в этом, но в отличие от GitHub я не вижу способа связаться с авторами.Иначе я бы сначала спросил их.

1 Ответ

0 голосов
/ 28 мая 2018

Да, это связано с циклами.Чтобы предотвратить эти утечки, вы должны либо вручную отменить их назначение, либо использовать атрибут [Weak], чтобы компилятор / RTL знал о возможных циклах и счетчик ссылок не увеличивался при назначении слабым полям, вместо этого он «запоминает» назначение и отменяет назначениеполе, когда объекты освобождены (поэтому вы не получите доступ к освобожденному экземпляру, но все равно получите AV с нулевым указателем, когда попадете в этот сценарий).Другой вариант - использовать [Unsafe] (или назначить / отменить присвоение вашего экземпляра как Pointer(fField) := instance), что полностью запрещает ARC и слабые ссылки.

LeakCheck сообщает обо всех утечках памяти, но только некоторые типы содержат дополнительную информацию, поэтому тип может бытьiknferred (LeakCheck поддерживает строки / объекты), поэтому вы были правы, игнорируя эти неизвестные.

LeakCheck осуществляет обнаружение циклов и выводит его в формате DOT Graphviz, чтобы его можно было визуализировать.Я бы порекомендовал использовать ведение журнала файлов (добавьте LeakCheck.Report.FileLog к вашему проекту ПОСЛЕ LeakCheck), он выведет утечки и график в отдельные файлы (имейте в виду, что целевая папка /storage/emulated/0/ должна быть доступна приложению), поэтомулегче передать для обработки, чем вывод logcat.Для получения более подробной информации см. Образец CustomLeakReportFMX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...