[PATCH 2/2] Include count of unexpected core files in gdb.sum summary

Andrew Burgess aburgess@redhat.com
Fri Jun 24 10:07:46 GMT 2022


Pedro Alves <pedro@palves.net> writes:

> On 2022-06-23 19:30, Pedro Alves wrote:
>
>> +# Add our line to the summary line.
>> +sed "/=== gdb Summary ===/{
>> +n
>> +a\
>> +# of unexpected core files	$cores
>> +}" -i gdb.sum
>
> I knew this -i wasn't portable as is, but then forgot to fix it before posting.  I now tried
> the script on a FreeBSD machine on the gcc compile farm, and tweaked this so it works with BSD
> seds too.  That sed invocation now looks like:
>
>  # Add our line to the summary line.
>  sed -i'' -e "/=== gdb Summary ===/{
>  n
>  a\\
>  # of unexpected core files     $cores
>  }" gdb.sum
>
> If -i doesn't work elsewhere, we can just do:
>
>  sed .... < gdb.sum > gdb.sum.tmp
>  mv gdb.sum.tmp gdb.sum
>
> Here's the updated patch.
>
> From 48d48ca9ddeaee581b229a13ba40b3dd5534568e Mon Sep 17 00:00:00 2001
> From: Pedro Alves <pedro@palves.net>
> Date: Wed, 22 Jun 2022 20:33:01 +0100
> Subject: [PATCH 2/2] Include count of unexpected core files in gdb.sum summary
>
> If GDB, GDBserver, a testcase program, Valgrind, etc. unexpectedly
> crash while running the GDB testsuite, and you've setup your machine
> such that core files are dumped in the current directory instead of
> being shoved somewhere by abrt, apport, or similar (as you should for
> proper GDB testing), you'll end up with an unexpected core file in the
> $build/gdb/testsuite/ directory.
>
> It can happen that GDB, GDBserver, etc. even crashes _after_ gdb_exit,
> during teardown, and thus such a crash won't be noticed by looking at
> the gdb.sum file at all.  This commit aims at improving that, by
> including a new "unexpected core files" line in the testrun summary.
>
> For example, here's what I get on x86-64 Ubuntu 20.04, with this
> patch:
>
> 		 === gdb Summary ===
>
>  # of unexpected core files      12          << new info
>  # of expected passes            107557
>  # of unexpected failures        35
>  # of expected failures          77
>  # of unknown successes          2
>  # of known failures             114
>  # of untested testcases         31
>  # of unsupported tests          139
>
> I have my core pattern setup like this:
>
>  $ cat /proc/sys/kernel/core_pattern
>  core.%e.%p.%h.%t
>
> That's:
>
>  %e: executable filename
>  %p: pid
>  %h: hostname
>  %t: UNIX time of dump
>
> and so I get these core files:
>
>  $ ls -1 testsuite/core.*
>  testsuite/core.connect-with-no.216191.nelson.1656002431
>  testsuite/core.connect-with-no.217729.nelson.1656002431
>  testsuite/core.gdb.194247.nelson.1656002423
>  testsuite/core.gdb.226014.nelson.1656002435
>  testsuite/core.gdb.232078.nelson.1656002438
>  testsuite/core.gdb.352268.nelson.1656002441
>  testsuite/core.gdb.4152093.nelson.1656002337
>  testsuite/core.gdb.4154515.nelson.1656002338
>  testsuite/core.gdb.4156668.nelson.1656002339
>  testsuite/core.gdb.4158871.nelson.1656002341
>  testsuite/core.gdb.468495.nelson.1656002444
>  testsuite/core.vgdb.4192247.nelson.1656002366
>
> where we can see that GDB crashed a number of times, but also
> Valgrind's vgdb, and a couple testcase programs.  Neither of which is
> good.
>
> If your core_pattern is just "core" (but why??), then I guess that you
> may end up with just a single core file in testsuite/.  Still, that is
> one core file too many.
>
> Above, we see a couple cores for "connect-with-no", which are the
> result of gdb.server/connect-with-no-symbol-file.exp.  This is a case
> mentioned above -- while the program crashed, that happens during
> testcase teardown, and it goes unnoticed (without this commit) by
> gdb.sum results.  Vis:
>
>  $ make check TESTS="gdb.server/connect-with-no-symbol-file.exp"
>  ...
> 		 === gdb Summary ===
>
>  # of unexpected core files      2
>  # of expected passes            8
>
>  ...
>  $
>
> The tests fully passed, but still the testcase program crashed
> somehow:
>
>  $ ls -1 testsuite/core.*
>  testsuite/core.connect-with-no.941561.nelson.1656003317
>  testsuite/core.connect-with-no.941682.nelson.1656003317
>
> Against --target_board=native-extended-gdbserver it's even worse.  I
> get:
>
>  # of unexpected core files      26
>
> and note that when GDBserver hits an assertion failure, it exits with
> error, instead of crashing with SIGABRT.  I think that should be
> changed, at least on development builds, but that would be for another
> patch.  After such patch, I suspect the number of unexpected cores
> will be higher, as there are likely teardown GDBserver assertions that
> we're not noticing.
>
> I decided to put this new info in the "gdb Summary" section, as that's
> a place people already are used to looking at, either when looking at
> the tail of gdb.sum, or when diffing gdb.sum files, and we've already
> extended this section before, to include the count of DUPLICATE and
> PATH problems, so there's precedent.
>
> Implementation-wise, the new line is appended after DejaGnu is
> finished, with a shell script that is invoked by the Makefile.  It is
> done this way so that serial and parallel testing work the same way.
> My initial cut at an implementation was in TCL, straight in
> testsuite/lib/check-test-names.exp, where DUPLICATES and PATH are
> handled, like so:
>
>  @@ -148,6 +159,10 @@ namespace eval ::CheckTestNames {
> 	     $counts(paths,$which)
> 	 maybe_show_count "# of duplicate test names\t" \
> 	     $counts(duplicates,$which)
>  +
>  +       set cores [glob -nocomplain -directory $::objdir core*]
>  +       maybe_show_count "# of unexpected core files\t" \
>  +           [llength $cores]
>       }
>
> But that would only work for serial testing, as in parallel testing,
> the final gdb.sum is generated by aggregating the results of all the
> individual gdb.sum files, and dg-extract-results.sh doesn't know about
> our new summary line.  And I don't think that dg-extract-results.sh
> should be taught about it, since the count of core files is not
> something that we want to count many times, once per testcase, and
> then add up the subcounts at the end.  Every time we count the core
> files, we're already counting the final count.
>
> I considered using the Tcl implementation in serial mode, and the
> script approach for parallel testing, but that has the obvious
> downside of implementing and maintaining the same thing twice.  In the
> end, I settled on the script approach for serial mode too, which
> requires making the "check-single" rule print the tail end of the
> gdb.sum file, with a side effect being that if you look at the
> terminal after a run (instead of at the gdb.sum file), you'll see the
> "gdb Summary" section twice, once without the unexpected core lines
> printed, and then another with.  IMO, this isn't an issue; when
> testing in parallel mode, if you look at the terminal after "make -jN
> check", you'll also see multiple "gdb Summary" sections printed.

LGTM.

Thanks,
Andrew

>
> Change-Id: I190b8d41856d49ad143854b6e3e6ccd7caa04491
> ---
>  gdb/testsuite/Makefile.in                   |  9 ++++-
>  gdb/testsuite/lib/dg-add-core-file-count.sh | 40 +++++++++++++++++++++
>  2 files changed, 48 insertions(+), 1 deletion(-)
>  create mode 100755 gdb/testsuite/lib/dg-add-core-file-count.sh
>
> diff --git a/gdb/testsuite/Makefile.in b/gdb/testsuite/Makefile.in
> index 790b9e022cc..6a020e05d88 100644
> --- a/gdb/testsuite/Makefile.in
> +++ b/gdb/testsuite/Makefile.in
> @@ -208,7 +208,12 @@ check-gdb.%:
>  	$(MAKE) check TESTS="gdb.$*/*.exp"
>  
>  check-single:
> -	$(DO_RUNTEST) $(RUNTESTFLAGS) $(expanded_tests_or_none) $(TIMESTAMP)
> +	-rm -f core*
> +	$(DO_RUNTEST) $(RUNTESTFLAGS) $(expanded_tests_or_none) $(TIMESTAMP); \
> +	result=$$?; \
> +	$(SHELL) $(srcdir)/lib/dg-add-core-file-count.sh; \
> +	sed -n '/=== gdb Summary ===/,$$ p' gdb.sum; \
> +	exit $$result
>  
>  check-single-racy:
>  	-rm -rf cache racy_outputs temp
> @@ -231,6 +236,7 @@ check-single-racy:
>  	sed -n '/=== gdb Summary ===/,$$ p' racy.sum
>  
>  check-parallel:
> +	-rm -f core*
>  	-rm -rf cache outputs temp
>  	$(MAKE) -k do-check-parallel; \
>  	result=$$?; \
> @@ -238,6 +244,7 @@ check-parallel:
>  	  `find outputs -name gdb.sum -print` > gdb.sum; \
>  	$(SHELL) $(srcdir)/../../contrib/dg-extract-results.sh -L \
>  	  `find outputs -name gdb.log -print` > gdb.log; \
> +	$(SHELL) $(srcdir)/lib/dg-add-core-file-count.sh; \
>  	sed -n '/=== gdb Summary ===/,$$ p' gdb.sum; \
>  	exit $$result
>  
> diff --git a/gdb/testsuite/lib/dg-add-core-file-count.sh b/gdb/testsuite/lib/dg-add-core-file-count.sh
> new file mode 100755
> index 00000000000..abeb0b1c711
> --- /dev/null
> +++ b/gdb/testsuite/lib/dg-add-core-file-count.sh
> @@ -0,0 +1,40 @@
> +#!/bin/sh
> +
> +# Copyright (C) 2022 Free Software Foundation, Inc.
> +
> +# This file is part of GDB.
> +
> +# 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; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# 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, see <http://www.gnu.org/licenses/>.
> +
> +# Count number of core files in the current directory and if non-zero,
> +# add a line to the gdb.sum file.  This scripts assumes it is run from
> +# the build/gdb/testsuite/ directory.  It is normally invoked by the
> +# Makefile.
> +
> +# Count core files portably, using POSIX compliant shell, avoiding ls,
> +# find, wc, etc.  Spawning a subshell isn't strictly needed, but it's
> +# clearer.
> +cores=$(set -- core*; [ $# -eq 1 -a ! -e "$1" ] && shift; echo $#)
> +
> +# If no cores found, then don't add our summary line.
> +if [ "$cores" -eq "0" ]; then
> +    exit
> +fi
> +
> +# Add our line to the summary line.
> +sed -i'' -e "/=== gdb Summary ===/{
> +n
> +a\\
> +# of unexpected core files	$cores
> +}" gdb.sum
> -- 
> 2.36.0



More information about the Gdb-patches mailing list