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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? exmap.pl

?? 內存管理工具Exmap。該工具比 ps 或 top 更精確
?? PL
?? 第 1 頁 / 共 2 頁
字號:
#!/usr/bin/perl -w## (c) John Berthels 2005 <jjberthels@gmail.com>. See COPYING for license.#use strict;use Exmap;use Gtk2;use Gtk2::SimpleList;use Glib; # For KeyFile# There must be a better way to arrange windows?use constant WIDTH => 800;use constant HEIGHT => 600;my $CFG;main(@ARGV);exit 0;=head1 NAMEexmap.pl - a perl/GTK GUI to the Exmap memory analysis functionality=cutsub main{    my $doquit = shift;    $CFG = Config->new;    $CFG->load; # It's OK if this fails - cfg file might not exist.        my $exmap = Exmap->new;    die("Can't initialise exmap data") unless $exmap;    my $progress = Progress->new;    $exmap->load($progress)	or die("Can't load exmap process information");    print "Calculating...\n";    Gtk2->init;    my $mw = Gtk2::Window->new("toplevel");    # Why is this necessary?    $mw->set_default_size(WIDTH, HEIGHT);    $mw->signal_connect(destroy => sub { Gtk2->main_quit; });    my $tabwin = Gtk2::Notebook->new;    my $symlist = ElfSymbolList->new;    my @tabs;    my $proctab = ProcTab->new($exmap, $symlist);    $tabwin->append_page($proctab->window, "Processes");    push @tabs, $proctab;    my $filetab = FileTab->new($exmap, $symlist);    push @tabs, $filetab;    $tabwin->append_page($filetab->window, "Files");    $tabwin->signal_connect(switch_page => sub {				my $nb = shift;				my $page = shift;				my $pagenum = shift;				# Gotta love closures				my $tab = $tabs[$pagenum];				$tab->show_tab;				});    my $bottombar = make_bottombar($exmap);    my $hpane = Gtk2::HPaned->new;    $hpane->pack1($tabwin, 1, 1);    $hpane->pack2($symlist->window, 1, 1);    my $vbox = Gtk2::VBox->new;    $vbox->add($hpane);    $vbox->pack_end($bottombar, 0, 0, 0);    $mw->add($vbox);    $mw->show_all;	    print "Running\n";    Gtk2->main unless $doquit;    $CFG->check_save;}sub make_bottombar{    my $exmap = shift;    my $bottombar = Gtk2::HBox->new;    my @procs = $exmap->procs;    my $totals = Exmap::Sizes->new;    $totals->scale_mbytes;    foreach my $proc (@procs) {	my $sizes = $proc->sizes;	$totals->add($sizes);    }    my $text = sprintf ("Number of Procs: %d Number of Files: %d\n",			scalar @procs,			scalar($exmap->files));    $text .= join( "|", map {	$totals->key_name($_) . " " . $totals->sval($_);    } $totals->keys);    $bottombar->pack_start(Gtk2::Label->new($text), 0, 0, 0);    my $quit_button = Gtk2::Button->new("Quit");    $quit_button->signal_connect(clicked => sub { Gtk2::main_quit; });    $bottombar->pack_end($quit_button, 0, 0, 0);    return $bottombar;}# ------------------------------------------------------------=head2 ProgressProgress indicator. Currently writes to stdout.=cutpackage Progress;use base qw/Exmap::Progress/;sub number_of_ticks{    my $s = shift;    $s->{_total_ticks} = shift;    $s->{_this_tick} = 0;    print "Number of procs: $s->{_total_ticks}\n";    return 1;}sub tick{    my $s = shift;    my $text = shift;    my $digits = length $s->{_total_ticks};    my $tick = sprintf("%0${digits}d", ++$s->{_this_tick});    print "$tick/$s->{_total_ticks}: Loaded: $text\n";    return 1;}sub finished{    my $s = shift;    print "Finished loading\n";    return 1;}# ------------------------------------------------------------=head2 ViewAbstract base class for all View elements. These are thin perl objectwrappers around Gtk Widgets, accessed via the C<window> method.The view has these virtual methods:=over=item _init_windowsThis method should set up the gtk widgets, and set C<window> to thetop-level widget.=item set_dataThis is passed object-specific data, which is intended to be of usewhen updating the view. Expensive calculation is to be avoided.=item update_viewThis is called to paint the widgets. It is generally calledimmediately after set_data, but may be delayed if a widget isn't inview.=backAny args passed to ->new get passed to C<set_data>.=cutpackage View;sub new{    my $c = shift;    $c = ref $c if ref $c;    my $s = {};    bless $s, $c;    $s->_init_windows;    $s->set_data(@_);    return $s;}sub window{    my $s = shift;    my $win = shift;    if ($win) {	$s->{_window} = $win;    }    return $s->{_window};}sub _init_windows { die "_init_windows called in abstract base class"; }sub update_view { die "_init_windows called in abstract base class"; }sub set_data { die "set_data called in abstract base class"; }# ------------------------------------------------------------=head2 ListViewAbstract base class for all View elements consisting of a list ofitems which have 'sizes'. Each row may start with zero or more 'firstcolumns' and is then followed by the 'sizes' for that row.An update_view method is provided to display these, and provides thefunctionality of selecting which size columns to display for a givenview, depending on the configuration.The derived class lists its 'first columns' (by overriding theC<_first_columns> method).The initial list view sort column is set to the first size column.It tweaks the underlying list model (ensures all columns sortable,resizeable) and adds dynamic horizontal and vertical scrollbars.If a derived class overrides C<_frame_name> with a method whichreturns a string, the list object will be wrapped in a frame with thatlabel.The top level widget is the scrolledlist, the underlyingGtk::SimpleList is accessible via the C<list_window> method.Derived classes must implement a C<set_data> method. This should not bean expensive call - calculation should be deferred to the update_viewstage.After C<set_data> has been called either _rows must be set to a list of Rowobjects. These will be called from C<update_view> in order to providethe row first_cols and sizes, allowing the size calculations to bedeferred until that time.=cutpackage ListView;use base qw/View/;sub _init_windows{    my $s = shift;    my @cols = $s->_first_columns;    my $start_sort_col = (scalar @cols) / 2;    my $sizes = Exmap::Sizes->new;    $sizes->scale_kbytes;    push @cols,	map { $sizes->key_name($_) => 'text' } $CFG->cols_for_listview($s);	    my $listwin = Gtk2::SimpleList->new(@cols);    $s->list_window($listwin);    $s->_make_all_sortable;    my $model = $s->list_window->get_model;    $model->set_sort_column_id($start_sort_col, 'descending');    $s->_make_all_resizable;    $s->_set_all_col_sortfunc;    my $scr_list = Gtk2::ScrolledWindow->new;    $scr_list->set_policy('automatic', 'automatic');    $scr_list->add($listwin);    $s->window($scr_list);    my $frame_text = $s->_frame_name;    if ($frame_text) {	my $frame = Gtk2::Frame->new($frame_text);	$frame->add($s->window);	$s->window($frame);    }    return 1;}sub _frame_name{    return undef;}sub _first_columns { die "_first_columns called in listview" };sub list_window{    my $s = shift;    my $win = shift;    if ($win) {	$s->{_list_window} = $win;    }    return $s->{_list_window};}sub _make_all_sortable{    my $s = shift;    return $s->_foreach_column( sub {        my $s = shift;	my $colid = shift;	my $col = shift;	$s->list_window->get_column($colid)->set_sort_column_id($colid);    });}sub _make_all_resizable{    my $s = shift;    return $s->_foreach_column( sub {        my $s = shift;	my $colid = shift;	my $col = shift;	$s->list_window->get_column($colid)->set_resizable(1);    });}sub _set_all_col_sortfunc{    my $s = shift;    # Do a numeric sort on all numeric strings, and string sort on others    my $sort_func = sub {	my $model = shift;       my $a = shift;       my $b = shift;       my $colid = shift;       $a = lc $model->get_value($a, $colid);       $b = lc $model->get_value($b, $colid);              return 0 if (!defined $a) && (!defined $b);       return +1 if not defined $a;       return -1 if not defined $b;              # Allow various numeric seperators, to be more locale friendly       my $number_re = qr/^[\s\d\.,_]+$/;       if ($a =~ $number_re && $b =~ $number_re) {           $a <=> $b;       }       else {           $a cmp $b;       }   };        return $s->_foreach_column( sub {				    my $s = shift;	my $colid = shift;	my $col = shift;	$s->list_window->get_model->set_sort_func($colid, $sort_func, $colid);    });}sub _foreach_column{    my $s = shift;    my $subref = shift;        my $win = $s->list_window;    my @cols = $win->get_columns;    my $colid = 0;    foreach my $col (@cols) {	$subref->($s, $colid, $col);	++$colid;    }    return;}sub update_view{    my $s = shift;    my $lw = $s->list_window;    # Do nothing unless we have an update    return 1 unless $s->{_rows};    # Assign data to the Gtk widget in one go, rather than push each    # row into the tied array.    my @rows;    my @cols = $CFG->cols_for_listview($s);    foreach my $row (@{$s->{_rows}}) {	my @row = $row->first_cols;	my $sizes = $row->sizes;	if ($sizes) {	    $sizes->scale_kbytes;	    push @row, $sizes->multi_svals(@cols);	}	push @rows, [@row];    }    # Calling this appears to call Gtk2::ListStore::set, which has    # performance problems.    #    @{$lw->{data}} = @rows;    @{$lw->{data}} = ();    my $model = $lw->get_model;    my $insert_at = 1 + scalar @rows;    foreach my $row (@rows) {	my $colnum = 0;	my @values = map { ($colnum++, $_) } @$row;	$model->insert_with_values($insert_at, @values);    }    # Flag that we have consumed these rows    $s->{_rows} = undef;    return 1;}# ------------------------------------------------------------=head2 RowThis is a single listview Row. It can seperately return the initialcolumns and sizes, to avoid the expense of calculating the sizes.=cutpackage Row;sub new{    my $c = shift;    $c = ref $c if ref $c;    my $s = {};    $s->{_first_cols} = shift;    $s->{_size_closure} = shift;    bless $s, $c;    return $s;}sub first_cols { return @{$_[0]->{_first_cols}}; }# Invoke the closure to find the sizessub sizes{    my $s = shift;    my $closure = $s->{_size_closure};    return $closure ? $closure->() : undef;}# ------------------------------------------------------------=head2 ProcListThis is a ListView showing a list of processes.=cutpackage ProcList;use base qw/ListView/;sub _first_columns{    return (PID => 'int',	    Cmdline => 'text');}sub set_data{    my $s = shift;    my @rows = map {	my $proc = $_;	Row->new( [ $proc->pid,		    $proc->cmdline ],		  sub { return $proc->sizes; } );    } @_;    $s->{_rows} = \@rows;    return 1;}# ------------------------------------------------------------=head2 FileListThis is a ListView showing a list of files.=cutpackage FileList;use base qw/ListView/;sub _first_columns{    return ('File Name' => 'text',	    'Num Procs' => 'int');}sub set_data{    my $s = shift;    my @rows = map {	my $file = $_;	Row->new( [ $file->name,		    scalar($file->procs)],		  sub { return $file->sizes; } );    } @_;    $s->{_rows} = \@rows;    return 1;}# ------------------------------------------------------------=head2 FilesPerProcListThis is a ListView showing a list of files within a given process.=cutpackage FilesPerProcList;use base qw/ListView/;sub _frame_name{    return "Files mapped by process";}sub _first_columns{    return ('File Name' => 'text');}sub set_data{    my $s = shift;    my $proc = shift;    $s->{_rows} = [];    if ($proc) {	my @rows = map {	    my $file = $_;	    Row->new([$file->name],		     sub { $proc->sizes($file) });	} $proc->files;	$s->{_rows} = [@rows];    }    else {	$s->{_rows} = [Row->new( ["No process selected"] )];

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲视频在线观看一区| 亚洲一区二区视频在线| 亚洲欧美综合另类在线卡通| 亚洲国产精品天堂| 粉嫩高潮美女一区二区三区 | 国产福利一区二区| 欧美日韩一区在线观看| 国产欧美一区二区精品性色超碰| 亚洲综合成人在线| 成人av午夜影院| 久久综合九色综合欧美就去吻| 国产精品成人在线观看| 国产在线视视频有精品| 精品视频一区二区三区免费| 亚洲人成精品久久久久| 国产激情视频一区二区三区欧美 | 一道本成人在线| 国产日韩欧美精品一区| 日本不卡视频在线| 在线不卡免费av| 一区二区在线观看免费| 91在线精品秘密一区二区| 国产视频一区在线播放| 黄色日韩网站视频| 久久免费看少妇高潮| 激情综合网最新| 日韩精品一区二区三区swag| 丝袜美腿一区二区三区| 欧美区视频在线观看| 一区二区三区在线视频播放| 色综合亚洲欧洲| 亚洲激情第一区| 欧洲精品中文字幕| 亚洲黄色免费电影| 在线视频一区二区三区| 一区二区三区影院| 色狠狠桃花综合| 一区二区不卡在线视频 午夜欧美不卡在| 成人黄色电影在线| 亚洲色图欧美在线| 欧美伊人久久大香线蕉综合69| 亚洲精品成人a在线观看| 91高清视频在线| 亚洲第一av色| 3d动漫精品啪啪| 激情图片小说一区| 国产拍欧美日韩视频二区| 成人黄色网址在线观看| 亚洲乱码一区二区三区在线观看| 色综合久久88色综合天天免费| 亚洲精品乱码久久久久久久久| 欧美专区在线观看一区| 日本强好片久久久久久aaa| 日韩你懂的在线观看| 国产成人h网站| 亚洲综合图片区| 91精品国产一区二区三区蜜臀 | 久久亚洲精精品中文字幕早川悠里| 国产在线国偷精品免费看| 国产精品国产三级国产a| 色视频一区二区| 久久国产精品99久久久久久老狼 | 精品国产一区二区三区av性色| 激情综合亚洲精品| 国产欧美精品一区二区三区四区| 99久久精品国产毛片| 亚洲成人激情社区| 国产人妖乱国产精品人妖| 99国产精品久久久久久久久久久| 亚洲国产成人av好男人在线观看| 日韩免费观看高清完整版在线观看| 国产精品乡下勾搭老头1| 一区二区三区欧美日韩| 精品国产伦一区二区三区观看体验| 国产成人日日夜夜| 日韩精品国产精品| 国产精品毛片久久久久久| 欧美日韩第一区日日骚| 成人精品免费网站| 日韩成人av影视| 成人欧美一区二区三区黑人麻豆| 欧美疯狂做受xxxx富婆| gogo大胆日本视频一区| 毛片av中文字幕一区二区| 国产精品成人免费| 337p粉嫩大胆噜噜噜噜噜91av| 99久久精品国产精品久久| 蜜臀精品久久久久久蜜臀| 夜夜嗨av一区二区三区| 国产日韩综合av| 3atv一区二区三区| 91福利国产精品| 成+人+亚洲+综合天堂| 久久综合综合久久综合| 亚洲不卡一区二区三区| 中文字幕一区二区日韩精品绯色| 精品日产卡一卡二卡麻豆| 欧美性感一类影片在线播放| 北条麻妃一区二区三区| 国产在线精品一区二区夜色 | 亚洲一区av在线| 综合久久综合久久| 久久久久99精品一区| 制服丝袜亚洲精品中文字幕| 色综合天天综合在线视频| 99视频精品在线| 丁香婷婷综合五月| 国产麻豆9l精品三级站| 激情五月播播久久久精品| 麻豆成人在线观看| 美女视频黄 久久| 奇米精品一区二区三区四区| 亚洲第一福利一区| 国产综合一区二区| 蜜桃一区二区三区在线| 首页国产欧美日韩丝袜| 三级久久三级久久久| 五月开心婷婷久久| 午夜精品久久久| 日韩在线播放一区二区| 日韩 欧美一区二区三区| 日韩av一级片| 精品一区二区在线观看| 韩国欧美一区二区| 国产成人自拍高清视频在线免费播放| 国产精品一区免费在线观看| 国产精品自拍毛片| 成人一区在线看| 91在线小视频| 欧美午夜一区二区三区免费大片| 色猫猫国产区一区二在线视频| 在线视频观看一区| 欧美一级日韩免费不卡| 久久综合五月天婷婷伊人| 国产午夜精品久久久久久久| 国产精品激情偷乱一区二区∴| 亚洲男人的天堂在线aⅴ视频| 一区二区三区小说| 老司机午夜精品| 成人午夜私人影院| 在线精品国精品国产尤物884a| 欧美酷刑日本凌虐凌虐| 欧美不卡一区二区三区| 国产精品水嫩水嫩| 亚洲国产一区二区三区青草影视| 日韩电影一区二区三区四区| 国产又黄又大久久| 91丝袜呻吟高潮美腿白嫩在线观看| 色婷婷av一区二区三区之一色屋| 91精品国产欧美一区二区成人| 久久久久99精品一区| 亚洲综合区在线| 激情小说亚洲一区| 91老师片黄在线观看| 日韩区在线观看| 亚洲欧洲日韩在线| 蜜臀va亚洲va欧美va天堂 | 亚洲一区二区三区在线看| 麻豆视频一区二区| 99久久精品国产一区二区三区 | 成人a级免费电影| 欧美伦理视频网站| 欧美激情一区二区三区全黄| 日韩精品久久久久久| 91亚洲男人天堂| 精品粉嫩超白一线天av| 亚洲天堂福利av| 国产美女一区二区| 欧美精品一级二级三级| 国产精品二区一区二区aⅴ污介绍| 天堂成人免费av电影一区| www.日韩大片| 久久色在线视频| 偷拍日韩校园综合在线| 一本色道久久加勒比精品 | 成人中文字幕电影| 日韩精品一区二区三区在线播放 | www.视频一区| 国产亚洲精品7777| 日本亚洲视频在线| 欧美三区在线观看| 国产精品护士白丝一区av| 国产成人精品影院| 欧美一区二区网站| 亚洲欧美日韩在线播放| 5566中文字幕一区二区电影| 国产精品看片你懂得| 国产乱码字幕精品高清av| 日韩一区二区精品葵司在线 | 精品视频在线免费观看| 自拍av一区二区三区| 成人av在线电影| 亚洲国产成人午夜在线一区| 免费成人你懂的| 日韩精品一区二区三区老鸭窝 | 日韩精品一区在线| 日本不卡一二三| 欧美电视剧免费观看| 麻豆91在线播放| 51精品国自产在线|