【问题标题】:Finding 'lost' variables (circular references)寻找“丢失”的变量(循环引用)
【发布时间】:2015-11-08 13:45:17
【问题描述】:

所以,这有点简单——但如果我像这样设置循环引用:

#!/usr/bin/perl
use strict;
use warnings;

{ 
   my $thing; 
   my $otherthing;
   $thing -> {otherthing} = \$otherthing;
   $otherthing -> {thing} = \$thing; 
}

我创建了内存泄漏 - 因为通过引用计数,这里分配的内存将永远不会被释放,尽管没有任何外部“访问点”。

所以我想知道 - 在这种情况下,我有什么方法可以 - 通过调试或类似方式 - “重新发现”这些变量并再次访问它们?

假设我正在考虑一个不那么琐碎的情况 - 你有一个内存泄漏的对象,但想再次“捕捉”它以查看其中的内容,以提示所述对象中的内容,因此问题开始的地方。

【问题讨论】:

标签: perl reference


【解决方案1】:

这只是 cmets 中有关该问题的推荐模块的精选。它包括每个模块的 POD 文档的链接,并引用 namedescription 部分。它意味着可以访问。除了名称和描述部分,我没有在任何地方添加或更改作者所写的内容,或从任何地方提取信息

欢迎任何人使用其他模块对其进行更新,只要他们保持这种格式。或者,任何人都可以提请我注意它需要更新的事实,我会在有能力的时候这样做

许多优秀的程序员的英语不太好,所以虽然我试图准确地引用文档,但为了符合这篇文章的目的,我已经删掉了我认为不太相关的部分

Devel::Cycle - 查找对象中的内存周期

这是一个简单的开发人员工具,用于在对象和其他类型的引用中查找循环引用。由于 Perl 基于引用计数的内存管理,循环引用会导致内存泄漏。

Devel::LeakTrace::Fast - 指出泄露变量的来源。

Devel::LeakTrace::FastDevel::LeakTrace 的重写。与 Devel::LeakTrace 一样,它使用 perl 5.6 及更高版本中的可插入 runops 功能来跟踪正在运行的程序的 SV 分配。

END 时间Devel::LeakTrace::Fast 识别任何剩余的变量,并报告这些变量出现的行。

Devel::Gladiator - 漫步 Perl 的竞技场

Devel::Gladiator 迭代 Perl 的内部内存结构,可用于枚举所有当前活动的 SV。

这可用于寻找泄漏和分析内存使用情况。

Devel::MAT::Dumper - 写一个堆转储文件供以后分析

这个模块提供了内存转储功能,它创建了一个堆转储文件,以后可以被Devel::MAT::Dumpfile读取。它提供了一个不导出的函数,它将文件写入给定的路径。

转储文件将包含 Perl 领域中每个 SV 的表示,提供有关它们之间的指针的信息,以及有关进程在创建时的状态的其他信息。它包含当时进程的快照,以后可以使用Devel::MAT::Dumpfile通过各种工具加载和分析。

Devel::Peek - XS 程序员的数据调试工具

Devel::Peek 包含允许从 Perl 脚本操作原始 Perl 数据类型的函数。那些进行 XS 编程的人使用它来检查他们从 C 发送到 Perl 的数据是否与他们认为的一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多