From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) by sourceware.org (Postfix) with ESMTPS id 8A33F3851A82 for ; Fri, 24 Jun 2022 13:26:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8A33F3851A82 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=palves.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wm1-f51.google.com with SMTP id p6-20020a05600c1d8600b0039c630b8d96so3363351wms.1 for ; Fri, 24 Jun 2022 06:26:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=WPS4hxkONZcr+mA/lNMm19eAkkUgnNph3//8b+Z7oQk=; b=PEbRriO2Yz61R/VWO9cEr5TuZ8J/EVD89WAc6DF79GqY3YAJ9i9l9faSxixGH+oicm nKiD03iBcvxtFvUkGsGunE+R3zboAIbwwtgw9f0aMgW+GV2E28xpil+XiozRe+2RtJMJ uO683cVIApC+XTZaeyjIHxddnvFWZhryd2t22h2x27bv9M6kBMeeiBvpIc4SniqozB6a T0vqb+qnHNySR3SuitZVbWggUivOCxzBdKzwHa0iq3X2FQG4cpoBVxVXRKGd4SMxPGI2 IFR8a/sZbM+GQ15lMBZ/HtWZQsVjwv6Yp+ucfFS/bTTY/wmjEtNRxlfC9P7Wgtd6iEPf D8RQ== X-Gm-Message-State: AJIora+lSr7Pk9nouw8ylJqGzdquv9VlGdy8nMznyfJQFUZVACOJv9MU qbFSe1dT9SYHtGEUaG8mKchVgoA/Bqc= X-Google-Smtp-Source: AGRyM1uD6VOUl8ayFsEpybj+P6OWfKg1gkgvwHUo4xA6yrHT/wWHvSWdGv8IEOOBbLDEKBynoRcZYA== X-Received: by 2002:a05:600c:2298:b0:3a0:31a9:710b with SMTP id 24-20020a05600c229800b003a031a9710bmr3851527wmf.115.1656077207535; Fri, 24 Jun 2022 06:26:47 -0700 (PDT) Received: from localhost ([2001:8a0:f924:2600:209d:85e2:409e:8726]) by smtp.gmail.com with ESMTPSA id l8-20020a7bc448000000b003a0332760c0sm2812004wmi.16.2022.06.24.06.26.46 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 24 Jun 2022 06:26:46 -0700 (PDT) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH] Make GDBserver abort on internal error in development mode Date: Fri, 24 Jun 2022 14:26:45 +0100 Message-Id: <20220624132645.1117504-1-pedro@palves.net> X-Mailer: git-send-email 2.36.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.9 required=5.0 tests=BAYES_00, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 24 Jun 2022 13:26:55 -0000 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. 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. Since we nowadays have a distinction between development and release modes, I propose to make GDBserver abort on internal error is in development mode, while keeping the status quo when in release mode. Thus, after this patch, in development mode, you get: $ ../gdbserver/gdbserver ../../src/gdbserver/server.cc:3711: A problem internal to GDBserver has been detected. captured_main: Assertion `0' failed. Aborted (core dumped) $ while in release mode, you'll continue to get: $ ../gdbserver/gdbserver ../../src/gdbserver/server.cc:3711: A problem internal to GDBserver has been detected. captured_main: Assertion `0' failed. $ echo $? 1 I do not think that this requires a separate configure switch. A "--target_board=native-extended-gdbserver" run on Ubuntu 20.04 ends up with: === gdb Summary === # of unexpected core files 29 ... for me, of which 8 are GDBserver core dumps, 7 more than without this patch. Change-Id: I6861e08ad71f65a0332c91ec95ca001d130b0e9d --- 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 @@ /* Generally useful subroutines used throughout the program. */ +/* 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 (); } /* 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"); } -/* Report a problem internal to GDBserver, and exit. */ +/* Report a problem internal to GDBserver, and abort/exit. */ 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, line); vfprintf (stderr, fmt, args); fprintf (stderr, "\n"); - exit (1); + abort_or_exit (); } /* 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 +/* 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='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=$ac_cv_c_compiler_gnu +# Set the 'development' global. +. $srcdir/../bfd/development.sh + +if test "$development" = true ; then + +$as_echo "#define DEVELOPMENT 1" >>confdefs.h + +fi + case ${host} in *mingw32*) @@ -10460,6 +10470,9 @@ $as_echo "#define USE_WIN32API 1" >>confdefs.h ;; esac +CONFIG_STATUS_DEPENDENCIES='$srcdir/../bfd/development.sh' + + ac_config_files="$ac_config_files Makefile" 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 +# Set the 'development' global. +. $srcdir/../bfd/development.sh + +if test "$development" = 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 +AC_SUBST([CONFIG_STATUS_DEPENDENCIES], ['$srcdir/../bfd/development.sh']) + AC_CONFIG_FILES([Makefile]) AC_OUTPUT base-commit: e83907ff5ffbac3d0224d31ee99e6dc056205f39 -- 2.36.0