AlanJereb.com
Programmation

Flutter – Détection des fuites de mémoire – Leak Tracker

May 25th, 2025

Ceci est le quatrième et dernier article de blog de la série

Flutter – Détection des fuites de mémoire

. Si vous ne l’avez pas encore fait, je vous suggère vivement de commencer par le

.

Le 1er septembre 2022, Polina Cherkasova a effectué le premier commit sur son nouveau projet Dart-lang appelé

. Ce membre clé de l’équipe Flutter a reçu la tâche de créer un outil qui aiderait à détecter les objets non supprimés et non collectés par le ramasse-miettes.

Le plan pour cet outil est d’être inclus dans les Dart DevTools une fois terminé, mais au moment de rédiger cet article, il n’a toujours pas été officiellement publié (mes versions actives :

Flutter 3.27.1

,

Dart 3.6.0

,

DevTools 2.40.2

). Comme la documentation est presque inexistante, j’ai dû fouiller dans le code source pour comprendre son fonctionnement et comment quelqu’un peut l’utiliser.

L’objectif de cet article est de vous apprendre comment vous pouvez l’utiliser.

Qu’est-ce que Dart Leak Tracker, et comment fonctionne-t-il ?

L’idée de l’équipe Dart derrière ce package est simple. Le package aide à identifier et diagnostiquer les fuites de mémoire dans les applications Dart.

Caractéristiques principales :

  • détecter : identifier les objets non nécessaires qui sont retenus en mémoire
  • visualiser : fournir une interface graphique (GUI) pour une visualisation plus facile dans Dart DevTools
  • filtrer : offrir la possibilité de suivre des types spécifiques d’objets ou tous les objets
  • analyser : fournir des informations sur les raisons pour lesquelles les objets sont retenus (chemins de rétention)

Comment fonctionne-t-il ?

En lisant le code, j’ai identifié plusieurs endroits où j’ai remarqué que les méthodes de Leak Tracker étaient appelées lors de la création d’objets ne se supprimant pas eux-mêmes. Si Leak Tracker est instancié, il va :

  • surveiller l’allocation d’objets et la collecte des ordures
  • identifier quels objets survivent plus longtemps que prévu
  • suivre les chemins de rétention pour aider à analyser pourquoi les objets ne sont pas collectés
  • fournir des rapports via Dart DevTools

Exemple de code SDK Flutter - Suivi de la création de l'objet ImageInfo

Exemple de code SDK Flutter - Suivi de la création de l'objet TrainHoppingAnimation

Exemple de code SDK Flutter - Suivi de la création de l'objet TextSelectionOverlay

Comment pouvez-vous utiliser Dart Leak Tracker avant la sortie officielle ?

Comment pouvez-vous utiliser Dart Leak Tracker avant la sortie officielle ? La documentation pour la configuration sur le dépôt GitHub officiel est obsolète et ne fonctionne plus. En corrigeant un bug dans Dart Leak Tracker (

n’a pas encore été fusionnée), en rassemblant quelques extraits de code provenant d’un post Reddit vieux de deux ans et de quelques problèmes GitHub, j’ai réussi à le faire fonctionner.

Pour utiliser Dart Leak Tracker dans votre application Flutter, vous devez d’abord corriger le bug dans le code de Dart Leak Tracker. Naviguez jusqu’à l’endroit où votre package dart-lang est installé sur votre machine et ouvrez le fichier

pkgs/leak_tracker/lib/src/leak_tracking/_object_tracker.dart

. Vous devez corriger le filtre qui filtre les fuites collectées tardivement par le ramasse-miettes.

LeakType.gcedLate: _objects.gcedLateLeaks
  // .where((record) => _leakFilter.shouldReport(LeakType.notGCed, record)) fixed
  .where((record) => _leakFilter.shouldReport(LeakType.gcedLate, record))
  .map((record) => record.toLeakReport())
  .toList(),
}); 

Ensuite, si vous utilisez mon code du précédent article de blog de la série, remplacez le contenu du fichier

main.dart

par le contenu trouvé

. Si vous cherchez des fuites dans votre application, assurez-vous d’ajouter ce qui suit à votre fichier

main.dart

(passez ces étapes si vous utilisez mon code) :

1. Instancier leak_tracker

Vous devez importer les dépendances requises, et avant que runApp ne soit appelé, vous devez instancier le package Leak Tracking.

import 'package:flutter/foundation.dart';
import "package:leak_tracker/leak_tracker.dart";

void main() {
  LeakTracking.start();
  FlutterMemoryAllocations.instance.addListener((ObjectEvent event) {
    LeakTracking.dispatchObjectEvent(event.toMap());
  });
  runApp(const MyApp());
}

2. Collecter les fonctionnalités de fuites

Vous devez implémenter un mécanisme qui collectera les fuites actuellement observées et vous les renverra. Dans mon application de démonstration, j’ai modifié le callback onPressed du

TextButton

pour qu’il collecte également les fuites.

onPressed: () async {
  Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => const HomePage()));
  await Future.delayed(const Duration(milliseconds: 500)); // let the leak_tracker settle
  Leaks leaks = await LeakTracking.collectLeaks();
  print("Leaks collected");
},

Exécutez l’application, faites des choses qui produisent généralement des fuites de mémoire, puis essayez de les collecter. La manière la plus rapide d’observer ce qui a été collecté est de placer un point d’arrêt et de vérifier ce qui a été assigné à la variable

leaks

.

Votre code fuit-il encore ? leaking?

Gardez à l’esprit que le package

leak_tracker

n’a pas encore été publié, et tout comme l’outil Memory view, il est possible qu’il n’ait pas trouvé le coupable de vos fuites.

Pourquoi leak_tracker n’a-t-il pas trouvé vos fuites ?

  • Polina n’a pas encore inclus vos objets fuyants dans la liste des objets observés
  • Il se peut que votre fuite provienne d’un endroit dont même l’équipe Flutter n’est pas consciente. Il pourrait s’agir d’un bug dans le framework Flutter ou même dans le langage Dart qui cause des fuites.

Maintenant vient la partie difficile. La seule chose qui reste est de produire et d’analyser le dump de mémoire de votre application. L’analyse du dump de mémoire est hors du cadre de cette série d’articles de blog, mais je serai ravi d’en

avec vous.