blob: 19badbca6cb9a0422cb7862e438e3e12805368ea (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#!/usr/bin/perl -w
#
# stackcolllapse-java-exceptions.pl collapse java exceptions (found in logs) into single lines.
#
# Parses Java error stacks found in a log file and outputs them as
# single lines, with methods separated by semicolons, and then a space and an
# occurrence count. Inspired by stackcollapse-jstack.pl except that it does
# not act as a performance profiler.
#
# It can be useful if a Java process dumps a lot of different stacks in its logs
# and you want to quickly identify the biggest culprits.
#
# USAGE: ./stackcollapse-java-exceptions.pl infile > outfile
#
# Copyright 2018 Paul de Verdiere. All rights reserved.
use strict;
use Getopt::Long;
# tunables
my $shorten_pkgs = 0; # shorten package names
my $no_pkgs = 0; # really shorten package names!!
my $help = 0;
sub usage {
die <<USAGE_END;
USAGE: $0 [options] infile > outfile\n
--shorten-pkgs : shorten package names
--no-pkgs : suppress package names (makes SVG much more readable)
USAGE_END
}
GetOptions(
'shorten-pkgs!' => \$shorten_pkgs,
'no-pkgs!' => \$no_pkgs,
'help' => \$help,
) or usage();
$help && usage();
my %collapsed;
sub remember_stack {
my ($stack, $count) = @_;
$collapsed{$stack} += $count;
}
my @stack;
foreach (<>) {
chomp;
if (/^\s*at ([^\(]*)/) {
my $func = $1;
if ($shorten_pkgs || $no_pkgs) {
my ($pkgs, $clsFunc) = ( $func =~ m/(.*\.)([^.]+\.[^.]+)$/ );
$pkgs =~ s/(\w)\w*/$1/g;
$func = $no_pkgs ? $clsFunc: $pkgs . $clsFunc;
}
unshift @stack, $func;
} elsif (@stack ) {
next if m/.*waiting on .*/;
remember_stack(join(";", @stack), 1) if @stack;
undef @stack;
}
}
remember_stack(join(";", @stack), 1) if @stack;
foreach my $k (sort { $a cmp $b } keys %collapsed) {
print "$k $collapsed{$k}\n";
}
|