From d65eee73d4e5d1c311affc132d6fe68e525f96bc Mon Sep 17 00:00:00 2001 From: Fred Fish Date: Fri, 3 Apr 1992 19:29:29 +0000 Subject: [PATCH] Fix bug with gdb resending SIGSTOP to an attached process that was forcibly stopped during attach, thus stopping it again. --- gdb/ChangeLog | 8 ++++++++ gdb/procfs.c | 20 +++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b22d187ec85..273f4573a70 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +Fri Apr 3 11:23:03 1992 Fred Fish (fnf@cygnus.com) + + * procfs.c (procinfo struct): Add nopass_next_sigstop member. + * procfs.c (attach): Set nopass_next_sigstop if attached + process is forcibly stopped. + * procfs.c (child_resume): Use nopass_next_sigstop to suppress + resending SIGSTOP to attached process on first resume. + Fri Apr 3 01:37:26 1992 Stu Grossman (grossman at cygnus.com) * Makefile.in (SFILES_MAINDIR): add mipsread.c diff --git a/gdb/procfs.c b/gdb/procfs.c index dd322110482..a53a451e75f 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -77,6 +77,7 @@ struct procinfo { int fd; /* File descriptor for /proc entry */ char *pathname; /* Pathname to /proc entry */ int was_stopped; /* Nonzero if was stopped prior to attach */ + int nopass_next_sigstop; /* Don't pass a sigstop on next resume */ prrun_t prrun; /* Control state when it is run */ prstatus_t prstatus; /* Current process status info */ gregset_t gregset; /* General register set */ @@ -2012,6 +2013,11 @@ attach (pid) close_proc_file (&pi); error ("PIOCSTOP failed"); } + pi.nopass_next_sigstop = 1; + } + else + { + printf ("Ok, gdb will wait for process %u to stop.\n", pid); } } @@ -2386,6 +2392,17 @@ NOTE to be current. One case where this might be necessary is if the user explicitly changes the PC value that gdb considers to be current. FIXME: Investigate if this is necessary or not. + + When attaching to a child process, if we forced it to stop with + a PIOCSTOP, then we will have set the nopass_next_sigstop flag. + Upon resuming the first time after such a stop, we explicitly + inhibit sending it another SIGSTOP, which would be the normal + result of default signal handling. One potential drawback to + this is that we will also ignore any attempt to by the user + to explicitly continue after the attach with a SIGSTOP. Ultimately + this problem should be dealt with by making the routines that + deal with the inferior a little smarter, and possibly even allow + an inferior to continue running at the same time as gdb. (FIXME?) */ void @@ -2396,7 +2413,7 @@ child_resume (step, signo) errno = 0; pi.prrun.pr_flags = PRSVADDR | PRSTRACE | PRSFAULT | PRCFAULT; pi.prrun.pr_vaddr = (caddr_t) *(int *) ®isters[REGISTER_BYTE (PC_REGNUM)]; - if (signo) + if (signo && !(signo == SIGSTOP && pi.nopass_next_sigstop)) { set_proc_siginfo (&pi, signo); } @@ -2404,6 +2421,7 @@ child_resume (step, signo) { pi.prrun.pr_flags |= PRCSIG; } + pi.nopass_next_sigstop = 0; if (step) { pi.prrun.pr_flags |= PRSTEP; -- 2.30.2