From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1551) id 2494F386F46B; Mon, 27 Jun 2022 12:58:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2494F386F46B Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Pedro Alves To: gdb-cvs@sourceware.org Subject: [binutils-gdb] Make GDBserver abort on internal error in development mode X-Act-Checkin: binutils-gdb X-Git-Author: Pedro Alves X-Git-Refname: refs/heads/master X-Git-Oldrev: e3e5ae049371a27fd1737aba946fe26d06e029b5 X-Git-Newrev: 171fba11ab27089cffd6f85655ab987a937fea25 Message-Id: <20220627125821.2494F386F46B@sourceware.org> Date: Mon, 27 Jun 2022 12:58:21 +0000 (GMT) X-BeenThere: gdb-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Jun 2022 12:58:21 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D171fba11ab27= 089cffd6f85655ab987a937fea25 commit 171fba11ab27089cffd6f85655ab987a937fea25 Author: Pedro Alves Date: Fri Jun 24 12:42:38 2022 +0100 Make GDBserver abort on internal error in development mode =20 Currently, if GDBserver hits some internal assertion, it exits with error status, instead of aborting. This makes it harder to debug GDBserver, as you can't just debug a core file if GDBserver fails an assertion. I've had to hack the code to make GDBserver abort to debug something several times before. =20 I believe the reason it exits instead of aborting, is to prevent potentially littering the filesystem of smaller embedded targets with core files. I think I recall Daniel Jacobowitz once saying that many years ago, but I can't be sure. Anyhow, that seems reasonable to me. =20 Since we nowadays have a distinction between development and release modes, I propose to make GDBserver abort on internal error if in development mode, while keeping the status quo when in release mode. =20 Thus, after this patch, in development mode, you get: =20 $ ../gdbserver/gdbserver ../../src/gdbserver/server.cc:3711: A problem internal to GDBserver ha= s been detected. captured_main: Assertion `0' failed. Aborted (core dumped) $ =20 while in release mode, you'll continue to get: =20 $ ../gdbserver/gdbserver ../../src/gdbserver/server.cc:3711: A problem internal to GDBserver ha= s been detected. captured_main: Assertion `0' failed. $ echo $? 1 =20 I do not think that this requires a separate configure switch. =20 A "--target_board=3Dnative-extended-gdbserver" run on Ubuntu 20.04 ends up with: =20 =3D=3D=3D gdb Summary =3D=3D=3D =20 # of unexpected core files 29 ... =20 for me, of which 8 are GDBserver core dumps, 7 more than without this patch. =20 Change-Id: I6861e08ad71f65a0332c91ec95ca001d130b0e9d Diff: --- gdbserver/utils.cc | 20 +++++++++++++++++--- gdbsupport/config.in | 3 +++ gdbsupport/configure | 13 +++++++++++++ gdbsupport/configure.ac | 10 ++++++++++ 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/gdbserver/utils.cc b/gdbserver/utils.cc index 4f6516c9cf2..d24057c6012 100644 --- a/gdbserver/utils.cc +++ b/gdbserver/utils.cc @@ -28,13 +28,27 @@ =20 /* Generally useful subroutines used throughout the program. */ =20 +/* If in release mode, just exit. This avoids potentially littering + the filesystem of small embedded targets with core files. If in + development mode however, abort, producing core files to help with + debugging GDBserver. */ +static void ATTRIBUTE_NORETURN +abort_or_exit () +{ +#ifdef DEVELOPMENT + abort (); +#else + exit (1); +#endif +} + void malloc_failure (long size) { fprintf (stderr, PREFIX "ran out of memory while trying to allocate %lu bytes\n", (unsigned long) size); - exit (1); + abort_or_exit (); } =20 /* Print the system error message for errno, and also mention STRING @@ -82,7 +96,7 @@ vwarning (const char *string, va_list args) fprintf (stderr, "\n"); } =20 -/* Report a problem internal to GDBserver, and exit. */ +/* Report a problem internal to GDBserver, and abort/exit. */ =20 void internal_verror (const char *file, int line, const char *fmt, va_list args) @@ -91,7 +105,7 @@ internal_verror (const char *file, int line, const char = *fmt, va_list args) %s:%d: A problem internal to " TOOLNAME " has been detected.\n", file, lin= e); vfprintf (stderr, fmt, args); fprintf (stderr, "\n"); - exit (1); + abort_or_exit (); } =20 /* Report a problem internal to GDBserver. */ diff --git a/gdbsupport/config.in b/gdbsupport/config.in index a7ae23b4984..577866c97b3 100644 --- a/gdbsupport/config.in +++ b/gdbsupport/config.in @@ -11,6 +11,9 @@ /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA =20 +/* Define if development-mode features are enabled. */ +#undef DEVELOPMENT + /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS diff --git a/gdbsupport/configure b/gdbsupport/configure index 618f487749f..0b48521deb6 100755 --- a/gdbsupport/configure +++ b/gdbsupport/configure @@ -624,6 +624,7 @@ ac_subst_vars=3D'am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS +CONFIG_STATUS_DEPENDENCIES WERROR_CFLAGS WARN_CFLAGS HAVE_PIPE_OR_PIPE2_FALSE @@ -10452,6 +10453,15 @@ ac_compiler_gnu=3D$ac_cv_c_compiler_gnu =20 =20 =20 +# Set the 'development' global. +. $srcdir/../bfd/development.sh + +if test "$development" =3D true ; then + +$as_echo "#define DEVELOPMENT 1" >>confdefs.h + +fi + case ${host} in *mingw32*) =20 @@ -10460,6 +10470,9 @@ $as_echo "#define USE_WIN32API 1" >>confdefs.h ;; esac =20 +CONFIG_STATUS_DEPENDENCIES=3D'$srcdir/../bfd/development.sh' + + ac_config_files=3D"$ac_config_files Makefile" =20 cat >confcache <<\_ACEOF diff --git a/gdbsupport/configure.ac b/gdbsupport/configure.ac index 1f794605f3c..ac2ade6a220 100644 --- a/gdbsupport/configure.ac +++ b/gdbsupport/configure.ac @@ -63,6 +63,14 @@ GDB_AC_PTRACE AM_GDB_COMPILER_TYPE AM_GDB_WARNINGS =20 +# Set the 'development' global. +. $srcdir/../bfd/development.sh + +if test "$development" =3D true ; then + AC_DEFINE(DEVELOPMENT, 1, + [Define if development-mode features are enabled.]) +fi + case ${host} in *mingw32*) AC_DEFINE(USE_WIN32API, 1, @@ -73,5 +81,7 @@ case ${host} in ;; esac =20 +AC_SUBST([CONFIG_STATUS_DEPENDENCIES], ['$srcdir/../bfd/development.sh']) + AC_CONFIG_FILES([Makefile]) AC_OUTPUT