diff --git a/mysql-test/Makefile.am b/mysql-test/Makefile.am index 83b688ff600..0f9a9d2c1ab 100644 --- a/mysql-test/Makefile.am +++ b/mysql-test/Makefile.am @@ -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 diff --git a/mysql-test/lib/My/CoreDump.pm b/mysql-test/lib/My/CoreDump.pm new file mode 100644 index 00000000000..5f7427768c2 --- /dev/null +++ b/mysql-test/lib/My/CoreDump.pm @@ -0,0 +1,79 @@ +# -*- 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; diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index fa795ba9989..5b91517117a 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -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,15 +447,16 @@ sub run_test_server ($$$) { my $core_name= basename($core_file); if ($core_name =~ "core*"){ + 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 '$core_name'", - "($num_saved_cores/$opt_max_save_core)"); + mtr_report(" - deleting it, already saved", + "$opt_max_save_core"); unlink("$core_file"); } - else { - mtr_report(" - found '$core_name'", - "($num_saved_cores/$opt_max_save_core)"); - } ++$num_saved_cores; } }