App-Devel-MAT-Explorer-GTK
view release on metacpan or search on metacpan
bin/pmat-explore-gtk view on Meta::CPAN
if( my $sv = eval { $pmat->find_symbol( $symb ) } ) {
history_nav( $sv );
}
else {
chomp( my $e = $@ );
progress( "Cannot navigate by symbol: $e" );
}
});
my $rootmenu = add_submenu( $menu, "Roots" );
my $toolmenu;
foreach my $tool ( sort Devel::MAT->available_tools ) {
my $tool_class = "Devel::MAT::Tool::$tool";
next unless $tool_class->can( "FOR_UI" ) and $tool_class->FOR_UI;
$toolmenu ||= add_submenu( $menu, "Tools" );
add_menuitem( $toolmenu, $tool, sub {
my ( $mi ) = @_;
$mi->set_sensitive( FALSE );
my $tool = $pmat->load_tool( $tool, progress => \&progress );
$tool->init_ui( "Devel::MAT::UI" );
progress();
});
}
$winbox->add( my $vpane = Gtk2::VPaned->new );
$vpane->pack1( my $hpane = Gtk2::HPaned->new, TRUE, TRUE );
my $statusbar = Gtk2::Statusbar->new;
$winbox->pack_end( $statusbar, FALSE, TRUE, 0 );
$statusbar->pack_start( framed( my $perlver_label = Gtk2::Label->new( "" ) ), FALSE, FALSE, 0 );
$statusbar->pack_start( framed( my $svcount_label = Gtk2::Label->new( "" ) ), FALSE, FALSE, 0 );
$statusbar->pack_start( framed( my $bytetotal_label = Gtk2::Label->new( "" ) ), FALSE, FALSE, 0 );
$win->show_all;
{
my $id = $statusbar->get_context_id( "progress" );
sub progress
{
$statusbar->pop( $id );
$statusbar->push( $id, "Progress: $_[0]" ) if defined $_[0];
Gtk2->main_iteration_do( FALSE ) while Gtk2->events_pending;
}
}
my $filename = $ARGV[0] or die "Need dumpfile\n";
$win->set_title( "$filename - pmat-explore-gtk" );
$pmat = Devel::MAT->load( $filename, progress => \&progress );
$df = $pmat->dumpfile;
$perlver_label->set_text( join " ", "Perl",
$df->perlversion,
( $df->ithreads ? "thread" : () ),
( $df->ptr_len * 8 ) . "bit",
);
$svcount_label->set_text( scalar($df->heap) . " SVs" );
# We're going to be using Inrefs
$pmat->load_tool( "Inrefs", progress => \&progress );
foreach ( pairs $df->roots ) {
my ( $desc, $sv ) = @$_;
add_menuitem( $rootmenu, $desc, sub { history_nav( $sv ) } ) if $sv;
}
my $svlist_model = Gtk2::ListStore->new(
"Glib::String",
( $df->ptr_len > 4 ? "Glib::Long" : "Glib::Int" ),
"Glib::String",
"Glib::Int",
"Glib::String",
"Glib::Int",
"Glib::Int",
);
# UI column constants
sub Devel::MAT::UI::COLUMN_TYPE () { 0 }
sub Devel::MAT::UI::COLUMN_ADDR () { 1 }
sub Devel::MAT::UI::COLUMN_DESC () { 2 }
sub Devel::MAT::UI::COLUMN_SIZE () { 3 }
sub Devel::MAT::UI::COLUMN_BLESSED() { 4 }
sub Devel::MAT::UI::COLUMN_OUTREFS() { 5 }
sub Devel::MAT::UI::COLUMN_INREFS () { 6 }
my $svlist_view = Gtk2::TreeView->new;
$svlist_view->set_model( $svlist_model );
sub add_svlist_column
{
my %args = @_;
my $column = Gtk2::TreeViewColumn->new_with_attributes(
$args{title}, Gtk2::CellRendererText->new, text => $args{idx},
);
$column->set_sort_column_id( $args{idx} );
$svlist_view->append_column( $column );
}
# First two columns are special
$svlist_view->insert_column_with_data_func( -1, " ",
Gtk2::CellRendererPixbuf->new, sub {
my ( $column, $renderer, $model, $iter ) = @_;
my $type = $model->get( $iter, Devel::MAT::UI->COLUMN_TYPE );
my $icon = get_icon( "type-$type" );
$renderer->set( pixbuf => $icon ) if $icon;
}, undef
);
$svlist_view->insert_column_with_data_func( -1, "Address",
Gtk2::CellRendererText->new, sub {
my ( $column, $renderer, $model, $iter ) = @_;
my $addr = $model->get( $iter, Devel::MAT::UI->COLUMN_ADDR );
( run in 2.321 seconds using v1.01-cache-2.11-cpan-c966e8aa7e8 )