mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-21 01:12:32 +08:00
7ffd4868a7
It can easily happen that the signal handler function `handle_fatal_signal` uses various signal unsafe functions. The problematic functions are `_` and `strsignal` which can be pre-computed after the `setlocale` call is done. Unfortunately when compiled with --disable-libbacktrace a different code path is used, that calls the glibc function `backtrace` which calls `malloc` and `free` and is therefore also signal unsafe, that is probably unfixable, so there is no attempt to fix anything in this code path. Approved-By: Andrew Burgess <aburgess@redhat.com> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31713#c9
79 lines
2.8 KiB
C
79 lines
2.8 KiB
C
/* Copyright (C) 2021-2024 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/>. */
|
|
|
|
/* Support for printing a backtrace when GDB hits an error. This is not
|
|
for printing backtraces of the inferior, but backtraces of GDB itself. */
|
|
|
|
#ifndef BT_UTILS_H
|
|
#define BT_UTILS_H
|
|
|
|
#ifdef HAVE_LIBBACKTRACE
|
|
# include "backtrace.h"
|
|
# include "backtrace-supported.h"
|
|
# if BACKTRACE_SUPPORTED && (! BACKTRACE_USES_MALLOC)
|
|
# define GDB_PRINT_INTERNAL_BACKTRACE
|
|
# define GDB_PRINT_INTERNAL_BACKTRACE_USING_LIBBACKTRACE
|
|
# endif
|
|
#endif
|
|
|
|
#if defined HAVE_EXECINFO_H \
|
|
&& defined HAVE_EXECINFO_BACKTRACE \
|
|
&& !defined GDB_PRINT_INTERNAL_BACKTRACE_USING_LIBBACKTRACE
|
|
# include <execinfo.h>
|
|
# define GDB_PRINT_INTERNAL_BACKTRACE
|
|
# define GDB_PRINT_INTERNAL_BACKTRACE_USING_EXECINFO
|
|
#endif
|
|
|
|
/* Define GDB_PRINT_INTERNAL_BACKTRACE_INIT_ON. This is a boolean value
|
|
that can be used as an initial value for a set/show user setting, where
|
|
the setting controls printing a GDB internal backtrace.
|
|
|
|
If backtrace printing is supported then this will have the value true,
|
|
but if backtrace printing is not supported then this has the value
|
|
false. */
|
|
#ifdef GDB_PRINT_INTERNAL_BACKTRACE
|
|
# define GDB_PRINT_INTERNAL_BACKTRACE_INIT_ON true
|
|
#else
|
|
# define GDB_PRINT_INTERNAL_BACKTRACE_INIT_ON false
|
|
#endif
|
|
|
|
/* Print a backtrace of the current GDB process to the current
|
|
gdb_stderr. The output is done in a signal async manner, so it is safe
|
|
to call from signal handlers. */
|
|
|
|
extern void gdb_internal_backtrace ();
|
|
|
|
/* A generic function that can be used as the set function for any set
|
|
command that enables printing of an internal backtrace. Command C must
|
|
be a boolean set command.
|
|
|
|
If GDB doesn't support printing a backtrace, and the user has tried to
|
|
set the variable associated with command C to true, then the associated
|
|
variable will be set back to false, and an error thrown.
|
|
|
|
If GDB does support printing a backtrace then this function does
|
|
nothing. */
|
|
|
|
extern void gdb_internal_backtrace_set_cmd (const char *args, int from_tty,
|
|
cmd_list_element *c);
|
|
|
|
/* Initialize language specific strings. */
|
|
|
|
extern void gdb_internal_backtrace_init_str ();
|
|
|
|
#endif /* BT_UTILS_H */
|