liujiakuoyx / leak_detector

flutter memory leak detector.
BSD 2-Clause "Simplified" License
133 stars 24 forks source link

leak_preview_page.dart scrollController 没有dispose #7

Closed fishofeyes closed 2 years ago

fishofeyes commented 2 years ago

leak_preview_page.dart scrollController 没有dispose

coku00 commented 2 years ago

故意写一段内存泄漏的代码,发现很难触发内存泄漏

liujiakuoyx commented 2 years ago

leak_preview_page.dart scrollController 没有dispose

已经fix

liujiakuoyx commented 2 years ago

故意写一段内存泄漏的代码,发现很难触发内存泄漏

这个库写的比较简单,目前仅能检测到Widget Element State之类的释放行为,并且vm_service这个插件获取引用链的时候经常会报错,没有具体的报错原因,应该是dartVM中报错了。导致引用链获取失败,就会检测不到。

liujiakuoyx commented 2 years ago

scrollController没有dispose已修复

coku00 commented 2 years ago

故意写一段内存泄漏的代码,发现很难触发内存泄漏

这个库写的比较简单,目前仅能检测到Widget Element State之类的释放行为,并且vm_service这个插件获取引用链的时候经常会报错,没有具体的报错原因,应该是dartVM中报错了。导致引用链获取失败,就会检测不到。

当对象被回收了再使用object id去获取引用链就会报错

Lamda303 commented 1 year ago

当对象被回收了再使用object id去获取引用链就会报错

故意写的一段内存泄露,结果检测出来的InstanceRef.id 为 'objects/null',获取不到引用链,会是同样的原因吗?

liujiakuoyx commented 1 year ago

当对象被回收了再使用object id去获取引用链就会报错

故意写的一段内存泄露,结果检测出来的InstanceRef.id 为 'objects/null',获取不到引用链,会是同样的原因吗?

可以把测试代码贴出来看看吗

Lamda303 commented 1 year ago
class _LeakTestPageState extends State<LeakTestPage> {

  int countTimer = 100;
  Timer? timer;

  @override
  void initState() {
    super.initState();
    timer = Timer.periodic(const Duration(milliseconds: 1000), (timer) {
      countTimer--;
      if (countTimer == 0) {
        timer.cancel();
      }
      print('leakTest $countTimer $widget');
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
          icon: const Icon(
              Icons.chevron_left
          ),
          onPressed: _back,
        ),
      ),
      body: Container(

      ),
    );
  }

  void _back() {
    Navigator.of(context).pop();
  }
}

其实就是用一个Timer去打印widget,奇怪的是这个测试页面放在示例demo里面能检测出来,放在项目里面就不行了,头秃。

image
Lamda303 commented 1 year ago

可以把测试代码贴出来看看吗

上面的测试代码在项目中没检出泄露找到原因了,在添加弱引用时,拿到的是Page的child也就是Scaffold。

image

我在第2个visitChildElements对element赋值就能检测出来

liujiakuoyx commented 1 year ago

感谢反馈,请问您用的哪个Flutter版本,我看一下源码,看能不能找到一种更优的寻找Element的办法

Lamda303 commented 1 year ago

感谢反馈,请问您用的哪个Flutter版本,我看一下源码,看能不能找到一种更优的寻找Element的办法

[✓] Flutter (Channel stable, 3.3.7, on macOS 13.0 22A380 darwin-arm, locale zh-Hans-CN) [!] Android toolchain - develop for Android devices (Android SDK version 33.0.2) ! Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses [✓] Android Studio (version 2022.1)