From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23396 invoked by alias); 11 Jan 2010 16:18:18 -0000 Received: (qmail 23378 invoked by uid 22791); 11 Jan 2010 16:18:17 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 11 Jan 2010 16:18:11 +0000 Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o0BGHjjf009850 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 11 Jan 2010 11:17:45 -0500 Received: from host0.dyn.jankratochvil.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o0BGHcIW006087 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 11 Jan 2010 11:17:44 -0500 Received: from host0.dyn.jankratochvil.net (localhost [127.0.0.1]) by host0.dyn.jankratochvil.net (8.14.3/8.14.3) with ESMTP id o0BGHZam014040; Mon, 11 Jan 2010 17:17:35 +0100 Received: (from jkratoch@localhost) by host0.dyn.jankratochvil.net (8.14.3/8.14.3/Submit) id o0BGHZE0014032; Mon, 11 Jan 2010 17:17:35 +0100 Date: Mon, 11 Jan 2010 16:18:00 -0000 From: Jan Kratochvil To: Tristan Gingold Cc: gdb-patches@sourceware.org Subject: Re: [patch] Do not disappoint on "Create a core file of GDB?" Message-ID: <20100111161734.GA13820@host0.dyn.jankratochvil.net> References: <20100111160241.GA12356@host0.dyn.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-08-17) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-01/txt/msg00256.txt.bz2 On Mon, 11 Jan 2010 17:07:30 +0100, Tristan Gingold wrote: > > On Jan 11, 2010, at 5:02 PM, Jan Kratochvil wrote: > Hi, > > sorry for the nit but: > > > setrlimit is a POSIX function so I hope it does not need autoconf magic: > > http://www.opengroup.org/onlinepubs/009695399/functions/setrlimit.html > > Sure, but windows is not POSIX compliant, so I think you can't avoid some > autoconf stuff. OK. The patch has now no effect on platforms without setrlimit / getrlimit. Thanks, Jan 2010-01-11 Jan Kratochvil * configure.ac (AC_CHECK_FUNCS): Check for setrlimit and getrlimit. * configure: Regenerate. * config.in: Regenerate. * utils.c: Include sys/resource.h. (dump_core, can_dump_core): New. (internal_vproblem): Update the comment. Check can_dump_core while setting dump_core_p. Replace two abort calls by dump_core calls. --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -801,7 +801,8 @@ AC_FUNC_VFORK AC_CHECK_FUNCS([canonicalize_file_name realpath getrusage getuid \ getgid pipe poll pread64 sbrk setpgid setpgrp setsid \ sigaction sigprocmask sigsetmask socketpair syscall \ - ttrace wborder setlocale iconvlist libiconvlist btowc]) + ttrace wborder setlocale iconvlist libiconvlist btowc \ + setrlimit getrlimit]) AM_LANGINFO_CODESET # Check the return and argument types of ptrace. No canned test for --- a/gdb/utils.c +++ b/gdb/utils.c @@ -26,6 +26,9 @@ #include "event-top.h" #include "exceptions.h" #include "gdbthread.h" +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif /* HAVE_SYS_RESOURCE_H */ #ifdef TUI #include "tui/tui.h" /* For tui_get_command_dimension. */ @@ -843,6 +844,44 @@ error_stream (struct ui_file *stream) error (("%s"), message); } +/* Dump core trying to increase the core soft limit to hard limit first. */ + +static void +dump_core (void) +{ +#ifdef HAVE_SETRLIMIT + struct rlimit rlim = { RLIM_INFINITY, RLIM_INFINITY }; + + setrlimit (RLIMIT_CORE, &rlim); +#endif /* HAVE_SETRLIMIT */ + + abort (); /* NOTE: GDB has only three calls to abort(). */ +} + +/* Check whether GDB will be able to dump core using the dump_core function. */ + +static int +can_dump_core (const char *reason) +{ +#ifdef HAVE_GETRLIMIT + struct rlimit rlim; + + /* Be quiet and assume we can dump if an error is returned. */ + if (getrlimit (RLIMIT_CORE, &rlim) != 0) + return 1; + + if (rlim.rlim_max == 0) + { + fprintf_unfiltered (gdb_stderr, + _("%s\nUnable to dump core, use `ulimit -c unlimited'" + " before executing GDB next time.\n"), reason); + return 0; + } +#endif /* HAVE_GETRLIMIT */ + + return 1; +} + /* Allow the user to configure the debugger behavior with respect to what to do when an internal problem is detected. */ @@ -893,7 +932,7 @@ internal_vproblem (struct internal_problem *problem, case 1: dejavu = 2; fputs_unfiltered (msg, gdb_stderr); - abort (); /* NOTE: GDB has only four calls to abort(). */ + abort (); /* NOTE: GDB has only three calls to abort(). */ default: dejavu = 3; /* Newer GLIBC versions put the warn_unused_result attribute @@ -902,7 +941,7 @@ internal_vproblem (struct internal_problem *problem, does not fix this problem. This is the solution suggested at http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25509. */ if (write (STDERR_FILENO, msg, sizeof (msg)) != sizeof (msg)) - abort (); /* NOTE: GDB has only four calls to abort(). */ + abort (); /* NOTE: GDB has only three calls to abort(). */ exit (1); } } @@ -951,13 +990,18 @@ further debugging may prove unreliable.", file, line, problem->name, msg); if (problem->should_dump_core == internal_problem_ask) { - /* Default (yes/batch case) is to dump core. This leaves a GDB - `dropping' so that it is easier to see that something went - wrong in GDB. */ - dump_core_p = query (_("%s\nCreate a core file of GDB? "), reason); + if (!can_dump_core (reason)) + dump_core_p = 0; + else + { + /* Default (yes/batch case) is to dump core. This leaves a GDB + `dropping' so that it is easier to see that something went + wrong in GDB. */ + dump_core_p = query (_("%s\nCreate a core file of GDB? "), reason); + } } else if (problem->should_dump_core == internal_problem_yes) - dump_core_p = 1; + dump_core_p = can_dump_core (reason); else if (problem->should_dump_core == internal_problem_no) dump_core_p = 0; else @@ -966,7 +1010,7 @@ further debugging may prove unreliable.", file, line, problem->name, msg); if (quit_p) { if (dump_core_p) - abort (); /* NOTE: GDB has only four calls to abort(). */ + dump_core (); else exit (1); } @@ -976,7 +1020,7 @@ further debugging may prove unreliable.", file, line, problem->name, msg); { #ifdef HAVE_WORKING_FORK if (fork () == 0) - abort (); /* NOTE: GDB has only four calls to abort(). */ + dump_core (); #endif } }