[binutils-gdb] gdb: run 'maint selftest' with an executable loaded

Andrew Burgess aburgess@sourceware.org
Tue Jun 1 10:57:36 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b97eff8ffac51061413437ed3fe9b3a12f136cd4

commit b97eff8ffac51061413437ed3fe9b3a12f136cd4
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Thu May 20 14:09:22 2021 +0100

    gdb: run 'maint selftest' with an executable loaded
    
    I spotted that 'maint selftest' with an executable loaded into GDB,
    would (when GDB was compiled for all targets) crash GDB.  I fixed this
    with a commit to bfd:
    
      commit 427e4066afd13d1bf52c849849475f536e285d66
      Date:   Thu May 20 09:16:41 2021 +0100
    
          gdb/bfd: avoid crash when architecture is forced to csky or riscv
    
    However, this issue was not spotted as we currently only run 'maint
    selftest' without an executable loaded.
    
    This commit extends the testsuite to run 'maint selftest' both with
    and without an executable loaded into GDB.
    
    Currently, when no executable is loaded into GDB all of the selftest
    pass (i.e. the fail count is 0), however, when running with an
    executable loaded, I am seeing 1 failure (on an x86-64 GNU/Linux
    host).
    
    This failure is from the ARM disassembler tests, it appears that the
    disassembler somehow gets itself into a state where it thinks it is in
    thumb mode; when running the same test without an executable loaded
    this doesn't happen.
    
    This commit doesn't fix the ARM disassembler issue, but I thought it
    was worth adding this anyway, as this will spot if GDB again starts to
    crash when 'maint selftest' is run.
    
    gdb/testsuite/ChangeLog:
    
            * gdb.gdb/unittest.c: New file.
            * gdb.gdb/unittest.exp: Run with and without a binary file loaded
            into GDB.

Diff:
---
 gdb/testsuite/ChangeLog            |  6 ++++
 gdb/testsuite/gdb.gdb/unittest.c   | 22 ++++++++++++
 gdb/testsuite/gdb.gdb/unittest.exp | 69 +++++++++++++++++++++++++++-----------
 3 files changed, 78 insertions(+), 19 deletions(-)

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 6c7079325b9..ff26ba57d32 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2021-06-01  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* gdb.gdb/unittest.c: New file.
+	* gdb.gdb/unittest.exp: Run with and without a binary file loaded
+	into GDB.
+
 2021-06-01  Andrew Burgess  <andrew.burgess@embecosm.com>
 
 	* gdb.base/premature-dummy-frame-removal.c: New file.
diff --git a/gdb/testsuite/gdb.gdb/unittest.c b/gdb/testsuite/gdb.gdb/unittest.c
new file mode 100644
index 00000000000..9811b15f06d
--- /dev/null
+++ b/gdb/testsuite/gdb.gdb/unittest.c
@@ -0,0 +1,22 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2021 Free Software Foundation, Inc.
+
+   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/>.  */
+
+int
+main ()
+{
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.gdb/unittest.exp b/gdb/testsuite/gdb.gdb/unittest.exp
index 8718999dd33..61a6c0efb4b 100644
--- a/gdb/testsuite/gdb.gdb/unittest.exp
+++ b/gdb/testsuite/gdb.gdb/unittest.exp
@@ -22,25 +22,56 @@ if [gdb_debug_enabled] {
 
 set do_xml_test [expr ![gdb_skip_xml_test]]
 
-gdb_start
-
-set test "maintenance selftest"
-gdb_test_multiple $test $test {
-  -re ".*Running selftest \[^\n\r\]+\." {
-	# The selftests can take some time to complete.  To prevent
-	# timeout spot the 'Running ...' lines going past, so long as
-	# these are produced quickly enough then the overall test will
-	# not timeout.
-	exp_continue
-  }
-  -re "Ran ($decimal) unit tests, 0 failed\r\n$gdb_prompt $" {
-	set num_ran $expect_out(1,string)
-	gdb_assert "$num_ran > 0" $test
-  }
-
-  -re "Selftests have been disabled for this build.\r\n$gdb_prompt $" {
-	unsupported $test
-  }
+standard_testfile
+
+if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
+    return -1
+}
+
+proc run_selftests { binfile } {
+    global decimal gdb_prompt
+
+    if { $binfile == "" } {
+	gdb_exit
+	gdb_start
+    } else {
+	clean_restart ${binfile}
+    }
+
+    set test "maintenance selftest"
+    gdb_test_multiple $test $test {
+	-re ".*Running selftest \[^\n\r\]+\." {
+	    # The selftests can take some time to complete.  To prevent
+	    # timeout spot the 'Running ...' lines going past, so long as
+	    # these are produced quickly enough then the overall test will
+	    # not timeout.
+	    exp_continue
+	}
+	-re "Ran ($decimal) unit tests, ($decimal) failed\r\n$gdb_prompt $" {
+	    set num_ran $expect_out(1,string)
+	    set num_failed $expect_out(2,string)
+	    gdb_assert "$num_ran > 0" "$test, ran some tests"
+
+	    if { $binfile != "" } {
+		# There's a known issue here (see PR gdb/27891),
+		# however, we should not have more than 1 failure.
+		gdb_assert "$num_failed <= 1" "$test, failed no more than 1"
+		setup_kfail "gdb/27891" "*-*-*"
+	    }
+	    gdb_assert "$num_failed == 0" "$test, failed none"
+	}
+	-re "Selftests have been disabled for this build.\r\n$gdb_prompt $" {
+	    unsupported $test
+	}
+    }
+}
+
+with_test_prefix "no executable loaded" {
+    run_selftests ""
+}
+
+with_test_prefix "executable loaded" {
+    run_selftests ${binfile}
 }
 
 if { ![is_remote host] && $do_xml_test } {


More information about the Gdb-cvs mailing list