This is the mail archive of the gdb-cvs@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]

[binutils-gdb] Set general_thread after restart


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=51aee833ed9c6bd67b0c0e4a8c7098a549e3d16d

commit 51aee833ed9c6bd67b0c0e4a8c7098a549e3d16d
Author: Yao Qi <yao.qi@linaro.org>
Date:   Fri Jul 24 14:40:34 2015 +0100

    Set general_thread after restart
    
    When I run gdb.server/ext-restart.exp, I get the following GDB internal
    error,
    
    run^M
    The program being debugged has been started already.^M
    Start it from the beginning? (y or n) y^M
    Sending packet: $vKill;53c5#3d...Packet received: OK^M
    Packet vKill (kill) is supported^M
    Sending packet: $vFile:close:6#b6...Packet received: F0^M
    Sending packet: $vFile:close:3#b3...Packet received: F0^M
    Starting program: /scratch/yao/gdb/build-git/x86_64/gdb/testsuite/gdb.server/ext-restart ^M
    Sending packet: $QDisableRandomization:1#cf...Packet received: OK^M
    Sending packet: $R0#82...Sending packet: $qC#b4...Packet received: QCp53c5.53c5^M  <-- [1]
    Sending packet: $qAttached:53c5#c9...Packet received: E01^M
    warning: Remote failure reply: E01^M
    ....
    0x00002aaaaaaac2d0 in ?? () from target:/lib64/ld-linux-x86-64.so.2^M
    /home/yao/SourceCode/gnu/gdb/git/gdb/thread.c:88: internal-error: inferior_thread: Assertion `tp' failed.^M
    A problem internal to GDB has been detected,^M
    further debugging may prove unreliable.^M
    Quit this debugging session? (y or n) FAIL: gdb.server/ext-restart.exp: run to main (GDB internal error)
    Resyncing due to internal error.
    
    the test is to restart the program, to make sure GDBserver handles
    packet 'R' correctly.  From the GDBserver output, we can see,
    
     Remote debugging from host 127.0.0.1^M
     Process /scratch/yao/gdb/build-git/x86_64/gdb/testsuite/gdb.server/ext-restart created; pid = 21445^M
     GDBserver restarting^M
     Process /scratch/yao/gdb/build-git/x86_64/gdb/testsuite/gdb.server/ext-restart created; pid = 21446^M
     Killing process(es): 21446
    
    we first start process 21445(0x53c5), kill it and restart a new process
    21446.  However, in the gdb output above [1], we can see that the reply
    of qC is still the old process id rather than the new one.  Looks
    general_thread isn't up to date after GDBserver receives R packet.
    This patch is to update general_thread after call start_inferior.
    
    gdb/gdbserver:
    
    2015-07-24  Yao Qi  <yao.qi@linaro.org>
    
    	* server.c (process_serial_event): Set general_thread.
    
    gdb/testsuite:
    
    2015-07-24  Yao Qi  <yao.qi@linaro.org>
    
    	* gdb.server/ext-restart.exp: New file.

Diff:
---
 gdb/gdbserver/ChangeLog                  |  4 ++
 gdb/gdbserver/server.c                   | 15 +++++++-
 gdb/testsuite/ChangeLog                  |  4 ++
 gdb/testsuite/gdb.server/ext-restart.exp | 65 ++++++++++++++++++++++++++++++++
 4 files changed, 87 insertions(+), 1 deletion(-)

diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 6ae5e69..72277c1 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,7 @@
+2015-07-24  Yao Qi  <yao.qi@linaro.org>
+
+	* server.c (process_serial_event): Set general_thread.
+
 2015-07-21  Yao Qi  <yao.qi@linaro.org>
 
 	* linux-aarch64-low.c (aarch64_arch_setup): Remove code and call
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 7e388dd..fd5f6dc 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -4112,7 +4112,20 @@ process_serial_event (void)
 
 	  /* Wait till we are at 1st instruction in prog.  */
 	  if (program_argv != NULL)
-	    start_inferior (program_argv);
+	    {
+	      start_inferior (program_argv);
+	      if (last_status.kind == TARGET_WAITKIND_STOPPED)
+		{
+		  /* Stopped at the first instruction of the target
+		     process.  */
+		  general_thread = last_ptid;
+		}
+	      else
+		{
+		  /* Something went wrong.  */
+		  general_thread = null_ptid;
+		}
+	    }
 	  else
 	    {
 	      last_status.kind = TARGET_WAITKIND_EXITED;
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index f92f5b5..a7938f1 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,9 @@
 2015-07-24  Yao Qi  <yao.qi@linaro.org>
 
+	* gdb.server/ext-restart.exp: New file.
+
+2015-07-24  Yao Qi  <yao.qi@linaro.org>
+
 	* lib/gdbserver-support.exp (gdbserver_start_extended): Add
 	argument options.
 	* gdb.server/ext-wrapper.exp: New file.
diff --git a/gdb/testsuite/gdb.server/ext-restart.exp b/gdb/testsuite/gdb.server/ext-restart.exp
new file mode 100644
index 0000000..6995796
--- /dev/null
+++ b/gdb/testsuite/gdb.server/ext-restart.exp
@@ -0,0 +1,65 @@
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2015 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test restarting programs with the R packet.
+
+load_lib gdbserver-support.exp
+
+standard_testfile server.c
+
+if { [skip_gdbserver_tests] } {
+    return 0
+}
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile debug] } {
+    return -1
+}
+
+# Make sure we're disconnected, in case we're testing with an
+# extended-remote board, therefore already connected.
+gdb_test "disconnect" ".*"
+
+set target_exec [gdbserver_download_current_prog]
+gdbserver_start_extended
+
+gdb_test_no_output "set remote exec-file $target_exec" "set remote exec-file"
+
+gdb_breakpoint main
+gdb_test "run" "Breakpoint.* main .*" "run to main"
+
+# Restart the process.
+with_test_prefix "restart" {
+    # Disable vRun packet and clear remote exec-file, so that GDB will
+    # use R packet to restart the process.
+    gdb_test_no_output "set remote run-packet off"
+    gdb_test_no_output "set remote exec-file"
+
+    set test "run to main"
+    gdb_test_multiple "run" $test {
+	-re {Start it from the beginning\? \(y or n\) $} {
+	    send_gdb "y\n"
+	    exp_continue
+	}
+	-re "Breakpoint.* main .*\r\n$gdb_prompt $" {
+	    pass $test
+	}
+    }
+}
+
+gdb_test "kill" "" "kill" "Kill the program being debugged.*" "y"
+
+gdb_test_no_output "monitor exit"


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