diff options
author | Tom Tromey <tom@tromey.com> | 2019-09-29 09:27:11 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2019-11-26 14:02:57 -0700 |
commit | c3efb9654847822620010922cb7ea61e8901479c (patch) | |
tree | 19776ea09f27af39d30ac52c3c53b8f10435a317 /gdb/main.c | |
parent | 21987b9c060033d367abc50c29f786df4c21b10c (diff) | |
download | gdb-c3efb9654847822620010922cb7ea61e8901479c.zip gdb-c3efb9654847822620010922cb7ea61e8901479c.tar.gz gdb-c3efb9654847822620010922cb7ea61e8901479c.tar.bz2 |
Introduce alternate_signal_stack RAII class
This introduces a new RAII class that temporarily installs an
alternate signal stack (on systems that have sigaltstack); then
changes the one gdb use of sigaltstack to use this class instead.
This will be used in a later patch, when creating new threads that may
want to handle SIGSEGV.
gdb/ChangeLog
2019-11-26 Tom Tromey <tom@tromey.com>
* main.c (setup_alternate_signal_stack): Remove.
(captured_main_1): Use gdb::alternate_signal_stack.
* gdbsupport/alt-stack.h: New file.
Change-Id: I721c047ae9d51a35fd274a6dbc00a58c6440dae6
Diffstat (limited to 'gdb/main.c')
-rw-r--r-- | gdb/main.c | 26 |
1 files changed, 2 insertions, 24 deletions
@@ -52,6 +52,7 @@ #ifdef GDBTK #include "gdbtk/generic/gdbtk.h" #endif +#include "gdbsupport/alt-stack.h" /* The selected interpreter. This will be used as a set command variable, so it should always be malloc'ed - since @@ -334,29 +335,6 @@ get_init_files (std::vector<std::string> *system_gdbinit, *local_gdbinit = localinit; } -/* Try to set up an alternate signal stack for SIGSEGV handlers. - This allows us to handle SIGSEGV signals generated when the - normal process stack is exhausted. If this stack is not set - up (sigaltstack is unavailable or fails) and a SIGSEGV is - generated when the normal stack is exhausted then the program - will behave as though no SIGSEGV handler was installed. */ - -static void -setup_alternate_signal_stack (void) -{ -#ifdef HAVE_SIGALTSTACK - stack_t ss; - - /* FreeBSD versions older than 11.0 use char * for ss_sp instead of - void *. This cast works with both types. */ - ss.ss_sp = (char *) xmalloc (SIGSTKSZ); - ss.ss_size = SIGSTKSZ; - ss.ss_flags = 0; - - sigaltstack(&ss, NULL); -#endif -} - /* Call command_loop. */ /* Prevent inlining this function for the benefit of GDB's selftests @@ -898,7 +876,7 @@ captured_main_1 (struct captured_main_args *context) save_original_signals_state (quiet); /* Try to set up an alternate signal stack for SIGSEGV handlers. */ - setup_alternate_signal_stack (); + gdb::alternate_signal_stack signal_stack; /* Initialize all files. */ gdb_init (gdb_program_name); |