亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? exmap.pm

?? 內(nèi)存管理工具Exmap。該工具比 ps 或 top 更精確
?? PM
?? 第 1 頁 / 共 2 頁
字號:
## (c) John Berthels 2005 <jjberthels@gmail.com>. See COPYING for license.#use Elf;use strict;use warnings;my $DEBUG_ON = $ENV{EXMAP_DEBUG};sub debug{    print STDERR join(":", @_), "\n" if $DEBUG_ON;}# ------------------------------------------------------------package Exmap::Obj;my $OBJ_LIFETIME_DEBUG = 0;sub _init { return shift; }sub new{    my $c = shift;    $c = ref $c if ref $c;    my $s = {};    bless $s, $c;    print "C: $s\n" if $OBJ_LIFETIME_DEBUG;    return $s->_init(@_);}sub DESTROY{    my $s = shift;    print "D: $s\n" if $OBJ_LIFETIME_DEBUG;}    # ------------------------------------------------------------# Map page cookie -> usage countpackage Exmap::PagePool;use base qw/Exmap::Obj/;# This used to be an object with accessors to add pages and read# counts.  But they showed up as very hot in profiling, and accessing# via a straight hash is still fairly clean.sub clear{    my $s = shift;    %$s = ();    #    print "C:\n";}# ------------------------------------------------------------package Exmap::FilePool;use base qw/Exmap::Obj/;sub clear{    my $s = shift;    %$s = ();}sub name_to_file{    my $s = shift;    my $fname = shift;    return $s->{$fname};}sub get_or_make_file{    my $s = shift;    my $fname = shift;    my $file = $s->name_to_file($fname);    return $file if $file;    $s->{$fname} = Exmap::File->new($fname);    return $s->{$fname};}sub files{    my $s = shift;    return values %$s;}# ------------------------------------------------------------package Exmap;use base qw/Exmap::Obj/;sub _init{    my $s = shift;    $s->{_procs} = [];    $s->{_pid_to_proc} = {};    $s->{_page_pool} = Exmap::PagePool->new;    $s->{_file_pool} = Exmap::FilePool->new;    return $s;}sub procs { return @{$_[0]->{_procs}}; }sub page_pool { return $_[0]->{_page_pool}; }sub file_pool { return $_[0]->{_file_pool}; }sub files { return $_[0]->file_pool->files; }sub pids{    my $s = shift;    return keys %{$s->{_pid_to_proc}};}sub pid_to_proc{    my $s = shift;    my $pid = shift;    return $s->{_pid_to_proc}->{$pid};}sub num_procs{    my $s = shift;    return scalar($s->procs);}sub _all_pids{    my $s = shift;    my @pids = map { s!^/proc/!!; $_; } glob "/proc/[0-9]*";    return sort { $a <=> $b } @pids;}sub load{    my $s = shift;    my $progress = shift;    my $test_info = shift;    $s->_load_procs($test_info)	or return undef;    $progress->number_of_ticks(scalar $s->procs)	if $progress;    $s->_calculate_file_mappings($progress)	or return undef;    $progress->finished if $progress;        return 1;}sub _load_procs{    my $s = shift;    my $test_info = shift;        my $pp = $s->page_pool;    $pp->clear;        # Don't monitor ourselves, our VMAs etc will change too much as we run    my @pids = grep { $_ != $$ } $s->_all_pids();    @pids = @{$test_info->{pids}} if $test_info;    my @procs;    foreach my $pid (@pids) {	my $proc_prefix = "/proc";	$proc_prefix = $test_info->{proc} if $test_info;	my $exmap_data = $test_info->{exmap_files}->{$pid};		my $proc = Exmap::Process->new($pid, $proc_prefix);	unless ($proc->load($pp, $exmap_data)) {	    warn("Can't load info for pid $pid");	    next;	}	push @procs, $proc if $proc->has_mm;    }        $s->{_procs} = \@procs;    $s->{_pid_to_proc} = { map { $_->pid => $_ } @procs };        return scalar @procs;}sub _calculate_file_mappings{    my $s = shift;    my $progress = shift;        foreach my $proc ($s->procs) {	warn("Failed to process maps for pid ", $proc->pid)	    unless $proc->_calc_vma_maps($s->file_pool);	$progress->tick($proc->pid . ": " . $proc->cmdline)	    if $progress;    }    return scalar $s->files;}# ------------------------------------------------------------# Abstract base class for callers of Exmap::load to get progress updatespackage Exmap::Progress;use base qw/Exmap::Obj/;# Called when the load initialises. You can override this if you wish.sub number_of_ticks{    my $s = shift;    $s->{_num_ticks} = shift;    return 1;}# Called whenever we tick. You'll want to override this.sub tick{    my $s = shift;    my $text = shift;    return 1;}# Called after the last tick. You'll probably want to override this.sub finished{    my $s = shift;    my $text = shift;    return 1;}# ------------------------------------------------------------package Exmap::Process;use base qw/Exmap::Obj/;use constant EXMAP_FILE => "/proc/exmap";sub _init{    my $s = shift;    $s->{_pid} = shift;    $s->{_proc_prefix} = shift || "/proc";    $s->{_exe_name} = readlink "$s->{_proc_prefix}/$s->{_pid}/exe";    my @cmdline = split /[ \0]/, `cat $s->{_proc_prefix}/$s->{_pid}/cmdline`;    if (@cmdline > 1) {	# Hack so we can see [kdeinit]	if ($cmdline[1] =~ /^\[/ ) {	    @cmdline = @cmdline[0..1];	}	else {	    @cmdline = $cmdline[0];	}    }    $s->{_cmdline} = join(" ", @cmdline);    $s->{_files} = {};    return $s;}sub load{    my $s = shift;    my $page_pool = shift;    my $test_exmap_file = shift; # Or undef for the real exmap    unless ($s->_load_vmas($page_pool)) {	warn "Can't load vmas for " . $s->pid;	return undef;    }    return 1 unless $s->has_mm;    unless ($s->_load_page_info($test_exmap_file)) {	warn "Can't load page info for " . $s->pid;	return undef;    }    return 1;}sub pid { return $_[0]->{_pid}; }sub exe_name { return $_[0]->{_exe_name}; }sub cmdline { return $_[0]->{_cmdline}; }sub _vmas { return @{$_[0]->{_vmas}}; }sub has_mm{    my $s = shift;    return exists $s->{_vmas} && scalar $s->_vmas > 0;}sub maps { return @{$_[0]->{_maps}}; }sub files { return values %{$_[0]->{_files}}; }sub _find_vma_by_addr{    my $s = shift;    my $addr = shift;    return $s->{_start_to_vma}->{$addr};}sub add_file{    my $s = shift;    my $file = shift;    # Store as a hash for easy uniqueness. Hash keys are stringified,    # so we need to store the obj reference as a value    $s->{_files}->{$file} = $file;}sub _has_file{    my $s = shift;    my $file = shift;    my @matches = grep { $_ eq $file } $s->files;    warn("File ", $file->name, " present in process ", $s->pid,	 " more than once")	if (scalar @matches > 1);    return scalar @matches == 1;}sub _restrict_maps_to_file{    my $s = shift;    my $file = shift;    my @maps = @_;    unless ($file) {	warn("No file to specified");	return ();    }    unless ($s->_has_file($file)) {	warn("PID ", $s->pid, " doesn't have file ", $file->name);	return ();    }    my %count;    my @file_maps = $file->maps;    foreach my $map (@maps, @file_maps) {	$count{$map}++;    }    # Only keep those in both arrays.    @maps = grep { $count{$_} > 1 } @maps;    return @maps;}sub _refine_maps_to_elf_range{    my $s = shift;    my $elf_range = shift;    my @maps = @_;    return () unless $elf_range->size > 0;    my @refinements;        foreach my $map (@maps) {	if ($map->elf_range	    && $map->elf_range->overlaps($elf_range)) {	    my $subrange = $elf_range->intersect($map->elf_range);	    my $mem_range = $map->elf_to_mem_range($subrange);	    push @refinements, { map => $map,				 range => $mem_range };	}    }    unless (@refinements) {	my $warnstr = $s->pid . ": no map refinements for elf range "	    . $elf_range->to_string. ": "		. join(", ", map { $_->elf_range				       ? $_->elf_range->to_string				   : "undef" } @maps);	warn($warnstr);    }        return @refinements;}# This takes on optional 'file' parameter, which may also be followed# by an optional 'elf_range' parameter. These are both used to restrict the# maps to be summed over.sub sizes{    my $s = shift;    my $file = shift;    my @maps = $s->maps;    warn ("No maps in process", $s->pid) unless @maps;    if ($file) {	@maps = $s->_restrict_maps_to_file($file, @maps);	warn ("No maps for file " . $file->name . " in process ", $s->pid)	    unless @maps;    }    my $sizes = Exmap::Sizes->new;    foreach my $m (@maps) {	my $subsizes = $m->sizes_for_mem_range;	$sizes->add($subsizes);    }    return $sizes;}sub elf_range_sizes{    my $s = shift;    my $file = shift;    my @elf_ranges = @_;    my @maps = $s->maps;    warn ("No maps in process", $s->pid) unless @maps;    @maps = $s->_restrict_maps_to_file($file, @maps);    warn ("No maps for file " . $file->name . " in process ", $s->pid)	unless @maps;    my @sizes;    foreach my $elf_range (@elf_ranges) {	# A list of { map => $map, range => $mem_range }. Undef range	# implies full map.	my @refinements = $s->_refine_maps_to_elf_range($elf_range, @maps);	my $sizes = Exmap::Sizes->new;	foreach my $r (@refinements) {	    my $subsizes = $r->{map}->sizes_for_mem_range($r->{range});	    $sizes->add($subsizes);	}	push @sizes, $sizes;    }    return @sizes;}sub _load_vmas{    my $s = shift;    my $page_pool = shift;    my $mapfile = "$s->{_proc_prefix}/" . $s->pid . "/maps";        unless (open (M, "< $mapfile")) {	warn("Can't open mapfile $mapfile: $!");	return undef;    }    my @map_lines = <M>;    close M;    # Kernel threads have no maps. Thats OK.    return 1 if (@map_lines == 0);    my @vmas;    foreach my $line (@map_lines) {	$line =~ s/\r?\n$//;	my $vma = Exmap::Vma->new($page_pool);	unless ($vma->parse_line($line)) {	    warn("Can't create VMA for line $line");	    next;	}	# Don't add the [vdso] map, it doesn't exist as a vma	# in the kernel.	push @vmas, $vma unless $vma->is_vdso;    }    # Store as hash for fast addr lookup    $s->{_start_to_vma} = {		   map { $_->{info}->{start}, $_ } @vmas		  };    # Keep the ordered list    $s->{_vmas} = \@vmas;        return $s;}sub _load_page_info{    my $s = shift;    my $test_exmap_file = shift;    my $exmap_file = $test_exmap_file ? $test_exmap_file : EXMAP_FILE;    # Ask exmap about our pid    if ($test_exmap_file) {	unless(open (E, "< $exmap_file")) {	    warn("can't open test exmap file $test_exmap_file");	    return undef;	}    }    else {	unless (open(E, "+> $exmap_file")) {	    warn("can't open $exmap_file for writing : $!");	    return undef;	}	print E $s->pid, "\n";    }    my $current_vma;    my $page_cookie;    my ($pfn, $swap_entry, $line);    while ($line = <E>) {	# Lines are either:	# Start a new VMA:	# VMA 0xdeadbeef <npages>	# or	# Page info	# <pfn> <swap_entry>	if ($line =~ /^VMA/) {	    # New VMA	    my ($vma_hex_start, $npages) = $line =~ /^VMA\s+0x(\S+)\s+(\d+)$/;	    my $vma_start = hex $vma_hex_start;	    my $vma = $s->_find_vma_by_addr($vma_start);	    unless ($vma) {		# TODO - try reload completely here?		warn("PID ", $s->pid, " can't find VMA $vma_hex_start");		return undef;	    }	    $current_vma = $vma;	}	else {	    $page_cookie = Exmap::Page::line_to_cookie($line);	    $current_vma->add_page($page_cookie);	}    }    close E;    return 1;}sub _calc_vma_maps{    my $s = shift;    my $filepool = shift;    my @maps; # Accumulate all the per-proc maps in here    my @vmas = $s->_vmas;    my $previous_vma;    my $previous_file;    foreach my $vma (@vmas) {	my $file = $filepool->get_or_make_file($vma->{info}->{file});	$file->add_proc($s);	my @vma_maps = $vma->calc_maps($file,				       $previous_vma,				       $previous_file,				       $s->pid);	warn sprintf("%d: Can't calc maps for vma 0x%08x : %s",		     $s->pid, $vma->{info}->{start}, $file->name)	    unless @vma_maps;		push @maps, @vma_maps;	$s->add_file($file);	$previous_vma = $vma;	$previous_file = $file;    }    my @ranges = map { $_->mem_range } @maps;    my $last_range;    foreach my $range (@ranges) {	if ($last_range) {	    if ($range->overlaps($last_range)) {		warn sprintf("%d: Invalid map list %s, %s",			     $s->pid,			     $last_range->to_string,			     $range->to_string);		return undef;	    }	}	$last_range = $range;    }    $s->{_maps} = \@maps;    return scalar @maps;}# ------------------------------------------------------------package Exmap::File;use base qw/Exmap::Obj/;sub _init{    my $s = shift;    $s->{_name} = shift;    $s->{_maps} = [];    $s->{_procs} = [];    if (-f $s->name) {	$s->{_elf} = Elf->new($s->name,			      1); # Suppress warning if not elf    }    return $s;}sub name { return $_[0]->{_name}; }sub procs { return @{$_[0]->{_procs}}; }sub elf { return $_[0]->{_elf}; }sub is_elf { return $_[0]->elf; } # Mmmm. Sugary.sub maps { return @{$_[0]->{_maps}}; }sub sizes{    my $s = shift;    my $sizes = Exmap::Sizes->new;    foreach my $map ($s->maps) {	my $subsizes = $map->sizes_for_mem_range;	$sizes->add($subsizes);    }    return $sizes;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品123| 欧美精品视频www在线观看 | 亚洲欧美综合色| 天天色天天爱天天射综合| 国产精品一二三四五| 欧美日韩在线播放三区| 中文天堂在线一区| 美女视频黄 久久| 在线观看亚洲精品视频| 亚洲欧洲一区二区三区| 国内久久精品视频| 欧美一级日韩免费不卡| 午夜欧美一区二区三区在线播放| 丁香婷婷综合色啪| 久久综合久久鬼色| 久久国产精品72免费观看| 欧美三级欧美一级| 亚洲午夜精品网| 色婷婷av一区二区三区gif| 日本一区二区在线不卡| 国产东北露脸精品视频| 日韩欧美亚洲国产另类| 日韩成人av影视| 欧美图片一区二区三区| 一区二区三区四区乱视频| 播五月开心婷婷综合| 国产喂奶挤奶一区二区三区| 精品一区二区三区在线观看国产| 日韩欧美中文字幕一区| 欧美a级理论片| 欧美不卡一区二区三区| 久久不见久久见免费视频1| 欧美一区二区在线播放| 麻豆成人av在线| 精品国产一区二区三区久久影院 | 精品在线播放免费| 日韩一区二区免费视频| 喷白浆一区二区| 精品国精品自拍自在线| 国产乱一区二区| 国产精品欧美经典| 99免费精品在线| 一二三区精品视频| 欧美日本在线看| 久久se精品一区二区| 国产片一区二区三区| 99精品视频免费在线观看| 亚洲欧美国产高清| 欧美日韩久久一区| 九九在线精品视频| 国产精品久久久久婷婷二区次| 91一区二区三区在线观看| 香蕉加勒比综合久久| 欧美mv日韩mv亚洲| 成人激情动漫在线观看| 最好看的中文字幕久久| 91精品国产色综合久久ai换脸| 麻豆精品在线播放| 中文子幕无线码一区tr| 色视频一区二区| 精品一区二区三区免费毛片爱| 国产拍揄自揄精品视频麻豆| 91蜜桃在线观看| 日韩精品亚洲专区| 国产精品九色蝌蚪自拍| 91麻豆精品国产| 国产精华液一区二区三区| 亚洲在线观看免费| 欧美mv和日韩mv国产网站| 99久久久国产精品| 日韩中文欧美在线| 国产精品免费丝袜| 欧美二区三区的天堂| 国产成人日日夜夜| 丝袜亚洲另类欧美综合| 中文字幕第一区第二区| 欧美日韩亚洲国产综合| 国产a视频精品免费观看| 亚洲1区2区3区视频| 国产丝袜在线精品| 欧美一区二区成人| 色婷婷亚洲综合| 国产成a人亚洲| 日本视频免费一区| 亚洲综合一区二区三区| 欧美韩日一区二区三区| 欧美成人艳星乳罩| 欧美午夜视频网站| 91网上在线视频| 成人av在线影院| 国产一区不卡精品| 首页国产丝袜综合| 一区二区三区波多野结衣在线观看 | 精品福利一区二区三区免费视频| 欧美在线你懂的| caoporm超碰国产精品| 国产一区日韩二区欧美三区| 亚洲成人av电影| 夜夜亚洲天天久久| 中文字幕在线观看不卡| 久久夜色精品一区| 制服丝袜中文字幕一区| 欧美日韩一区成人| 91免费国产在线观看| caoporm超碰国产精品| 成人一级片在线观看| 国产高清精品久久久久| 国产一区二区调教| 国产在线麻豆精品观看| 韩国女主播一区二区三区| 极品尤物av久久免费看| 蜜桃精品在线观看| 久久99国产精品久久| 精品一区二区三区在线播放| 日韩中文字幕亚洲一区二区va在线| 亚洲成av人影院| 婷婷开心激情综合| 免费在线观看视频一区| 毛片av一区二区| 精品一区二区综合| 成人在线视频一区二区| 91小视频免费观看| 欧美性色黄大片| 91超碰这里只有精品国产| 这里是久久伊人| 欧美va亚洲va国产综合| 久久久久久影视| 18成人在线视频| 亚洲大片在线观看| 久久精品免费观看| 国产91精品一区二区| av不卡在线播放| 欧美在线一区二区| 制服.丝袜.亚洲.中文.综合| 日韩视频一区二区在线观看| 久久免费国产精品| 亚洲三级久久久| 亚洲超碰97人人做人人爱| 久久精品久久99精品久久| 国产乱子轮精品视频| 色屁屁一区二区| 欧美群妇大交群中文字幕| 久久综合资源网| 亚洲男帅同性gay1069| 日本免费在线视频不卡一不卡二| 国产一区二区三区精品视频| eeuss鲁一区二区三区| 8x福利精品第一导航| 欧美国产欧美综合| 亚洲国产美女搞黄色| 精品亚洲国内自在自线福利| 99re在线视频这里只有精品| 7777精品伊人久久久大香线蕉经典版下载 | 国产偷国产偷精品高清尤物| 一区二区三区美女视频| 美女脱光内衣内裤视频久久网站| 不卡的看片网站| 精品日韩在线一区| 亚洲日本va午夜在线影院| 免费高清在线一区| 色综合久久中文字幕| 久久综合五月天婷婷伊人| 亚洲成人av中文| 99国产一区二区三精品乱码| 日韩精品一区二区三区老鸭窝| 亚洲欧美日韩国产综合在线 | 日本强好片久久久久久aaa| av中文一区二区三区| 日韩欧美综合在线| 亚洲永久精品大片| 99精品视频在线播放观看| 久久久久久久久久美女| 欧美aaaaa成人免费观看视频| 99国产精品久久久久久久久久| 欧美精品一区二区不卡| 日韩不卡在线观看日韩不卡视频| av激情亚洲男人天堂| 久久久一区二区三区捆绑**| 亚洲国产一二三| 日本高清免费不卡视频| 国产精品久久网站| 精久久久久久久久久久| 在线成人av影院| 亚洲.国产.中文慕字在线| 91麻豆文化传媒在线观看| 国产精品网站在线| 国产乱人伦偷精品视频不卡| 欧美精品一区二区三区很污很色的| 天天做天天摸天天爽国产一区| 色哟哟欧美精品| 一区二区三区 在线观看视频| 99精品视频在线播放观看| 国产精品乱人伦| 风流少妇一区二区| 国产欧美一区视频| 国产成人av资源| 国产精品麻豆欧美日韩ww| 成人午夜激情视频| 中文字幕亚洲欧美在线不卡| 91视频你懂的|