Eug*_*kov 6 debugging perl memory-leaks
我DEBUG_LEAKING_SCALARS按照这里描述编译perl
案例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)
Run Code Online (Sandbox Code Playgroud)
没有报道.
情况2
我甚至在我的XS sub中做了这件事.究竟:
#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 3\n" );
ENTERSCOPE;
CALLPERL( sv , G_DISCARD|G_NOARGS );
LEAVESCOPE;
}
MODULE = XS::Utils PACKAGE = XS::Utils
void
test()
CODE:
call_perl();
Run Code Online (Sandbox Code Playgroud)
$ 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, and GNU GPL'd, 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, 1,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)
Run Code Online (Sandbox Code Playgroud)
也没有报道
案例3
我修复了模块Devel :: LeakTrace(The FIX):
$ perl -MDevel::LeakTrace -Iblib/arch/ -Iblib/lib -MXS::Utils -e 'XS::Utils::test()'
Hi 3
Hello
Run Code Online (Sandbox Code Playgroud)
也没有报道
案例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
Run Code Online (Sandbox Code Playgroud)
为什么在perl中内置工具报告没有泄漏?
我错了什么?如何使用DEBUG_LEAKING_SCALARS工具调试泄漏的内存?
实际上不是答案,而是戴夫·米切尔(Dave Mitchell)的答案:
DEBUG_LEAKING_SCALARS 的主要目的不是列出泄漏的标量
(!!)
,而是帮助跟踪通常与泄漏标量和引用计数问题相关的事情。它的两个主要特点是,它将 SV 分配从宏变为函数,以便您可以轻松附加断点;并且它向每个 SV 添加了检测,显示它的分配位置(如 Devel::Peek 显示的)。
但我不知道要调试什么,因为我不知道有什么东西泄漏了。就像上面描述的CASE 1 到3一样。我确信:
newSViv( 323 );
Run Code Online (Sandbox Code Playgroud)
没有泄漏。
所以DEBUG_LEAKING_SCALARS 应该列出泄漏的标量
我还在 perl 提交历史中找到了这个评论:
-[ 24088] 作者: davem on 2005/03/28 21:38:44
- 日志:展开 -DDEBUG_LEAKING_SCALARS 来检测每个 SV 的创建
在我看来,这对于这项任务非常有用。
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |