diff options
author | Pedro Alves <palves@redhat.com> | 2014-09-11 13:04:15 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2014-09-11 13:08:21 +0100 |
commit | 98880d46bdb1e88db447f876a8ac1f2a4de97dae (patch) | |
tree | 75090eec406fd8e71498ad3d4d0f954c676dfb32 /gdb/main.c | |
parent | 4c92ff2c35392b68ee9172af979483b32aaa3d7b (diff) | |
download | binutils-gdb-98880d46bdb1e88db447f876a8ac1f2a4de97dae.tar.gz |
gdb/17347 - Regression: GDB stopped on run with attached process
Doing:
gdb --pid=PID -ex run
Results in GDB getting a SIGTTIN, and thus ending stopped. That's
usually indicative of a missing target_terminal_ours call.
E.g., from the PR:
$ sleep 1h & p=$!; sleep 0.1; gdb -batch sleep $p -ex run
[1] 28263
[1] Killed sleep 1h
[2]+ Stopped gdb -batch sleep $p -ex run
The workaround is doing:
gdb -ex "attach $PID" -ex "run"
instead of
gdb [-p] $PID -ex "run"
With the former, gdb waits for the attach command to complete before
moving on to the "run" command, because the interpreter is in sync
mode at this point, within execute_command. But for the latter,
attach_command is called directly from captured_main, and thus misses
that waiting. IOW, "run" is running before the attach continuation
has run, before the program stops and attach completes. The broken
terminal settings are just one symptom of that. Any command that
queries or requires input results in the same.
The fix is to wait in catch_command_errors (which is specific to
main.c nowadays), just like we wait in execute_command.
gdb/ChangeLog:
2014-09-11 Pedro Alves <palves@redhat.com>
PR gdb/17347
* main.c: Include "infrun.h".
(catch_command_errors, catch_command_errors_const): Wait for the
foreground command to complete.
* top.c (maybe_wait_sync_command_done): New function, factored out
from ...
(maybe_wait_sync_command_done): ... here.
* top.h (maybe_wait_sync_command_done): New declaration.
gdb/testsuite/ChangeLog:
2014-09-11 Pedro Alves <palves@redhat.com>
PR gdb/17347
* lib/gdb.exp (gdb_spawn_with_cmdline_opts): New procedure.
* gdb.base/attach.exp (test_command_line_attach_run): New
procedure.
(top level): Call it.
Diffstat (limited to 'gdb/main.c')
-rw-r--r-- | gdb/main.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/gdb/main.c b/gdb/main.c index 12f0146e3b9..756dd4fadb3 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -45,6 +45,7 @@ #include "filestuff.h" #include <signal.h> #include "event-top.h" +#include "infrun.h" /* The selected interpreter. This will be used as a set command variable, so it should always be malloc'ed - since @@ -369,7 +370,11 @@ catch_command_errors (catch_command_errors_ftype *command, TRY_CATCH (e, mask) { + int was_sync = sync_execution; + command (arg, from_tty); + + maybe_wait_sync_command_done (was_sync); } return handle_command_errors (e); } @@ -388,7 +393,11 @@ catch_command_errors_const (catch_command_errors_const_ftype *command, TRY_CATCH (e, mask) { + int was_sync = sync_execution; + command (arg, from_tty); + + maybe_wait_sync_command_done (was_sync); } return handle_command_errors (e); } |