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 427e4066af
  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.
This commit is contained in:
Andrew Burgess
2021-05-20 14:09:22 +01:00
parent 9b715c68e8
commit b97eff8ffa
3 changed files with 76 additions and 17 deletions

View File

@@ -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.

View File

@@ -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;
}

View File

@@ -22,25 +22,56 @@ if [gdb_debug_enabled] {
set do_xml_test [expr ![gdb_skip_xml_test]]
gdb_start
standard_testfile
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
}
if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
return -1
}
-re "Selftests have been disabled for this build.\r\n$gdb_prompt $" {
unsupported $test
}
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 } {