Commit 1d8583f5 authored by Magnus Svensson's avatar Magnus Svensson
Browse files

Bug#38817 please make mtr analyze crashes better

parent 189ac2c7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ nobase_test_DATA = lib/mtr_cases.pm \
	lib/My/SafeProcess.pm \
	lib/My/File/Path.pm \
	lib/My/SysInfo.pm \
	lib/My/CoreDump.pm \
	lib/My/SafeProcess/Base.pm \
	lib/My/SafeProcess/safe_process.pl

+79 −0
Original line number Diff line number Diff line
# -*- cperl -*-
# Copyright (C) 2004-2006 MySQL AB
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

package My::CoreDump;

use strict;
use Carp;
use My::Platform;

use File::Temp qw/ tempfile tempdir /;

sub _gdb {
  my ($core_name)= @_;

  return unless -f $core_name;

  my $dir = tempdir( CLEANUP => 1 );
  my ($tmp, $tmp_name) = tempfile( DIR => $dir );

  print $tmp
    "thread apply all bt\n",
    "quit\n";

  # Find out name of binary that generated core
  my $list= `gdb -c $core_name -x $tmp_name -q 2>&1`
    or return;

  my $binary;
  foreach my $line (split('\n', $list))
  {
    $binary= $1
      if ($line =~ /Core was generated by `(\S+)/);
  }

  return unless $binary;

  print "Generated by '$binary'\n";

  my $list= `gdb $binary -c $core_name -x $tmp_name -q 2>&1`
    or return;

  print $list, "\n";

  return 1;
}


sub show {
  my ($class, $core_name)= @_;

  my @debuggers =
    (
     \&_gdb,
     # TODO...
   );

  foreach my $debugger (@debuggers){
    if ($debugger->($core_name)){
      return;
    }
  }
  return;
}


1;
+8 −6
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ use My::ConfigFactory;
use My::Options;
use My::Find;
use My::SysInfo;
use My::CoreDump;
use mtr_cases;
use mtr_report;
use mtr_match;
@@ -446,14 +447,15 @@ sub run_test_server ($$$) {
			 my $core_name= basename($core_file);

			 if ($core_name =~ "core*"){
			   if ($num_saved_cores >= $opt_max_save_core) {
			     mtr_report(" - deleting '$core_name'",
				      "($num_saved_cores/$opt_max_save_core)");
			     unlink("$core_file");
			   }
			   else {
			   mtr_report(" - found '$core_name'",
				      "($num_saved_cores/$opt_max_save_core)");

			   My::CoreDump->show($core_file);

			   if ($num_saved_cores >= $opt_max_save_core) {
			     mtr_report(" - deleting it, already saved",
					"$opt_max_save_core");
			     unlink("$core_file");
			   }
			   ++$num_saved_cores;
			 }