2012-07-20 113 views
1

我發現this perl script that parses linux smaps,但似乎有點過時了:我該如何解決這個解析linux smaps的perl腳本?

#!/usr/bin/perl 

# Copyright Ben Maurer 
# you can distribute this under the MIT/X11 License 

use Linux::Smaps; 

my $pid=shift @ARGV; 
unless ($pid) { 
     print "./smem.pl <pid>\n"; 
     exit 1; 
} 
my $map=Linux::Smaps->new($pid); 
my @VMAs = $map->vmas; 

format STDOUT = 
VMSIZE: @######## kb 
$map->size 
RSS:  @######## kb total 
$map->rss 
     @######## kb shared 
$map->shared_clean + $map->shared_dirty 
     @######## kb private clean 
$map->private_clean 
     @######## kb private dirty 
$map->private_dirty 
. 

write; 

printPrivateMappings(); 
printSharedMappings(); 

sub sharedMappings() { 
    return grep { ($_->shared_clean + $_->shared_dirty) > 0 } @VMAs; 
} 

sub privateMappings() { 
    return grep { ($_->private_clean + $_->private_dirty) > 0 } @VMAs; 
} 

sub printPrivateMappings() 
{ 
    $TYPE = "PRIVATE MAPPINGS"; 
    $^ = 'SECTION_HEADER'; 
    $~ = 'SECTION_ITEM'; 
    $- = 0; 
    $= = 100000000; 
    foreach $vma (sort {-($a->private_dirty <=> $b->private_dirty)} 
            privateMappings()) { 
     $size = $vma->size; 
     $dirty = $vma->private_dirty; 
     $clean = $vma->private_clean; 
     $file = $vma->file_name; 
     write; 
    } 
} 

sub printSharedMappings() 
{ 
    $TYPE = "SHARED MAPPINGS"; 
    $^ = 'SECTION_HEADER'; 
    $~ = 'SECTION_ITEM'; 
    $- = 0; 
    $= = 100000000; 

    foreach $vma (sort {-(($a->shared_clean + $a->shared_dirty) 
          <=> 
          ($b->shared_clean + $b->shared_dirty))} 
        sharedMappings()) { 

     $size = $vma->size; 
     $dirty = $vma->shared_dirty; 
     $clean = $vma->shared_clean; 
     $file = $vma->file_name; 
     write; 


    } 
} 

format SECTION_HEADER = 
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
$TYPE 
@>>>>>>>>>> @>>>>>>>>>> @>>>>>>>>> @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
"vmsize" "rss clean" "rss dirty" "file" 
. 

format SECTION_ITEM = 
@####### kb @####### kb @####### kb @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
$size $clean $dirty $file 
. 

當我運行該腳本,我得到:

./smem.perl 121212 
Use of comma-less variable list is deprecated at ./smem.perl line 86. 
Use of comma-less variable list is deprecated at ./smem.perl line 86. 
Use of comma-less variable list is deprecated at ./smem.perl line 86. 
Use of comma-less variable list is deprecated at ./smem.perl line 91. 
Use of comma-less variable list is deprecated at ./smem.perl line 91. 
Use of comma-less variable list is deprecated at ./smem.perl line 91. 
Can't locate object method "size" via package "Linux::Smaps" at ./smem.perl line 18. 

我運行的Perl 5和Linux的最新版本: :Smaps。我不是一個perl傢伙,但我想知道這是否是一個簡單的解決方案。另外如果你知道一個類似的工具,我也很想聽到這個。

+0

嘗試增加逗號在所述第一格式的第四行(「vmsize」,「RSS乾淨」,「RSS髒」,「文件」),和在第二種格式的變量之間($ size,$ clean,$ dirty,$ file)。 – 2012-07-20 21:12:28

+0

謝謝,清除警告! – 2012-07-20 21:22:07

回答

1

模塊的源有揭示了什麼回事評論:

It creates accessor methods dynamically depending on what the kernel reveals. 

什麼,告訴我的是,即使你可能已經實例化正確的對象,size尚未動態創建尚未存取方法。這可能是內核不「揭示」完全填充對象所需的一切的結果。

格式棄用消息是非致命的,但在方法尚未創建時嘗試從模塊調用對象方法是。

至於已過時的消息,請參閱串之間Why isn't my Perl format working?