加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用`DEBUG_LEAKING_SCALARS`编译perl时,为什么不报告内存泄漏?

发布时间:2020-12-15 23:36:12 所属栏目:大数据 来源:网络整理
导读:我用DEBUG_LEAKING_SCALARS编译perl,如 here所述 情况1 我按照这个DOC来测试内存泄漏报告: env PERL_DESTRUCT_LEVEL=2 valgrind perl -e '@x; $x[0]=@x'==7216== Memcheck,a memory error detector==7216== Copyright (C) 2002-2015,and GNU GPL'd,by Juli
我用DEBUG_LEAKING_SCALARS编译perl,如 here所述

情况1
我按照这个DOC来测试内存泄漏报告:

env PERL_DESTRUCT_LEVEL=2 valgrind perl -e '@x; $x[0]=@x'
==7216== Memcheck,a memory error detector
==7216== Copyright (C) 2002-2015,and GNU GPL'd,by Julian Seward et al.
==7216== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==7216== Command: perl -e @x; $x[0]=@x
==7216== 
==7216== 
==7216== HEAP SUMMARY:
==7216==     in use at exit: 0 bytes in 0 blocks
==7216==   total heap usage: 1,310 allocs,1,310 frees,171,397 bytes allocated
==7216== 
==7216== All heap blocks were freed -- no leaks are possible
==7216== 
==7216== For counts of detected and suppressed errors,rerun with: -v
==7216== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

没有报道.

案例2
我甚至在我的XS子中做this thing.确切地说:

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "XSUtils.h"
#include "ppport.h"

void
call_perl() {
    SV *sv;
    sv =  sv_2mortal( newSVpv( "XS::Utils::hello",0 ) );

    newSViv( 323 );     //<<<< SHOULD LEAK
    printf( "Hi 3n" );

    ENTERSCOPE;
    CALLPERL( sv,G_DISCARD|G_NOARGS );
    LEAVESCOPE;
}

MODULE = XS::Utils                    PACKAGE = XS::Utils

void
test()
    CODE:
        call_perl();

Link to the REPO

$env PERL_DESTRUCT_LEVEL=2 valgrind perl -Iblib/arch/ -Iblib/lib -MXS::Utils -e 'XS::Utils::test()' 
==7308== Memcheck,a memory error detector
==7308== Copyright (C) 2002-2015,by Julian Seward et al.
==7308== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==7308== Command: perl -Iblib/arch/ -Iblib/lib -MXS::Utils -e XS::Utils::test()
==7308== 
Hi 3
Hello
==7308== 
==7308== HEAP SUMMARY:
==7308==     in use at exit: 1,502 bytes in 5 blocks
==7308==   total heap usage: 12,876 allocs,12,871 frees,945,298 bytes allocated
==7308== 
==7308== LEAK SUMMARY:
==7308==    definitely lost: 0 bytes in 0 blocks
==7308==    indirectly lost: 0 bytes in 0 blocks
==7308==      possibly lost: 0 bytes in 0 blocks
==7308==    still reachable: 1,502 bytes in 5 blocks
==7308==         suppressed: 0 bytes in 0 blocks
==7308== Rerun with --leak-check=full to see details of leaked memory
==7308== 
==7308== For counts of detected and suppressed errors,rerun with: -v
==7308== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

也没有报道

案例3
我修复了模块Devel::LeakTrace(FIX):

$perl -MDevel::LeakTrace -Iblib/arch/ -Iblib/lib -MXS::Utils -e 'XS::Utils::test()' 
Hi 3
Hello

也没有报道

案例4
我只找到Test::LeakTrace做它的工作:

$perl -MTest::LeakTrace::Script=-verbose -Iblib/arch/ -Iblib/lib -MXS::Utils -e 'XS::Utils::test()' 
Hi 3
Hello
leaked SCALAR(0x208e1c0) from -e line 1.
ALLOCATED at -e:1 by entersub (parent 0x0); serial 9642
SV = IV(0x208e1b0) at 0x208e1c0
  REFCNT = 1
  FLAGS = (IOK,pIOK)
  IV = 323

为什么在perl中内置工具报告没有泄漏?
我错了什么?如何使用DEBUG_LEAKING_SCALARS工具调试泄漏的内存?

解决方法

实际上不是答案,而是来自Dave Mitchell:

The main purpose of DEBUG_LEAKING_SCALARS isn’t to list leaked scalars
(!!)
It’s to help in tracking down things generally related to leaked scalars
and refcount problems. its two main features are that it turns SV
allocation from being a macro to being a function so that you can easy
attach a breakpoint; and that it adds instrumentation to each SV showing
where it was allocated (as displayed by Devel::Peek).

但我不知道要调试什么,因为我不知道有什么东西在泄漏.像上面描述的1到3的CASE.我确信:

newSViv( 323 );

没有泄漏.

所以DEBUG_LEAKING_SCALARS应该列出泄漏的标量

我也在perl commit history中找到了这条评论:

-[ 24088] By: davem on 2005/03/28 21:38:44
– Log: expand -DDEBUG_LEAKING_SCALARS to instrument the creation of each SV

这对我脑海中的this任务非常有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读