簡體   English   中英

如何修復解析Linux smap的perl腳本?

[英]How can I fix 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家伙,但我想知道這是否是簡單的解決方法。 另外,如果您知道類似的實用程序,我也希望知道。

該模塊的來源有一條注釋,揭示了正在發生的事情:

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

告訴我的是,即使您可能已正確實例化了該對象,但訪問器方法的size尚未動態創建。 這可能是內核沒有“揭示”完全填充對象所需的一切的結果。

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

至於棄用消息,請參閱為什么我的Perl格式不起作用?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM