From 5a56ad25f01faaf5b364629ad2021b297ba77123 Mon Sep 17 00:00:00 2001 From: Polina Cherkasova Date: Thu, 15 Feb 2024 13:47:02 -0800 Subject: [PATCH 1/6] Update helpers.dart --- pkgs/leak_tracker/lib/src/leak_tracking/helpers.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkgs/leak_tracker/lib/src/leak_tracking/helpers.dart b/pkgs/leak_tracker/lib/src/leak_tracking/helpers.dart index f05bcdad..afbbfd9c 100644 --- a/pkgs/leak_tracker/lib/src/leak_tracking/helpers.dart +++ b/pkgs/leak_tracker/lib/src/leak_tracking/helpers.dart @@ -53,6 +53,8 @@ Future forceGC({ /// /// Does not work in web and in release mode. /// +/// To run this inside `flutter test` pass `--enable-vmservice`. +/// /// Also does not work for objects that are not returned by getInstances. /// https://github.com/dart-lang/sdk/blob/3e80d29fd6fec56187d651ce22ea81f1e8732214/runtime/vm/object_graph.cc#L1803 Future formattedRetainingPath(WeakReference ref) async { From 189db1962a381e094ab03c83942400a26167e63b Mon Sep 17 00:00:00 2001 From: Polina Cherkasova Date: Thu, 28 Mar 2024 14:28:54 -0700 Subject: [PATCH 2/6] - --- doc/leak_tracking/OVERVIEW.md | 2 +- pkgs/leak_tracker/lib/src/DEPENDENCIES.md | 1 - .../leak_tracker/lib/src/leak_tracking/DEPENDENCIES.md | 1 - .../primitives/_retaining_path/DEPENDENCIES.md | 10 ++++++++++ pkgs/leak_tracker_flutter_testing/README.md | 2 +- 5 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 pkgs/leak_tracker/lib/src/leak_tracking/primitives/_retaining_path/DEPENDENCIES.md diff --git a/doc/leak_tracking/OVERVIEW.md b/doc/leak_tracking/OVERVIEW.md index 680b6cd9..ac3edaf8 100644 --- a/doc/leak_tracking/OVERVIEW.md +++ b/doc/leak_tracking/OVERVIEW.md @@ -2,7 +2,7 @@ Detecting memory leaks for large applications is hard ([snapshot diffing](https://nodejs.org/en/docs/guides/diagnostics/memory/using-heap-snapshot), [profiling](https://www.atatus.com/blog/how-to-identify-memory-leaks/#:~:text=doomed%20to%20fail.-,Is%20There%20a%20Way%20to%20Tell%20a%20Memory%20Leak%3F,RAM%20and%20crash%20your%20application.)). Normally, the leaks impact users, staying invisible for application teams. -leak_tracker helps to catch memory issues much earlier by detecting not-disposed and not-garbage-collected objects in Flutter regression tests. +`leak_tracker` helps to catch memory issues much earlier by detecting not-disposed and not-garbage-collected objects in Flutter regression tests. ## Read more diff --git a/pkgs/leak_tracker/lib/src/DEPENDENCIES.md b/pkgs/leak_tracker/lib/src/DEPENDENCIES.md index 9ea699d7..b2a5720e 100644 --- a/pkgs/leak_tracker/lib/src/DEPENDENCIES.md +++ b/pkgs/leak_tracker/lib/src/DEPENDENCIES.md @@ -8,6 +8,5 @@ flowchart TD; devtools_integration-->shared; leak_tracking-->devtools_integration; leak_tracking-->shared; -usage_tracking-->shared; ``` diff --git a/pkgs/leak_tracker/lib/src/leak_tracking/DEPENDENCIES.md b/pkgs/leak_tracker/lib/src/leak_tracking/DEPENDENCIES.md index 2223daa7..1227e72a 100644 --- a/pkgs/leak_tracker/lib/src/leak_tracking/DEPENDENCIES.md +++ b/pkgs/leak_tracker/lib/src/leak_tracking/DEPENDENCIES.md @@ -22,7 +22,6 @@ _object_tracker.dart-->_object_record.dart; _object_tracker.dart-->_object_records.dart; _object_tracker.dart-->primitives; helpers.dart-->primitives; -leak_testing.dart-->primitives; leak_tracking.dart-->_baseliner.dart; leak_tracking.dart-->_leak_tracker.dart; leak_tracking.dart-->primitives; diff --git a/pkgs/leak_tracker/lib/src/leak_tracking/primitives/_retaining_path/DEPENDENCIES.md b/pkgs/leak_tracker/lib/src/leak_tracking/primitives/_retaining_path/DEPENDENCIES.md new file mode 100644 index 00000000..bd60f4ca --- /dev/null +++ b/pkgs/leak_tracker/lib/src/leak_tracking/primitives/_retaining_path/DEPENDENCIES.md @@ -0,0 +1,10 @@ + + +```mermaid +flowchart TD; +_retaining_path.dart-->_retaining_path_web.dart; +``` + diff --git a/pkgs/leak_tracker_flutter_testing/README.md b/pkgs/leak_tracker_flutter_testing/README.md index 3bdeaf82..ac09fba3 100644 --- a/pkgs/leak_tracker_flutter_testing/README.md +++ b/pkgs/leak_tracker_flutter_testing/README.md @@ -5,7 +5,7 @@ Coming soon! See https://github.com/flutter/devtools/issues/3951. ## What is leak_tracker_flutter_testing? -leak_tracker_flutter_testing is Flutter specific test helpers for [leak_tracker](https://pub.dev/packages/leak_tracker). +`leak_tracker_flutter_testing` is Flutter specific test helpers for [leak_tracker](https://pub.dev/packages/leak_tracker). They are separated from [leak_tracker_testing](https://pub.dev/packages/leak_tracker_testing) because the last one is pure Flutter package and should not reference Flutter Framework. From e0116233ee944c624d0360efcd0f496cdcb42038 Mon Sep 17 00:00:00 2001 From: Polina Cherkasova Date: Thu, 28 Mar 2024 15:11:34 -0700 Subject: [PATCH 3/6] - --- pkgs/leak_tracker/CHANGELOG.md | 4 ++++ pkgs/leak_tracker/lib/src/leak_tracking/_object_record.dart | 5 ++++- pkgs/leak_tracker/pubspec.yaml | 2 +- pkgs/leak_tracker_flutter_testing/CHANGELOG.md | 4 ++++ pkgs/leak_tracker_flutter_testing/pubspec.yaml | 2 +- 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/pkgs/leak_tracker/CHANGELOG.md b/pkgs/leak_tracker/CHANGELOG.md index ed38b102..de205dc8 100644 --- a/pkgs/leak_tracker/CHANGELOG.md +++ b/pkgs/leak_tracker/CHANGELOG.md @@ -1,3 +1,7 @@ +# 10.0.5 + +* Stop failing if finalization happened twice. + # 10.0.4 * Add exceptions to test helpers. diff --git a/pkgs/leak_tracker/lib/src/leak_tracking/_object_record.dart b/pkgs/leak_tracker/lib/src/leak_tracking/_object_record.dart index 070d95b2..ad0c1278 100644 --- a/pkgs/leak_tracker/lib/src/leak_tracking/_object_record.dart +++ b/pkgs/leak_tracker/lib/src/leak_tracking/_object_record.dart @@ -63,7 +63,10 @@ class ObjectRecord { DateTime? _gcedTime; int? _gcedGcCount; void setGCed(int gcCount, DateTime time) { - if (_gcedGcCount != null) throw Exception('The object $code GCed twice'); + // Normally it should not happen, but sometimes finalizer is called twice. + // To repro, update next line to throw exception and run flutter tests with + // the updated leak_tracker. + if (_gcedGcCount != null) return; _gcedGcCount = gcCount; _gcedTime = time; } diff --git a/pkgs/leak_tracker/pubspec.yaml b/pkgs/leak_tracker/pubspec.yaml index 8f36c675..73a75d4c 100644 --- a/pkgs/leak_tracker/pubspec.yaml +++ b/pkgs/leak_tracker/pubspec.yaml @@ -1,5 +1,5 @@ name: leak_tracker -version: 10.0.4 +version: 10.0.5 description: A framework for memory leak tracking for Dart and Flutter applications. repository: https://github.com/dart-lang/leak_tracker/tree/main/pkgs/leak_tracker diff --git a/pkgs/leak_tracker_flutter_testing/CHANGELOG.md b/pkgs/leak_tracker_flutter_testing/CHANGELOG.md index 5bcf86dc..278c30d2 100644 --- a/pkgs/leak_tracker_flutter_testing/CHANGELOG.md +++ b/pkgs/leak_tracker_flutter_testing/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.0.4 + +* Upgrade leak_tracker to 10.0.5. + ## 3.0.3 * Upgrade leak_tracker to 10.0.4. diff --git a/pkgs/leak_tracker_flutter_testing/pubspec.yaml b/pkgs/leak_tracker_flutter_testing/pubspec.yaml index a180d464..79a62650 100644 --- a/pkgs/leak_tracker_flutter_testing/pubspec.yaml +++ b/pkgs/leak_tracker_flutter_testing/pubspec.yaml @@ -1,5 +1,5 @@ name: leak_tracker_flutter_testing -version: 3.0.3 +version: 3.0.4 description: An internal package to test leak tracking with Flutter. repository: https://github.com/dart-lang/leak_tracker/tree/main/pkgs/leak_tracker_flutter_testing From bdcb9797d2c36ff95e40100cbeb22f381ce5d4b4 Mon Sep 17 00:00:00 2001 From: Polina Cherkasova Date: Thu, 28 Mar 2024 15:34:26 -0700 Subject: [PATCH 4/6] - --- .github/workflows/ci.yaml | 34 ++++++++++++++++--- pkgs/leak_tracker/lib/DEPENDENCIES.md | 7 +++- pkgs/leak_tracker/lib/src/DEPENDENCIES.md | 7 +++- .../src/devtools_integration/DEPENDENCIES.md | 7 +++- .../lib/src/leak_tracking/DEPENDENCIES.md | 7 +++- .../lib/src/leak_tracking/leak_tracking.dart | 2 +- .../_retaining_path/DEPENDENCIES.md | 7 +++- .../lib/src/shared/DEPENDENCIES.md | 7 +++- pkgs/leak_tracker/pubspec.yaml | 2 +- .../leak_tracker_flutter_testing/pubspec.yaml | 1 + pkgs/leak_tracker_testing/pubspec.yaml | 2 +- pkgs/memory_usage/pubspec.yaml | 2 +- 12 files changed, 71 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fea3e18d..c632fe31 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -31,18 +31,44 @@ jobs: - name: analyze run: sh ./tool/analyze.sh - - name: dart test + # unit tests: + + - name: dart test leak_tracker run: dart test working-directory: pkgs/leak_tracker - - name: dart test + - name: dart test leak_tracker_testing run: dart test working-directory: pkgs/leak_tracker_testing - - name: flutter test + - name: flutter test leak_tracker_flutter_testing run: flutter test --enable-vmservice working-directory: pkgs/leak_tracker_flutter_testing - - name: integration test + - name: dart test memory_usage + run: dart test + working-directory: pkgs/memory_usage + + # integration tests: + + - name: integration test examples/autosnapshotting run: flutter test integration_test/app_test.dart -d flutter-tester working-directory: examples/autosnapshotting + + # cycles: + + - name: cycles in leak_tracker + run: dart run layerlens --fail-on-cycles + working-directory: pkgs/leak_tracker + + - name: cycles in leak_tracker_testing + run: dart run layerlens --fail-on-cycles + working-directory: pkgs/leak_tracker_testing + + - name: cycles in leak_tracker_flutter_testing + run: dart run layerlens --fail-on-cycles + working-directory: pkgs/leak_tracker_flutter_testing + + - name: cycles in memory_usage + run: dart run layerlens --fail-on-cycles + working-directory: pkgs/memory_usage diff --git a/pkgs/leak_tracker/lib/DEPENDENCIES.md b/pkgs/leak_tracker/lib/DEPENDENCIES.md index 8d2c05d5..3fd4638b 100644 --- a/pkgs/leak_tracker/lib/DEPENDENCIES.md +++ b/pkgs/leak_tracker/lib/DEPENDENCIES.md @@ -1,6 +1,6 @@ ```mermaid @@ -9,3 +9,8 @@ devtools_integration.dart-->src; leak_tracker.dart-->src; ``` +### Inversions +In this folder: 0 + +Including sub-folders: 0 + diff --git a/pkgs/leak_tracker/lib/src/DEPENDENCIES.md b/pkgs/leak_tracker/lib/src/DEPENDENCIES.md index b2a5720e..1113f0ee 100644 --- a/pkgs/leak_tracker/lib/src/DEPENDENCIES.md +++ b/pkgs/leak_tracker/lib/src/DEPENDENCIES.md @@ -1,6 +1,6 @@ ```mermaid @@ -10,3 +10,8 @@ leak_tracking-->devtools_integration; leak_tracking-->shared; ``` +### Inversions +In this folder: 0 + +Including sub-folders: 0 + diff --git a/pkgs/leak_tracker/lib/src/devtools_integration/DEPENDENCIES.md b/pkgs/leak_tracker/lib/src/devtools_integration/DEPENDENCIES.md index dcc2a6c0..5ede0aee 100644 --- a/pkgs/leak_tracker/lib/src/devtools_integration/DEPENDENCIES.md +++ b/pkgs/leak_tracker/lib/src/devtools_integration/DEPENDENCIES.md @@ -1,6 +1,6 @@ ```mermaid @@ -13,3 +13,8 @@ delivery.dart-->_protocol.dart; delivery.dart-->primitives.dart; ``` +### Inversions +In this folder: 0 + +Including sub-folders: 0 + diff --git a/pkgs/leak_tracker/lib/src/leak_tracking/DEPENDENCIES.md b/pkgs/leak_tracker/lib/src/leak_tracking/DEPENDENCIES.md index 1227e72a..e3da911a 100644 --- a/pkgs/leak_tracker/lib/src/leak_tracking/DEPENDENCIES.md +++ b/pkgs/leak_tracker/lib/src/leak_tracking/DEPENDENCIES.md @@ -1,6 +1,6 @@ ```mermaid @@ -27,3 +27,8 @@ leak_tracking.dart-->_leak_tracker.dart; leak_tracking.dart-->primitives; ``` +### Inversions +In this folder: 0 + +Including sub-folders: 0 + diff --git a/pkgs/leak_tracker/lib/src/leak_tracking/leak_tracking.dart b/pkgs/leak_tracker/lib/src/leak_tracking/leak_tracking.dart index 08a93057..74e8bc50 100644 --- a/pkgs/leak_tracker/lib/src/leak_tracking/leak_tracking.dart +++ b/pkgs/leak_tracker/lib/src/leak_tracking/leak_tracking.dart @@ -205,7 +205,7 @@ abstract class LeakTracking { return true; }()); - await (result ?? Future.value()); + await (result ?? Future.value()); } /// Declares all not disposed objects as leaks. diff --git a/pkgs/leak_tracker/lib/src/leak_tracking/primitives/_retaining_path/DEPENDENCIES.md b/pkgs/leak_tracker/lib/src/leak_tracking/primitives/_retaining_path/DEPENDENCIES.md index bd60f4ca..f476335f 100644 --- a/pkgs/leak_tracker/lib/src/leak_tracking/primitives/_retaining_path/DEPENDENCIES.md +++ b/pkgs/leak_tracker/lib/src/leak_tracking/primitives/_retaining_path/DEPENDENCIES.md @@ -1,6 +1,6 @@ ```mermaid @@ -8,3 +8,8 @@ flowchart TD; _retaining_path.dart-->_retaining_path_web.dart; ``` +### Inversions +In this folder: 0 + +Including sub-folders: 0 + diff --git a/pkgs/leak_tracker/lib/src/shared/DEPENDENCIES.md b/pkgs/leak_tracker/lib/src/shared/DEPENDENCIES.md index da7be95e..ed4bb2b6 100644 --- a/pkgs/leak_tracker/lib/src/shared/DEPENDENCIES.md +++ b/pkgs/leak_tracker/lib/src/shared/DEPENDENCIES.md @@ -1,6 +1,6 @@ ```mermaid @@ -11,3 +11,8 @@ shared_model.dart-->_formatting.dart; shared_model.dart-->_primitives.dart; ``` +### Inversions +In this folder: 0 + +Including sub-folders: 0 + diff --git a/pkgs/leak_tracker/pubspec.yaml b/pkgs/leak_tracker/pubspec.yaml index 73a75d4c..d6ac3442 100644 --- a/pkgs/leak_tracker/pubspec.yaml +++ b/pkgs/leak_tracker/pubspec.yaml @@ -18,5 +18,5 @@ dependencies: dev_dependencies: dart_flutter_team_lints: ^2.1.0 - layerlens: ^1.0.0 + layerlens: ^1.0.16 test: ^1.16.0 diff --git a/pkgs/leak_tracker_flutter_testing/pubspec.yaml b/pkgs/leak_tracker_flutter_testing/pubspec.yaml index 79a62650..6906c420 100644 --- a/pkgs/leak_tracker_flutter_testing/pubspec.yaml +++ b/pkgs/leak_tracker_flutter_testing/pubspec.yaml @@ -17,4 +17,5 @@ dependencies: dev_dependencies: dart_flutter_team_lints: ^2.1.0 + layerlens: ^1.0.16 test: ^1.25.0 diff --git a/pkgs/leak_tracker_testing/pubspec.yaml b/pkgs/leak_tracker_testing/pubspec.yaml index fe7ade4e..73d926a3 100644 --- a/pkgs/leak_tracker_testing/pubspec.yaml +++ b/pkgs/leak_tracker_testing/pubspec.yaml @@ -16,5 +16,5 @@ dependencies: dev_dependencies: dart_flutter_team_lints: ^2.1.0 - layerlens: ^1.0.0 + layerlens: ^1.0.16 test: ^1.16.0 diff --git a/pkgs/memory_usage/pubspec.yaml b/pkgs/memory_usage/pubspec.yaml index 70e6a4a6..0c5053f5 100644 --- a/pkgs/memory_usage/pubspec.yaml +++ b/pkgs/memory_usage/pubspec.yaml @@ -11,5 +11,5 @@ dependencies: dev_dependencies: dart_flutter_team_lints: ^2.1.0 - layerlens: ^1.0.0 + layerlens: ^1.0.16 test: ^1.16.0 From 2221d5989bfd93800737bf7bf4da1c4465b5c6be Mon Sep 17 00:00:00 2001 From: Polina Cherkasova Date: Thu, 28 Mar 2024 15:40:01 -0700 Subject: [PATCH 5/6] Update ci.yaml --- .github/workflows/ci.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c632fe31..6d3192e3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -33,19 +33,19 @@ jobs: # unit tests: - - name: dart test leak_tracker + - name: test leak_tracker run: dart test working-directory: pkgs/leak_tracker - - name: dart test leak_tracker_testing + - name: test leak_tracker_testing run: dart test working-directory: pkgs/leak_tracker_testing - - name: flutter test leak_tracker_flutter_testing + - name: test leak_tracker_flutter_testing run: flutter test --enable-vmservice working-directory: pkgs/leak_tracker_flutter_testing - - name: dart test memory_usage + - name: test memory_usage run: dart test working-directory: pkgs/memory_usage From 78f050d68ebed09251a0d619fccaf5db72724ca7 Mon Sep 17 00:00:00 2001 From: Polina Cherkasova Date: Thu, 28 Mar 2024 15:53:11 -0700 Subject: [PATCH 6/6] Update _object_record.dart --- pkgs/leak_tracker/lib/src/leak_tracking/_object_record.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/pkgs/leak_tracker/lib/src/leak_tracking/_object_record.dart b/pkgs/leak_tracker/lib/src/leak_tracking/_object_record.dart index ad0c1278..31dd4966 100644 --- a/pkgs/leak_tracker/lib/src/leak_tracking/_object_record.dart +++ b/pkgs/leak_tracker/lib/src/leak_tracking/_object_record.dart @@ -63,6 +63,7 @@ class ObjectRecord { DateTime? _gcedTime; int? _gcedGcCount; void setGCed(int gcCount, DateTime time) { + // TODO: throw exception if object is already GCed after fix of https://github.com/dart-lang/sdk/issues/55330 // Normally it should not happen, but sometimes finalizer is called twice. // To repro, update next line to throw exception and run flutter tests with // the updated leak_tracker.