]> code.ossystems Code Review - openembedded-core.git/commitdiff
gdb: gdbserver: update ctrl-c handling
authorZhixiong Chi <zhixiong.chi@windriver.com>
Wed, 19 Sep 2018 02:26:35 +0000 (19:26 -0700)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 20 Sep 2018 12:41:25 +0000 (05:41 -0700)
A) gdbserver sends SIGINT not to the process, but to the process
group (-signal_pid). But the attached process is not always a
process group leader. If not, "kill (-signal_pid, SIGINT)" returns
error and fails to interrupt the attached process. We cannot interrupt
the process attached with gdbserver who is not a process group leader.

This problem was created by the gdb upstream commit 78708b7c8c
The commit fixed the following case B) bug.
B) We cannot interrupt the process attached with gdbserver whose
main thread exits (pthread_exit()).

Now this patch can solve both A) and B).

Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
meta/recipes-devtools/gdb/gdb-8.2.inc
meta/recipes-devtools/gdb/gdb/gdbserver-ctrl-c-handling.patch [new file with mode: 0644]

index 999fdde0312c12d9920986063d4280587b0837a7..dfb0059123eedf4ce0379c9b3a875170dd5005e5 100644 (file)
@@ -16,6 +16,7 @@ SRC_URI = "http://ftp.gnu.org/gnu/gdb/gdb-${PV}.tar.xz \
            file://0009-Change-order-of-CFLAGS.patch \
            file://0010-resolve-restrict-keyword-conflict.patch \
            file://0011-Fix-invalid-sigprocmask-call.patch \
+           file://gdbserver-ctrl-c-handling.patch \
 "
 SRC_URI[md5sum] = "b5a49dbff00d9a87fbe114d14b3101c0"
 SRC_URI[sha256sum] = "c3a441a29c7c89720b734e5a9c6289c0a06be7e0c76ef538f7bbcef389347c39"
diff --git a/meta/recipes-devtools/gdb/gdb/gdbserver-ctrl-c-handling.patch b/meta/recipes-devtools/gdb/gdb/gdbserver-ctrl-c-handling.patch
new file mode 100644 (file)
index 0000000..dffb0dd
--- /dev/null
@@ -0,0 +1,26 @@
++This problem was created by the upstream commit 78708b7c8c
++After applying the commit, it will send SIGINT to the process group(-signal_pid).
++But if we use gdbserver send SIGINT, and the attached process is not a process
++group leader, then the "kill (-signal_pid, SIGINT)" returns error and fails  to
++interrupt the attached process.
++
++Upstream-Status: Submitted
++[https://sourceware.org/bugzilla/show_bug.cgi?id=18945]
++
++Author: Josh Gao
++Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com>
+Index: gdb-8.2/gdb/gdbserver/linux-low.c
+===================================================================
+--- gdb-8.2.orig/gdb/gdbserver/linux-low.c
++++ gdb-8.2/gdb/gdbserver/linux-low.c
+@@ -5940,9 +5940,7 @@ linux_look_up_symbols (void)
+ static void
+ linux_request_interrupt (void)
+ {
+-  /* Send a SIGINT to the process group.  This acts just like the user
+-     typed a ^C on the controlling terminal.  */
+-  kill (-signal_pid, SIGINT);
++  kill (signal_pid, SIGINT);
+ }
+ /* Copy LEN bytes from inferior's auxiliary vector starting at OFFSET