This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC][PATCH] GDB kills itself instead of interrupting inferior


Hi! When GDB is run with IO redirected to a pipe, 'interrupt' command
causes it to kill its own process group instead of the inferior. The
problem manifests itself in async mode:

    $ cat | gdb <file>
    (gdb) set target-async on
    (gdb) run &
    (gdb) interrupt
    A debugging session is active.
    Inferior 1 [process 20584] will be killed.
    Quit anyway? (y or n) [answered Y; input not from terminal]

In this case GDB tells that its stdin isn't a tty and doesn't save
inferior process group in `inflow.c:terminal_init_inferior_with_pgrp`
which is wrong. And then when it receives `interrupt` command
it `kill`'s process group 0 in `inf-ptrace.c:inf_ptrace_stop` instead
of inferior process group.

When GDB is used from SublimeGDB (debugging plugin for Sublime Text
editor) that means killing its own process group including Sublime
and possibly X session. There is a corresponding issue in SublimeGDB
bug tracker: https://github.com/quarnster/SublimeGDB/issues/29.

I suppose GDB should save inferior pgid regardless of having its
terminal as pgid is valuable not only to reset foreground process
group, but also to interrupt inferior.

I attach a patch that is supposed to do that. I am very new to GDB
code. Does it look ok?

Cyril--

gdb:

2013-02-13  Cyril Nikolaev  <cyril@nichtverstehen.de>

	* inflow.c (terminal_init_inferior_with_pgrp): Save inferior
	process group regardless of having tty on stdin. Saved pgid
	is used in inferior_process_group().

---
 gdb/inflow.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/gdb/inflow.c b/gdb/inflow.c
index 5146b3a..c5f4f58 100644
--- a/gdb/inflow.c
+++ b/gdb/inflow.c
@@ -217,19 +217,22 @@ static void terminal_ours_1 (int);
 void
 terminal_init_inferior_with_pgrp (int pgrp)
 {
+  struct inferior *inf = current_inferior ();
+  struct terminal_info *tinfo = get_inflow_inferior_data (inf);
+
+#ifdef PROCESS_GROUP_TYPE
+  /* Process group is valuable even without a terminal
+     as it is used not only to reset tty foregroup process group,
+     but also to interrupt inferior. */
+  tinfo->process_group = pgrp;
+#endif
+
   if (gdb_has_a_terminal ())
     {
-      struct inferior *inf = current_inferior ();
-      struct terminal_info *tinfo = get_inflow_inferior_data (inf);
-
       xfree (tinfo->ttystate);
       tinfo->ttystate = serial_copy_tty_state (stdin_serial,
 					       our_terminal_info.ttystate);

-#ifdef PROCESS_GROUP_TYPE
-      tinfo->process_group = pgrp;
-#endif
-
       /* Make sure that next time we call terminal_inferior (which will be
          before the program runs, as it needs to be), we install the new
          process group.  */
--


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]