Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Simon Marchi <simon.marchi@efficios.com>
To: gcc-patches@sourceware.org, gdb-patches@sourceware.org
Cc: Simon Marchi <simon.marchi@efficios.com>
Subject: [PATCH 2/6] gdbsupport/selftest: print expression when selftest fails and re-format
Date: Mon, 19 Oct 2026 12:58:18 -0400	[thread overview]
Message-ID: <20261019165929.792697-3-simon.marchi@efficios.com> (raw)
In-Reply-To: <20261019165929.792697-1-simon.marchi@efficios.com>

This is a small step towards printing rich error messages when selftests
fail.  Add a selftests::failed_selftest function, called by SELF_CHECK
when the check fails.  It formats the error message, which now includes
the text of the failed expression (passed as a string from the
SELF_CHECK macro), and throws an error with the new error code
SELF_CHECK_FAILED_ERROR.  Change the output to a single line starting
with "FAIL:", followed by the location and the expression.

The SELF_CHECK_FAILED_ERROR error code allows the selftest runner to tell a
failed SELF_CHECK apart from other errors thrown during a test, and report
them differently.

This changes the output when there are failed selftests from:

    $ ./gdb -nx -q --data-directory=data-directory -ex "maint selftest string_" -batch
    Running selftest string_appendf.
    Running selftest string_printf.
    Self test failed: self-test failed at /home/smarchi/src/binutils-gdb/gdb/unittests/common-utils-selftests.c:35
    Running selftest string_vappendf.
    Running selftest string_vprintf.
    Self test failed: self-test failed at /home/smarchi/src/binutils-gdb/gdb/unittests/common-utils-selftests.c:35

    Failures:
      string_printf
      string_vprintf

    Ran 4 unit tests, 2 failed

to:

    $ ./gdb -nx -q --data-directory=data-directory -ex "maint selftest string_" -batch
    Running selftest string_appendf.
    Running selftest string_printf.
    FAIL: /home/smarchi/src/binutils-gdb/gdb/unittests/common-utils-selftests.c:35: func ("%s", "test") == "test boo"
    Running selftest string_vappendf.
    Running selftest string_vprintf.
    FAIL: /home/smarchi/src/binutils-gdb/gdb/unittests/common-utils-selftests.c:35: func ("%s", "test") == "test boo"

    Failures:
      string_printf
      string_vprintf

    Ran 4 unit tests, 2 failed

Other errors thrown during a selftest, which used to be printed as:

    Self test failed: oh no

are now printed as:

    FAIL: unexpected exception: oh no

The output looks similar with gdbserver (the formatting code is shared,
so it's expected).

I wish we could add some colors, but since this code is in gdbsupport,
it's not straightforward.  Maybe we can add that later.

Change-Id: Ice0c930add2dc0d2395806cc17f9d2dc247db419
---
 gdbsupport/common-exceptions.h |  3 +++
 gdbsupport/selftest.cc         | 15 ++++++++++++++-
 gdbsupport/selftest.h          | 17 +++++++++++++----
 3 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/gdbsupport/common-exceptions.h b/gdbsupport/common-exceptions.h
index 058260b5f270..1b3de6a2f955 100644
--- a/gdbsupport/common-exceptions.h
+++ b/gdbsupport/common-exceptions.h
@@ -112,6 +112,9 @@ enum errors {
      "_ERROR" is appended to the name.  */
   MAX_COMPLETIONS_REACHED_ERROR,
 
+  /* A SELF_CHECK failed during a selftest.  */
+  SELF_CHECK_FAILED_ERROR,
+
   /* Add more errors here.  */
   NR_ERRORS
 };
diff --git a/gdbsupport/selftest.cc b/gdbsupport/selftest.cc
index 611bb990a0e2..85eee59e3c4b 100644
--- a/gdbsupport/selftest.cc
+++ b/gdbsupport/selftest.cc
@@ -101,7 +101,11 @@ run_tests (gdb::array_view<const char *const> filters, bool verbose)
 	}
       catch (const gdb_exception_error &ex)
 	{
-	  debug_printf ("Self test failed: %s\n", ex.what ());
+	  if (ex.error == SELF_CHECK_FAILED_ERROR)
+	    debug_printf ("FAIL: %s\n", ex.what ());
+	  else
+	    debug_printf ("FAIL: unexpected exception: %s\n", ex.what ());
+
 	  failed.push_back (test.name.c_str ());
 	}
 
@@ -138,4 +142,13 @@ all_selftests ()
   return selftests_range (tests.cbegin (), tests.cend ());
 }
 
+/* See selftest.h.  */
+
+void
+failed_selftest (const char *file, int line, const char *expression)
+{
+  throw_error (SELF_CHECK_FAILED_ERROR, "%s:%d: %s", file, line,
+	       expression);
+}
+
 } /* namespace selftests */
diff --git a/gdbsupport/selftest.h b/gdbsupport/selftest.h
index 2a1539827940..ddf925dd3524 100644
--- a/gdbsupport/selftest.h
+++ b/gdbsupport/selftest.h
@@ -83,14 +83,23 @@ extern void run_tests (gdb::array_view<const char *const> filters,
 
 /* Reset GDB or GDBserver's internal state.  */
 extern void reset ();
+
+/* Function called by macro SELF_CHECK when a selftest fails.  Throw an
+   error with code SELF_CHECK_FAILED_ERROR describing the failure.  */
+
+[[noreturn]] void failed_selftest (const char *file, int line,
+				   const char *expression);
+
 }
 
 /* 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)
+  do									\
+    {									\
+      if (!(VALUE))							\
+	selftests::failed_selftest (__FILE__, __LINE__, #VALUE);	\
+    }									\
+  while (0)
 
 #endif /* GDBSUPPORT_SELFTEST_H */
-- 
2.56.0


  parent reply	other threads:[~2026-10-19 17:02 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-19 16:58 [PATCH 0/6] Make SELF_CHECK print operands of comparisons Simon Marchi
2026-10-19 16:58 ` [PATCH 1/6] gdb/unittests: catch gdb_exception_error in scoped_mmap test Simon Marchi
2026-10-19 16:58 ` Simon Marchi [this message]
2026-10-19 16:58 ` [PATCH 3/6] include/diagnostics.h: add DIAGNOSTIC_IGNORE_PARENTHESES Simon Marchi
2026-10-19 16:58 ` [PATCH 4/6] gdb/gmp-utils: rename gdb_mp{z,q,f}::str to to_string Simon Marchi
2026-10-19 16:58 ` [PATCH 5/6] gdbsupport/selftest: print operand values when a SELF_CHECK fails Simon Marchi
2026-10-27 14:13   ` Tom Tromey
2026-10-27 17:06     ` Simon Marchi
2026-10-19 16:58 ` [PATCH 6/6] gdb: remove manual printing of values in some selftests Simon Marchi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261019165929.792697-3-simon.marchi@efficios.com \
    --to=simon.marchi@efficios.com \
    --cc=gcc-patches@sourceware.org \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox