This is the mail archive of the
gdb@sourceware.org
mailing list for the GDB project.
GDB kills itself instead of interrupting inferior
- From: Cyril Nikolaev <cyril at nichtverstehen dot de>
- To: gdb at sourceware dot org
- Date: Sun, 14 Apr 2013 00:58:50 +0400
- Subject: GDB kills itself instead of interrupting inferior
- References: <CAMx6oW7asrxWqsZZB1Ej6FAwmmP0y8KOHm8zYeV6ACe-cK_rsw at mail dot gmail dot com>
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. */
--