+2017-08-18 Yao Qi <yao.qi@linaro.org>
+
+ * NEWS: Mention GDBserver's new option "--selftest".
+ * Makefile.in (SFILES): Remove selftest.c, add common/selftest.c.
+ * selftest.c: Move it to common/selftest.c.
+ * selftest.h: Move it to common/selftest.h.
+ * selftest-arch.c (reset): New function.
+ (tests_with_arch): Call reset.
+
2017-08-18 Yao Qi <yao.qi@linaro.org>
* selftest.c (run_tests): Don't call QUIT. Call debug_printf
reverse.c \
rust-exp.y \
rust-lang.c \
- selftest.c \
selftest-arch.c \
sentinel-frame.c \
ser-base.c \
common/ptid.c \
common/rsp-low.c \
common/run-time-clock.c \
+ common/selftest.c \
common/signals.c \
common/signals-state-save-restore.c \
common/vec.c \
*** Changes since GDB 8.0
-* On Unix systems, GDBserver now does globbing expansion and variable
- substitution in inferior command line arguments.
-
- This is done by starting inferiors using a shell, like GDB does.
- See "set startup-with-shell" in the user manual for how to disable
- this from GDB when using "target extended-remote". When using
- "target remote", you can disable the startup with shell by using the
- new "--no-startup-with-shell" GDBserver command line option.
+* New features in the GDB remote stub, GDBserver
+
+ ** New "--selftest" command line option runs some GDBserver self
+ tests. These self tests are disabled in releases.
+
+ ** On Unix systems, GDBserver now does globbing expansion and variable
+ substitution in inferior command line arguments.
+
+ This is done by starting inferiors using a shell, like GDB does.
+ See "set startup-with-shell" in the user manual for how to disable
+ this from GDB when using "target extended-remote". When using
+ "target remote", you can disable the startup with shell by using the
+ new "--no-startup-with-shell" GDBserver command line option.
* New remote packets
--- /dev/null
+/* GDB self-testing.
+ Copyright (C) 2016-2017 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/>. */
+
+#include "common-defs.h"
+#include "common-exceptions.h"
+#include "common-debug.h"
+#include "selftest.h"
+#include <vector>
+
+namespace selftests
+{
+
+/* All the tests that have been registered. */
+
+static std::vector<self_test_function *> tests;
+
+/* See selftest.h. */
+
+void
+register_test (self_test_function *function)
+{
+ tests.push_back (function);
+}
+
+/* See selftest.h. */
+
+void
+run_tests (void)
+{
+ int failed = 0;
+
+ for (int i = 0; i < tests.size (); ++i)
+ {
+ TRY
+ {
+ tests[i] ();
+ }
+ CATCH (ex, RETURN_MASK_ERROR)
+ {
+ ++failed;
+ debug_printf ("Self test failed: %s\n", ex.message);
+ }
+ END_CATCH
+
+ reset ();
+ }
+
+ debug_printf ("Ran %lu unit tests, %d failed\n",
+ (long) tests.size (), failed);
+}
+} // namespace selftests
--- /dev/null
+/* GDB self-testing.
+ Copyright (C) 2016-2017 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/>. */
+
+#ifndef SELFTEST_H
+#define SELFTEST_H
+
+/* A test is just a function that does some checks and throws an
+ exception if something has gone wrong. */
+
+typedef void self_test_function (void);
+
+namespace selftests
+{
+
+/* Register a new self-test. */
+
+extern void register_test (self_test_function *function);
+
+/* Run all the self tests. This print a message describing the number
+ of test and the number of failures. */
+
+extern void run_tests (void);
+
+/* Reset GDB or GDBserver's internal state. */
+extern void reset ();
+
+}
+
+/* Check that VALUE is true, and, if not, throw an exception. */
+
+#define SELF_CHECK(VALUE) \
+ do { \
+ if (!(VALUE)) \
+ error (_("self-test failed at %s:%d"), __FILE__, __LINE__); \
+ } while (0)
+
+#endif /* SELFTEST_H */
+2017-08-18 Yao Qi <yao.qi@linaro.org>
+
+ * gdb.texinfo (Server): Document "--selftest".
+
2017-08-16 Ruslan Kabatsayev <b7.10110111@gmail.com>
* gdb.texinfo (TUI Single Key Mode): Document the new shortcuts in
$ gdbserver --wrapper env LD_PRELOAD=libtest.so -- :2222 ./testprog
@end smallexample
+@cindex @option{--selftest}
+The @option{--selftest} option runs the self tests in @code{gdbserver}:
+
+@smallexample
+$ gdbserver --selftest
+Ran 2 unit tests, 0 failed
+@end smallexample
+
+These tests are disabled in release.
@subsection Connecting to @code{gdbserver}
The basic procedure for connecting to the remote target is:
+2017-08-18 Yao Qi <yao.qi@linaro.org>
+
+ * Makefile.in (OBS): Add selftest.o.
+ * configure.ac: AC_DEFINE GDB_SELF_TEST if $development.
+ * configure, config.in: Re-generated.
+ * server.c: Include common/sefltest.h.
+ (captured_main): Handle option --selftest.
+
2017-08-09 Yao Qi <yao.qi@linaro.org>
* configure.srv (srv_i386_regobj): Remove i386-avx.o,
regcache.o \
remote-utils.o \
rsp-low.o \
+ selftest.o \
server.o \
signals.o \
signals-state-save-restore.o \
/* 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
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} ;;
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
#include "job-control.h"
#include "environ.h"
+#include "common/selftest.h"
+
/* The environment to pass to the inferior when creating it. */
static gdb_environ our_environ;
volatile int multi_mode = 0;
volatile int attach = 0;
int was_running;
+ bool selftest = false;
while (*next_arg != NULL && **next_arg == '-')
{
startup_with_shell = false;
else if (strcmp (*next_arg, "--once") == 0)
run_once = 1;
+ else if (strcmp (*next_arg, "--selftest") == 0)
+ selftest = true;
else
{
fprintf (stderr, "Unknown argument: %s\n", *next_arg);
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);
starting the inferior. Inferiors created in this scenario have
stdin,stdout redirected. So do this here before we call
start_inferior. */
- remote_prepare (port);
+ if (port != NULL)
+ remote_prepare (port);
bad_attach = 0;
pid = 0;
own_buf = (char *) xmalloc (PBUFSIZ + 1);
mem_buf = (unsigned char *) xmalloc (PBUFSIZ);
+ if (selftest)
+ {
+ selftests::run_tests ();
+ throw_quit ("Quit");
+ }
+
if (pid == 0 && *next_arg != NULL)
{
int i, n;
return 0;
}
+
+#if GDB_SELF_TEST
+namespace selftests
+{
+
+void
+reset ()
+{}
+
+} // namespace selftests
+#endif /* GDB_SELF_TEST */
gdbarch_tests.push_back (function);
}
+void
+reset ()
+{
+ /* Clear GDB internal state. */
+ registers_changed ();
+ reinit_frame_cache ();
+}
+
static void
tests_with_arch ()
{
}
END_CATCH
- /* Clear GDB internal state. */
- registers_changed ();
- reinit_frame_cache ();
+ reset ();
}
}
+++ /dev/null
-/* GDB self-testing.
- Copyright (C) 2016-2017 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/>. */
-
-#include "defs.h"
-#include "selftest.h"
-#include <vector>
-
-namespace selftests
-{
-
-/* All the tests that have been registered. */
-
-static std::vector<self_test_function *> tests;
-
-/* See selftest.h. */
-
-void
-register_test (self_test_function *function)
-{
- tests.push_back (function);
-}
-
-/* See selftest.h. */
-
-void
-run_tests (void)
-{
- int failed = 0;
-
- for (int i = 0; i < tests.size (); ++i)
- {
- TRY
- {
- tests[i] ();
- }
- CATCH (ex, RETURN_MASK_ERROR)
- {
- ++failed;
- debug_printf ("Self test failed: %s\n", ex.message);
- }
- END_CATCH
-
- /* Clear GDB internal state. */
- registers_changed ();
- reinit_frame_cache ();
- }
-
- debug_printf ("Ran %lu unit tests, %d failed\n",
- (long) tests.size (), failed);
-}
-} // namespace selftests
+++ /dev/null
-/* GDB self-testing.
- Copyright (C) 2016-2017 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/>. */
-
-#ifndef SELFTEST_H
-#define SELFTEST_H
-
-/* A test is just a function that does some checks and throws an
- exception if something has gone wrong. */
-
-typedef void self_test_function (void);
-
-namespace selftests
-{
-
-/* Register a new self-test. */
-
-extern void register_test (self_test_function *function);
-
-/* Run all the self tests. This print a message describing the number
- of test and the number of failures. */
-
-extern void run_tests (void);
-
-}
-
-/* Check that VALUE is true, and, if not, throw an exception. */
-
-#define SELF_CHECK(VALUE) \
- do { \
- if (!(VALUE)) \
- error (_("self-test failed at %s:%d"), __FILE__, __LINE__); \
- } while (0)
-
-#endif /* SELFTEST_H */
+2017-08-18 Yao Qi <yao.qi@linaro.org>
+
+ * gdb.server/unittest.exp: New.
+
2017-08-15 Sergio Durigan Junior <sergiodj@redhat.com>
PR gdb/21954
--- /dev/null
+# 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 --selftest"
+
+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"
+ }
+ default {
+ fail "unit tests"
+ }
+}