mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 09:08:59 +00:00
Suppress SIGTTOU when handling errors
[ Backport of commit 766f883622. ]
Calls to error () can cause SIGTTOU to send gdb to the background.
For example, on an Arm build:
(gdb) b main
Breakpoint 1 at 0x10774: file /build/gdb/testsuite/../../../src/binutils-gdb/gdb/testsuite/gdb.base/watchpoint.c, line 174.
(gdb) r
Starting program: /build/gdb/testsuite/outputs/gdb.base/watchpoint/watchpoint
[1]+ Stopped ../gdb ./outputs/gdb.base/watchpoint/watchpoint
localhost$ fg
../gdb ./outputs/gdb.base/watchpoint/watchpoint
Cannot parse expression `.L1199 4@r4'.
warning: Probes-based dynamic linker interface failed.
Reverting to original interface.
The SIGTTOU is raised whilst inside a syscall during the call to tcdrain.
Fix is to use scoped_ignore_sigttou to ensure SIGTTOU is blocked.
In addition fix include comments - job_control is not included via terminal.h
gdb/ChangeLog:
* event-top.c: Remove include comment.
* inflow.c (class scoped_ignore_sigttou): Move from here...
* inflow.h (class scoped_ignore_sigttou): ...to here.
* ser-unix.c (hardwire_drain_output): Block SIGTTOU during drain.
* top.c: Remove include comment.
This commit is contained in:
committed by
Tom de Vries
parent
7e38ddcb2e
commit
8ac39635f6
@@ -1,3 +1,11 @@
|
||||
2019-05-28 Alan Hayward <alan.hayward@arm.com>
|
||||
|
||||
* event-top.c: Remove include comment.
|
||||
* inflow.c (class scoped_ignore_sigttou): Move from here...
|
||||
* inflow.h (class scoped_ignore_sigttou): ...to here.
|
||||
* ser-unix.c (hardwire_drain_output): Block SIGTTOU during drain.
|
||||
* top.c: Remove include comment.
|
||||
|
||||
2019-08-04 Alan Hayward <alan.hayward@arm.com>
|
||||
|
||||
* symfile.c (symbol_file_command): Call solib_create_inferior_hook.
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include "inferior.h"
|
||||
#include "infrun.h"
|
||||
#include "target.h"
|
||||
#include "terminal.h" /* for job_control */
|
||||
#include "terminal.h"
|
||||
#include "event-loop.h"
|
||||
#include "event-top.h"
|
||||
#include "interps.h"
|
||||
|
||||
29
gdb/inflow.c
29
gdb/inflow.c
@@ -103,35 +103,6 @@ static serial_ttystate initial_gdb_ttystate;
|
||||
|
||||
static struct terminal_info *get_inflow_inferior_data (struct inferior *);
|
||||
|
||||
/* RAII class used to ignore SIGTTOU in a scope. */
|
||||
|
||||
class scoped_ignore_sigttou
|
||||
{
|
||||
public:
|
||||
scoped_ignore_sigttou ()
|
||||
{
|
||||
#ifdef SIGTTOU
|
||||
if (job_control)
|
||||
m_osigttou = signal (SIGTTOU, SIG_IGN);
|
||||
#endif
|
||||
}
|
||||
|
||||
~scoped_ignore_sigttou ()
|
||||
{
|
||||
#ifdef SIGTTOU
|
||||
if (job_control)
|
||||
signal (SIGTTOU, m_osigttou);
|
||||
#endif
|
||||
}
|
||||
|
||||
DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou);
|
||||
|
||||
private:
|
||||
#ifdef SIGTTOU
|
||||
sighandler_t m_osigttou = NULL;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* While the inferior is running, we want SIGINT and SIGQUIT to go to the
|
||||
inferior only. If we have job control, that takes care of it. If not,
|
||||
we save our handlers in these two variables and set SIGINT and SIGQUIT
|
||||
|
||||
31
gdb/inflow.h
31
gdb/inflow.h
@@ -21,5 +21,36 @@
|
||||
#define INFLOW_H
|
||||
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include "common/job-control.h"
|
||||
|
||||
/* RAII class used to ignore SIGTTOU in a scope. */
|
||||
|
||||
class scoped_ignore_sigttou
|
||||
{
|
||||
public:
|
||||
scoped_ignore_sigttou ()
|
||||
{
|
||||
#ifdef SIGTTOU
|
||||
if (job_control)
|
||||
m_osigttou = signal (SIGTTOU, SIG_IGN);
|
||||
#endif
|
||||
}
|
||||
|
||||
~scoped_ignore_sigttou ()
|
||||
{
|
||||
#ifdef SIGTTOU
|
||||
if (job_control)
|
||||
signal (SIGTTOU, m_osigttou);
|
||||
#endif
|
||||
}
|
||||
|
||||
DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou);
|
||||
|
||||
private:
|
||||
#ifdef SIGTTOU
|
||||
sighandler_t m_osigttou = NULL;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif /* inflow.h */
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "gdbcmd.h"
|
||||
#include "common/filestuff.h"
|
||||
#include <termios.h>
|
||||
#include "inflow.h"
|
||||
|
||||
struct hardwire_ttystate
|
||||
{
|
||||
@@ -164,6 +165,9 @@ hardwire_print_tty_state (struct serial *scb,
|
||||
static int
|
||||
hardwire_drain_output (struct serial *scb)
|
||||
{
|
||||
/* Ignore SIGTTOU which may occur during the drain. */
|
||||
scoped_ignore_sigttou ignore_sigttou;
|
||||
|
||||
return tcdrain (scb->fd);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user