⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dmalloc_summarize.pl

📁 减少内存碎片的malloc分配函数
💻 PL
字号:
#!/usr/bin/perl5 -w## dmalloc_summarize -- summarizes dmalloc log files## Copyright 1997 by USC/ISI All rights reserved.#                                                                # Redistribution and use in source and binary forms are permitted# provided that the above copyright notice and this paragraph are# duplicated in all such forms and that any documentation, advertising# materials, and other materials related to such distribution and use# acknowledge that the software was developed by the University of# Southern California, Information Sciences Institute.  The name of# the University may not be used to endorse or promote products# derived from this software without specific prior written# permission.# # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.## $Id: dmalloc_summarize.pl,v 1.1 1997/07/07 08:13:52 gray Exp $# sub usage {    print STDERR <<END;usage: $0 [executable] < logfilePost-process a dmalloc logfile (read from standard input).If an EXECUTABLE is specified, unknown symbols will be translatedaccording to that executable.END    exit 1;}require 5.000;use strict;# needed for gdb communicationsuse IPC::Open2;# process argsuse Getopt::Long;&usage if ($#ARGV >= 1 && $ARGV[0] eq '-?');my($exe) = undef;if ($#ARGV >= 0) {    $exe = $ARGV[0];};# initialize countersmy($totcount, $totgross) = (0, 0);######################################################################## Store key into the hash or increment existing value#sub safe_inc {  my($hashref, $key, $inc) = @_;  if (defined($hashref->{$key})) {    $hashref->{$key} += $inc;  } else {    $hashref->{$key} = $inc;  };}######################################################################my($gdb_pid);## Start a gdb pipe to resolve unknown return addresses.#sub start_gdb {  $SIG{'PIPE'} = sub { mydie("ERROR: premature end-of-data.\n"); };  $gdb_pid = open2('GDB_RDR', 'GDB_WTR', 'gdb', '-nx', '-q', $exe) ||    die "$0: cannot run gdb on $exe\n";  # tidy things up  # prompt becomes a magic number to look for  print GDB_WTR "set prompt (gdb)\\n\n";  print GDB_WTR "set print asm-demangle on\n";  print GDB_WTR "set height 0\n";}## Huh?#sub never_called {    <GDB_RDR>; <GDB_WTR>;   # hack for warnings}## Lookup an unknown ra-address with gdb#sub interpret_name {  my($name) = @_;  return $name if ($name !~ /^ra/);  return $name if (!defined($exe));    start_gdb() if (!defined($gdb_pid));    ($a) = ($name =~ /ra=([0-9a-fA-FxX]+)/);  return $name if (!defined($a));    print GDB_WTR "info line *($a)\n";    my($something) = undef;  my($file_line, $function);  while (<GDB_RDR>) {    if (/^\(gdb\)$/) {      last if ($something);      next;   # skip prompts    };    $something = 1;    if (/^Line (\d+) of "([^\"]+)"/) {      $file_line = "$2:$1";    };    if (/\<(.*)\+\d+\>/) {      $function = $1;    };  };  my($n) = "";  $n .= "$function " if (defined($function));  $n .= "[$file_line] " if (defined($file_line));  $n = $name if ($n eq '');  return $n;}######################################################################my(%allocers) = ();# read the datasub read_data {  while (<STDIN>) {    next if (! /\d:\s+not freed:\s+'([^\']+)'\s+\((\d+)\s+bytes\)\s+from\s+'([^\']*)'$/);    my($pointer, $size, $allocer) = ($1, $2, $3);        if (! defined($allocers{$allocer})) {      $allocers{$allocer} = {};      $allocers{$allocer}->{'sizes'} = {};    };    safe_inc($allocers{$allocer}, 'nsizes', 1)      if (! defined($allocers{$allocer}->{'sizes'}{$size}));    safe_inc($allocers{$allocer}->{'sizes'}, $size, 1);    safe_inc($allocers{$allocer}, 'subcount', 1);    safe_inc($allocers{$allocer}, 'subgross', $size);    $totcount++;    $totgross += $size;  }}## Print the report line#sub form {  printf "%10s %10s %10s %s\n", @_[1,2,3,0];}sub by_size {  return $allocers{$b}->{'subgross'} <=> $allocers{$a}->{'subgross'};}## Dump out the report#sub print_report {  form ('function', 'size', 'count', 'gross');  form ('total', '', $totcount, $totgross);  my($allocer, $size);    foreach $allocer (sort by_size keys %allocers) {    my($head) = interpret_name($allocer);    my($sizes);    if ($allocers{$allocer}->{'nsizes'} > 1) {      my($subcount, $subgross) = ($allocers{$allocer}->{'subcount'},				  $allocers{$allocer}->{'subgross'});      form($head, 'subtotal', $subcount, $subgross);      $head = "\"";    };    foreach $size (sort {$a<=>$b} keys %{$allocers{$allocer}->{'sizes'}}) {      my($count) = $allocers{$allocer}->{'sizes'}{$size};      my($gross) = $count * $size;      form ($head, $size, $count, $gross);      $head = "\"";    };  };}read_data;print_report;exit 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -