| OLD | NEW |
| 1 #!/usr/bin/perl | 1 #!/usr/bin/perl |
| 2 | 2 |
| 3 # | 3 # |
| 4 # Given a memwatcher logfile, group memory allocations by callstack. | 4 # Given a memwatcher logfile, group memory allocations by callstack. |
| 5 # | 5 # |
| 6 # Usage: | 6 # Usage: |
| 7 # | 7 # |
| 8 # memprof.pl <logfile> | 8 # memprof.pl <logfile> |
| 9 # | 9 # |
| 10 # logfile -- The memwatcher.logXXXX file to summarize. | 10 # logfile -- The memwatcher.logXXXX file to summarize. |
| 11 # | 11 # |
| 12 # | 12 # |
| 13 # | 13 # |
| 14 # Sample output: | 14 # Sample output: |
| 15 # | 15 # |
| 16 # 54061617 100.00% AllocationStack::AllocationStack | 16 # 54,061,617 100.00% AllocationStack::AllocationStack |
| 17 # 41975368 77.64% malloc | 17 # 41,975,368 77.64% malloc |
| 18 # 11886592 21.99% VirtualAlloc | 18 # 11,886,592 21.99% VirtualAlloc |
| 19 # 7168000 13.26% v8::internal::OS::Allocate | 19 # 7,168,000 13.26% v8::internal::OS::Allocate |
| 20 # 7168000 13.26% v8::internal::MemoryAllocator::AllocateRawMemory | 20 # 7,168,000 13.26% v8::internal::MemoryAllocator::AllocateRawMemory |
| 21 # 5976184 11.05% WebCore::V8Bridge::evaluate | 21 # 5,976,184 11.05% WebCore::V8Bridge::evaluate |
| 22 # 5767168 10.67% v8::internal::MemoryAllocator::AllocatePages | 22 # 5,767,168 10.67% v8::internal::MemoryAllocator::AllocatePages |
| 23 # 5451776 10.08% WebCore::V8Proxy::initContextIfNeeded | 23 # 5,451,776 10.08% WebCore::V8Proxy::initContextIfNeeded |
| 24 # .... | 24 # .... |
| 25 # | 25 # |
| 26 # | 26 # |
| 27 # | 27 # |
| 28 # ******** | 28 # ******** |
| 29 # Note: The output is not currently sorted. To make it more legible, | 29 # Note: The output is currently sorted by decreasing size. |
| 30 # you will want to sort numerically by the first field: | |
| 31 # $ ./memprof.pl memwatcher.log3620.txt | sort -n -r | |
| 32 # ******** | 30 # ******** |
| 33 # | 31 # |
| 34 | 32 |
| 35 sub process_raw($$) { | 33 sub process_raw($$) { |
| 36 my $file = shift; | 34 my $file = shift; |
| 37 my $filter = shift; | 35 my $filter = shift; |
| 38 | 36 |
| 39 my %leaks = (); | 37 my %leaks = (); |
| 40 my %stackframes = (); | 38 my %stackframes = (); |
| 41 | 39 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 $leaks{$pig} += $bytes; | 81 $leaks{$pig} += $bytes; |
| 84 } | 82 } |
| 85 | 83 |
| 86 $stackframes{$pig}++; | 84 $stackframes{$pig}++; |
| 87 $blamed++; | 85 $blamed++; |
| 88 } | 86 } |
| 89 } | 87 } |
| 90 | 88 |
| 91 # now dump our hash table | 89 # now dump our hash table |
| 92 my $sum = 0; | 90 my $sum = 0; |
| 93 my @keys = keys(%leaks); | 91 my @keys = sort { $leaks{$b} <=> $leaks{$a} }keys %leaks; |
| 94 for ($i=0; $i<@keys; $i++) { | 92 for ($i=0; $i<@keys; $i++) { |
| 95 my $key = @keys[$i]; | 93 my $key = @keys[$i]; |
| 96 printf "%8d\t%3.2f%%\t%s\n", $leaks{$key}, (100* $leaks{$key} / $total_bytes
), $key; | 94 printf "%11s\t%3.2f%%\t%s\n", comma_print($leaks{$key}), (100* $leaks{$key}
/ $total_bytes), $key; |
| 97 $sum += $leaks{$key}; | 95 $sum += $leaks{$key}; |
| 98 } | 96 } |
| 99 print("TOTAL: $sum\n"); | 97 printf("TOTAL: %s\n", comma_print($sum)); |
| 100 } | 98 } |
| 101 | 99 |
| 100 # Insert commas into an integer after each three digits for printing. |
| 101 sub comma_print { |
| 102 my $num = "$_[0]"; |
| 103 $num =~ s/(\d{1,3}?)(?=(\d{3})+$)/$1,/g; |
| 104 return $num; |
| 105 } |
| 102 | 106 |
| 103 # ----- Main ------------------------------------------------ | 107 # ----- Main ------------------------------------------------ |
| 104 | 108 |
| 105 # Get the command line argument | 109 # Get the command line argument |
| 106 my $filename = shift; | 110 my $filename = shift; |
| 107 my $filter = shift; | 111 my $filter = shift; |
| 108 | 112 |
| 109 # Process the file. | 113 # Process the file. |
| 110 process_raw($filename, $filter); | 114 process_raw($filename, $filter); |
| OLD | NEW |