使用`DEBUG_LEAKING_SCALARS`编译perl时,为什么不报告内存泄漏?
我用DEBUG_LEAKING_SCALARS编译perl,如
here所述
情况1 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 #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 $perl -MDevel::LeakTrace -Iblib/arch/ -Iblib/lib -MXS::Utils -e 'XS::Utils::test()' Hi 3 Hello 也没有报道 案例4 $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中内置工具报告没有泄漏? 解决方法
实际上不是答案,而是来自Dave Mitchell:
但我不知道要调试什么,因为我不知道有什么东西在泄漏.像上面描述的1到3的CASE.我确信: newSViv( 323 ); 没有泄漏. 所以DEBUG_LEAKING_SCALARS应该列出泄漏的标量 我也在perl commit history中找到了这条评论:
这对我脑海中的this任务非常有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |