--- deliantra/server/lib/cf.pm 2007/04/27 20:09:48 1.261 +++ deliantra/server/lib/cf.pm 2007/04/28 05:55:55 1.262 @@ -2437,9 +2437,10 @@ return wantarray ? @$res : $res->[-1]; } else { + reset_signals; local $SIG{__WARN__}; + local $SIG{__DIE__}; eval { - local $SIG{__DIE__}; close $fh1; my @res = eval { $cb->(@args) }; @@ -2925,32 +2926,42 @@ ); } +my $_log_backtrace; + sub _log_backtrace { my ($msg, @addr) = @_; - async { - my @bt = fork_call { - @addr = map { sprintf "%x", $_ } @addr; - my $self = (-f "/proc/$$/exe") ? "/proc/$$/exe" : $^X; - open my $fh, "exec addr2line -C -f -i -e \Q$self\E @addr 2>&1 |" - or die "addr2line: $!"; - - my @funcs; - my @res = <$fh>; - chomp for @res; - while (@res) { - my ($func, $line) = splice @res, 0, 2, (); - push @funcs, "[$func] $line"; - } + $msg =~ s/\n//; - @funcs - }; + # limit the # of concurrent backtraces + if ($_log_backtrace < 2) { + ++$_log_backtrace; + async { + my @bt = fork_call { + @addr = map { sprintf "%x", $_ } @addr; + my $self = (-f "/proc/$$/exe") ? "/proc/$$/exe" : $^X; + open my $fh, "exec addr2line -C -f -i -e \Q$self\E @addr 2>&1 |" + or die "addr2line: $!"; + + my @funcs; + my @res = <$fh>; + chomp for @res; + while (@res) { + my ($func, $line) = splice @res, 0, 2, (); + push @funcs, "[$func] $line"; + } - $msg =~ s/\n//; + @funcs + }; + LOG llevInfo, "[ABT] $msg\n"; + LOG llevInfo, "[ABT] $_\n" for @bt; + --$_log_backtrace; + }; + } else { LOG llevInfo, "[ABT] $msg\n"; - LOG llevInfo, "[ABT] $_\n" for @bt; - }; + LOG llevInfo, "[ABT] [suppressed]\n"; + } } # load additional modules