我在我的程序中运行了
Devel::Leak
,我不明白它给我的输出.
要开始,我看到它打印了一个指针列表.我可以在列表中获取该列表吗?然后我可以使用FindRef来查看它的来源.
例如:
new 0xaebc28 : SV = PVGV(0x30e7e48) at 0xaebc28 REFCNT = 1 FLAGS = (GMG,SMG) IV = 0 NV = 0 PV = 0 MAGIC = 0x2db7dc0 MG_VIRTUAL = &PL_vtbl_glob MG_TYPE = PERL_MAGIC_glob(*) MG_OBJ = 0xaebc28 NAME = "SUPER::" NAMELEN = 7 GvSTASH = 0x76b228 "IO::File" GP = 0x314b170 SV = 0x30283c8 REFCNT = 1 IO = 0x0 FORM = 0x0 AV = 0x0 HV = 0x301fdb8 CV = 0x0 CVGEN = 0x0 GPFLAGS = 0x0 LINE = 161 FILE = "/mypath/perl_install/perl/lib/5.8.9/x86_64-linux/IO/File.pm" FLAGS = 0x0 EGV = 0xaebc28 "SUPER::"
或一堆较小的条目:
new 0x161c268 : SV = RV(0x3029b40) at 0x161c268 REFCNT = 1 FLAGS = (ROK) RV = 0x161c218
我该怎么办?我得到Perl结构的东西(魔术,iv,pv,..),但是如何从这些行去知道我的泄漏发生在哪里?
解决方法
看看
Devel::LeakTrace的一个模块,它还记录了内存被分配的位置.