GDB kills itself instead of interrupting inferior

Cyril Nikolaev cyril@nichtverstehen.de
Sat Apr 13 20:59:00 GMT 2013


Hi! Some time ago I posted a patch fixing the problem of GDB killing
its own process group instead of inferior when its IO is redirected:

http://sourceware.org/ml/gdb-patches/2013-02/msg00399.html

This makes use of GDB with Sublime Text editor on Linux painful
(stopping debugging kills the whole X session sometimes). The problem
was also discussed in SublimeGDB bug tracker:

https://github.com/quarnster/SublimeGDB/issues/29


Anything wrong with the code? I'd be happy to rework the patch to meet
GDB requirements. Or should I better open an issue in BugZilla?

The original message (and patch) follows.

Thanks for your attention.
Cyril

---------- Forwarded message ----------
From: Cyril Nikolaev <cyril@nichtverstehen.de>
Date: Fri, Feb 15, 2013 at 9:34 PM
Subject: [RFC][PATCH] GDB kills itself instead of interrupting inferior
To: gdb-patches@sourceware.org


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.  */
--



More information about the Gdb mailing list