跟踪大型异步Perl进程中的漏洞

跟踪大型异步Perl进程中的漏洞,perl,memory-leaks,Perl,Memory Leaks,我很抱歉提前-但这篇文章将不包含代码示例 我被指派了一项任务来调试某个模块中的内存泄漏 在这个程序中,我有一个保存数据和其他对象的管理对象。该程序使用异步方法不时更新管理对象 我使用一个Perl模块转储对象,我对引用计数很好奇 由于我使用局部变量打印此对象,因此父引用计数始终为1 我的第二级-实际管理对象refcount始终大于1 所有其他级别也始终为1 以下是一个例子: SV=RV(0xbb3e244)在0xbb3e238处 REFCNT=1 旗帜=(帕德米,韩国) RV=0xcf19478

我很抱歉提前-但这篇文章将不包含代码示例

我被指派了一项任务来调试某个模块中的内存泄漏

在这个程序中,我有一个保存数据和其他对象的管理对象。该程序使用异步方法不时更新管理对象

我使用一个Perl模块转储对象,我对引用计数很好奇

由于我使用局部变量打印此对象,因此父引用计数始终为1

我的第二级-实际管理对象refcount始终大于1

所有其他级别也始终为1

以下是一个例子:

SV=RV(0xbb3e244)在0xbb3e238处
REFCNT=1
旗帜=(帕德米,韩国)
RV=0xcf19478
SV=0xcf19478处的PVHV(0xd0e1f98)
REFCNT=6
标志=(PADMY、对象、OOK、共享密钥)
隐藏=0x9b116a0“”
数组=0xd0ff190(0:106,1:104,2:34,3:10,4:2)
散列质量=105.4%
钥匙=210
填充=150
最大值=255
RITER=-1
EITER=0x0
Elt“”哈希=0x10b5af01
SV=0xcf07ba8处的PVIV(0xce05510)
REFCNT=1
标志=(看,戳,戳,戳)
IV=16200
PV=0xd0fc0d8“16200”\0
CUR=5
LEN=8
Elt“”哈希=0x3ebbb602
SV=0xcfb4350处的PV(0xd10c810)
REFCNT=1
标志=(POK,pPOK)
PV=0xd2008d8”“\0
CUR=4
LEN=8
Elt“”哈希=0x1c7c0002
SV=0xcf197e8处的RV(0xcf197f4)
REFCNT=1
旗帜=(韩国)
RV=0xd456ba0
SV=0xd456ba0处的PVHV(0xd66a11c)
REFCNT=1
FLAGS=(PADMY、OOK、sharekey)
数组=0xd19a8d8(0:3,1:3,2:2)
散列质量=111.4%
键=7
填充=5
最大值=7
RITER=-1
EITER=0x0
Elt“”散列=0x2D24A1
SV=0xc2e3fc0处的RV(0xc2e3fcc)
REFCNT=1
旗帜=(韩国)
RV=0xd550548
我想了解引用计数过程

如果我了解到管理对象Ptr是从多个位置访问的。内部对象只能从管理对象访问一次


如果我从多个位置更新管理对象上的内部字段,是否可能会导致内存泄漏?

嗯,如果不知道您实际在做什么,很难直接回答

但是是的-perl使用引用计数来确定内存是否仍在使用中。完全有可能导致循环引用,因此内存将永远无法“释放”,从而导致泄漏


可以避免这种情况的方法是通过
Scalar::Util
模块和
弱化
函数调用,它允许引用存在,但不允许引用计数的“计数”

异步(事件驱动)程序中的一个典型问题是,对象通常是从附加到某个事件循环的回调中引用的,因此必须非常小心地清除所有错误。从战略上使用
削弱
在这方面有很大帮助


但一旦出现混乱,就很难调试了。我通常使用我自己的模块来追踪那些没有像预期的那样被破坏的对象,并认为它比DEVEL::PEEK更易于使用。但是Devel::TrackObjects它只能处理对象,对其他类型的循环引用没有帮助。

谢谢,我将对此进行研究。我还试图理解Devel::Peek信息的输出。像FLAGS info、ARRAY、KEYS、RITER、EITER、STASH、ELT一样,我找不到任何文档来解释这些条目的含义。@yanger,.//你真正关心的唯一标志是lok、NOK和POK。这些参数指示标量是否包含整数、浮点和/或字符串数组是指向存储桶数组的指针。(无需查看。)//KEYS是散列中的元素数。//FILL是使用的桶数。(您不需要查看。)//RITER和EITER可能存储哈希迭代器的状态。(你不必看。)//Elt是元素的缩写。(它显示键及其散列的内容,后面是值的转储。)其他感兴趣的标志:ROK(包含一个ref)、OBJECT(祝福)、COW(PV由多个标量共享)。因此我有一个后续问题-散列中的键数是否有限制?在我发布的示例中:“KEYS=210 | FILL=150 | MAX=255”如果我有256个键会发生什么?没什么。散列可以大得多,这让问题变得不必要的复杂。看起来您已经尝试合理地格式化它,因为文本包含几个单独的换行符,Stack Overflow将这些换行符视为通用空白。但降价并非如此。我已经编辑了你的文章,使其呈现出我认为你想要的样子,但是如果有任何错误,请回滚我的更改。你的问题“我想了解引用计数过程”的实质不是吗?在这种情况下,你的问题是离题的。我可以向您介绍,但您正在询问一种复杂的高级编程语言的内部结构,我认为您应该花几个星期的时间来理解它是如何工作的