所以,这是一个简单的例子 - 但如果我设置这样的循环引用:
#!/usr/bin/perl
use strict;
use warnings;
{
my $thing;
my $otherthing;
$thing -> {otherthing} = \$otherthing;
$otherthing -> {thing} = \$thing;
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个内存泄漏 - 因为通过引用计数,这里分配的内存永远不会被释放,尽管没有任何外向的"访问点".
所以我想知道 - 在这种情况下,有什么方法可以 - 通过调试或类似方式 - '重新发现'这些变量并再次访问它们?
假设我正在考虑一个不那么简单的案例 - 你有一个记忆泄漏的对象,但是想再次"抓住"它以查看其中的内容,给出关于所述对象中的内容以及因此问题所在的提示开始了.
这只是对问题评论中建议的模块的整理.它包含每个模块的POD文档的链接,并引用名称和描述部分.它意味着可以访问.我没有添加或改变作者所写的内容,或从名称和描述部分以外的任何地方提取信息
欢迎任何人使用其他模块更新它,只要他们保持这种格式.或者,任何人都可以引起我的注意,它需要更新,我会在我能够这样做的时候这样做
许多伟大的程序员对英语不是那么好,所以虽然我试图准确引用文档,但我已经削减了我认为不太相关的部分,以符合这篇文章的目的
Devel::Cycle- 在对象中查找内存循环这是一个简单的开发人员工具,用于在对象和其他类型的引用中查找循环引用.由于Perl基于引用计数的内存管理,循环引用将导致内存泄漏.
Devel::LeakTrace::Fast- 指出泄漏变量的来源.
Devel::LeakTrace::Fast是改写Devel::LeakTrace.就像Devel::LeakTrace它使用runopsperl 5.6及更高版本中的可插入功能一样,以便跟踪正在运行的程序的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的数据看起来像他们认为的样子.