diff options
author | Yao Qi <yao.qi@linaro.org> | 2017-05-26 11:56:58 +0100 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2017-06-20 11:34:13 +0100 |
commit | 809ac8acb172bf2cb05dd8a6b1f72cd38f3e58fa (patch) | |
tree | c517e0546c123de94c9a09fdfd5a82efec1bd813 | |
parent | e45a9c42f78b648a694070acdf89acb1fbaee564 (diff) | |
download | gdb-809ac8acb172bf2cb05dd8a6b1f72cd38f3e58fa.zip gdb-809ac8acb172bf2cb05dd8a6b1f72cd38f3e58fa.tar.gz gdb-809ac8acb172bf2cb05dd8a6b1f72cd38f3e58fa.tar.bz2 |
[RFC] GDBserver self test
This patch uses GDB self test in GDBserver. The self tests are run if
GDBserver is started with option --self-test.
gdb/gdbserver:
2017-05-26 Yao Qi <yao.qi@linaro.org>
* configure.ac: AC_DEFINE GDB_SELF_TEST if $development.
* configure, config.in: Re-generated.
* server.c: Include sefltest.h and selftest.c.
(captured_main): Handle option --self-test.
gdb:
2017-05-26 Yao Qi <yao.qi@linaro.org>
* selftest.c: Adjust it for GDBserver.
gdb/testsuite:
2017-05-26 Yao Qi <yao.qi@linaro.org>
* gdb.server/unittest.exp: New.
-rw-r--r-- | gdb/gdbserver/config.in | 3 | ||||
-rwxr-xr-x | gdb/gdbserver/configure | 6 | ||||
-rw-r--r-- | gdb/gdbserver/configure.ac | 5 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 18 | ||||
-rw-r--r-- | gdb/selftest.c | 18 | ||||
-rw-r--r-- | gdb/testsuite/gdb.server/unittest.exp | 41 |
6 files changed, 89 insertions, 2 deletions
diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in index 34a7443..5dacbac 100644 --- a/gdb/gdbserver/config.in +++ b/gdb/gdbserver/config.in @@ -8,6 +8,9 @@ /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA +/* Define if self-testing features should be enabled */ +#undef GDB_SELF_TEST + /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure index 35aeabc..30aa95b 100755 --- a/gdb/gdbserver/configure +++ b/gdb/gdbserver/configure @@ -5813,6 +5813,12 @@ fi fi +if $development; then + +$as_echo "#define GDB_SELF_TEST 1" >>confdefs.h + +fi + case ${build_alias} in "") build_noncanonical=${build} ;; *) build_noncanonical=${build_alias} ;; diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac index 4ea7913..36e21c5 100644 --- a/gdb/gdbserver/configure.ac +++ b/gdb/gdbserver/configure.ac @@ -56,6 +56,11 @@ else fi GDB_AC_LIBMCHECK(${libmcheck_default}) +if $development; then + AC_DEFINE(GDB_SELF_TEST, 1, + [Define if self-testing features should be enabled]) +fi + ACX_NONCANONICAL_TARGET ACX_NONCANONICAL_HOST diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 1d7a8b0..d0dcbee 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -3507,6 +3507,9 @@ detach_or_kill_for_exit_cleanup (void *ignore) END_CATCH } +#include "../selftest.h" +#include "../selftest.c" + /* Main function. This is called by the real "main" function, wrapped in a TRY_CATCH that handles any uncaught exceptions. */ @@ -3521,6 +3524,7 @@ captured_main (int argc, char *argv[]) volatile int multi_mode = 0; volatile int attach = 0; int was_running; + bool selftest = false; while (*next_arg != NULL && **next_arg == '-') { @@ -3639,6 +3643,11 @@ captured_main (int argc, char *argv[]) startup_with_shell = false; else if (strcmp (*next_arg, "--once") == 0) run_once = 1; + else if (strcmp (*next_arg, "--self-test") == 0) + { + selftest = true; + break; + } else { fprintf (stderr, "Unknown argument: %s\n", *next_arg); @@ -3654,7 +3663,8 @@ captured_main (int argc, char *argv[]) port = *next_arg; next_arg++; } - if (port == NULL || (!attach && !multi_mode && *next_arg == NULL)) + if ((port == NULL || (!attach && !multi_mode && *next_arg == NULL)) + && !selftest) { gdbserver_usage (stderr); exit (1); @@ -3712,6 +3722,12 @@ captured_main (int argc, char *argv[]) own_buf = (char *) xmalloc (PBUFSIZ + 1); mem_buf = (unsigned char *) xmalloc (PBUFSIZ); + if (selftest) + { + run_self_tests (); + throw_quit ("Quit"); + } + if (pid == 0 && *next_arg != NULL) { int i, n; diff --git a/gdb/selftest.c b/gdb/selftest.c index 14b76f6..c947749 100644 --- a/gdb/selftest.c +++ b/gdb/selftest.c @@ -15,8 +15,15 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ - +#include "config.h" +#ifdef GDBSERVER +#define QUIT do {} while (0) +#else #include "defs.h" +#endif +#include "common-defs.h" +#include "common-exceptions.h" +#include "common-debug.h" #include "selftest.h" #include <vector> @@ -50,15 +57,24 @@ run_self_tests (void) CATCH (ex, RETURN_MASK_ERROR) { ++failed; + #ifndef GDBSERVER exception_fprintf (gdb_stderr, ex, _("Self test failed: ")); + #endif } END_CATCH +#ifndef GDBSERVER /* Clear GDB internal state. */ registers_changed (); reinit_frame_cache (); +#endif } + #ifdef GDBSERVER + debug_printf ("Ran %lu unit tests, %d failed\n", + (long) tests.size (), failed); + #else printf_filtered (_("Ran %lu unit tests, %d failed\n"), (long) tests.size (), failed); + #endif } diff --git a/gdb/testsuite/gdb.server/unittest.exp b/gdb/testsuite/gdb.server/unittest.exp new file mode 100644 index 0000000..6dc4b6e --- /dev/null +++ b/gdb/testsuite/gdb.server/unittest.exp @@ -0,0 +1,41 @@ +# This testcase is part of GDB, the GNU debugger. + +# Copyright 2017 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/>. + +load_lib gdbserver-support.exp + +standard_testfile + +if { [skip_gdbserver_tests] } { + return 0 +} + +global server_spawn_id + +set gdbserver [find_gdbserver] +set gdbserver_command "$gdbserver --self-test" + +set server_spawn_id [remote_spawn target $gdbserver_command] + +gdb_expect { + -i $server_spawn_id + -re "Ran $decimal unit tests, 0 failed" { + pass "unit tests" + } + -re "Ran $decimal unit tests, $decimal failed" { + fail "unit tests" + } +} |