public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] Switch the inferior before outputting its id in "info inferiors"
@ 2020-01-10 20:10 Pedro Alves
  0 siblings, 0 replies; only message in thread
From: Pedro Alves @ 2020-01-10 20:10 UTC (permalink / raw)
  To: gdb-cvs

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

commit d9ebdab754fac0e9a4e4046a550a3e89cf5c2699
Author: Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Date:   Fri Jan 10 20:06:17 2020 +0000

    Switch the inferior before outputting its id in "info inferiors"
    
    GDB uses the 'current_top_target' when displaying the description of
    an inferior.  This leads to same target being used for each inferior
    and, in turn, yields incorrect output when the inferior has a target
    that is supposed to give a specialized output.  For instance, the
    remote target outputs "Remote target" instead of "process XYZ" as the
    description if the multi-process feature is not supported or turned
    off.
    
    E.g.: Suppose we have a native and a remote target, and the native is
    the current inferior.  The remote target does not support multi-process.
    For "info inferiors", we would expect to see:
    
    ~~~
    (gdb) i inferiors
      Num  Description       Connection       Executable
    * 1    process 29060     1 (native)       /a/path
      2    Remote target     2 (remote ...)
    ~~~
    
    but instead we get
    
    ~~~
    (gdb) i inferiors
      Num  Description       Connection       Executable
    * 1    process 29060     1 (native)       /a/path
      2    process 42000     2 (remote ...)
    ~~~
    
    Similarly, if the current inferior is the remote one, we would expect
    to see
    
    ~~~
    (gdb) i inferiors
      Num  Description       Connection       Executable
      1    process 29060     1 (native)       /a/path
    * 2    Remote target     2 (remote ...)
    ~~~
    
    but we get
    
    ~~~
    (gdb) i inferiors
      Num  Description       Connection       Executable
    * 1    Remote target     1 (native)       /a/path
      2    Remote target     2 (remote ...)
    ~~~
    
    With this patch, we switch to the inferior when outputting its
    description, so that the current_top_target will be aligned to the
    inferior we are displaying.
    
    For testing, this patch expands the "info inferiors" test for the
    multi-target feature.  The test was checking for the output of the
    info commands after setup, only when the current inferior is the last
    added inferior.
    
    This patch does the following to the testcase:
    
    1. The "info inferiors" and "info connections" test is extracted out
       from the "setup" procedure to a separate procedure.
    
    2. The test is enriched to check the output after switching to each
       inferior, not just the last one.
    
    3. The test is performed twice; one for when the multi-process feature
       is turned on, one for off.
    
    gdb/ChangeLog:
    2020-01-10  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
    
    	* inferior.c (print_inferior): Switch inferior before printing it.
    
    gdb/testsuite/ChangeLog:
    2020-01-10  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
    
    	* gdb.multi/multi-target.exp (setup): Factor out "info
    	connections" and "info inferiors" tests to ...
    	(test_info_inferiors): ... this new procedure.
    	(top level): Run new "info-inferiors" tests.

Diff:
---
 gdb/ChangeLog                            |   4 ++
 gdb/inferior.c                           |  11 ++-
 gdb/testsuite/ChangeLog                  |   7 ++
 gdb/testsuite/gdb.multi/multi-target.exp | 113 +++++++++++++++++++++++--------
 4 files changed, 107 insertions(+), 28 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 3eae3e1..ed2856c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2020-01-10  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
+
+	* inferior.c (print_inferior): Switch inferior before printing it.
+
 2020-01-10  Aleksandar Paunovic  <aleksandar.paunovic@intel.com>
 	    Pedro Alves  <palves@redhat.com>
 
diff --git a/gdb/inferior.c b/gdb/inferior.c
index 3ce4386..eb090df 100644
--- a/gdb/inferior.c
+++ b/gdb/inferior.c
@@ -494,6 +494,11 @@ print_inferior (struct ui_out *uiout, const char *requested_inferiors)
   uiout->table_header (17, ui_left, "exec", "Executable");
 
   uiout->table_body ();
+
+  /* Restore the current thread after the loop because we switch the
+     inferior in the loop.  */
+  scoped_restore_current_pspace_and_thread restore_pspace_thread;
+  inferior *current_inf = current_inferior ();
   for (inferior *inf : all_inferiors ())
     {
       if (!number_is_in_list (requested_inferiors, inf->num))
@@ -501,13 +506,17 @@ print_inferior (struct ui_out *uiout, const char *requested_inferiors)
 
       ui_out_emit_tuple tuple_emitter (uiout, NULL);
 
-      if (inf == current_inferior ())
+      if (inf == current_inf)
 	uiout->field_string ("current", "*");
       else
 	uiout->field_skip ("current");
 
       uiout->field_signed ("number", inf->num);
 
+      /* Because target_pid_to_str uses current_top_target,
+	 switch the inferior.  */
+      switch_to_inferior_no_thread (inf);
+
       uiout->field_string ("target-id", inferior_pid_to_str (inf->pid));
 
       std::string conn = uiout_field_connection (inf->process_target ());
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 13ccadb..e83e219 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2020-01-10  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
+
+	* gdb.multi/multi-target.exp (setup): Factor out "info
+	connections" and "info inferiors" tests to ...
+	(test_info_inferiors): ... this new procedure.
+	(top level): Run new "info-inferiors" tests.
+
 2020-01-10  Pedro Alves  <palves@redhat.com>
 
 	* gdb.server/bkpt-other-inferior.exp: New file.
diff --git a/gdb/testsuite/gdb.multi/multi-target.exp b/gdb/testsuite/gdb.multi/multi-target.exp
index 903831c..3588eb4 100644
--- a/gdb/testsuite/gdb.multi/multi-target.exp
+++ b/gdb/testsuite/gdb.multi/multi-target.exp
@@ -137,33 +137,6 @@ proc setup {non-stop} {
 	return 0
     }
 
-    set ws "\[ \t\]+"
-    global decimal
-
-    # Test "info connections" and "info inferior"'s "Connection"
-    # column, while at it.
-
-    gdb_test "info connections" \
-	[multi_line \
-	     "Num${ws}What${ws}Description${ws}" \
-	     "  1${ws}native${ws}Native process${ws}" \
-	     "  2${ws}extended-remote localhost:$decimal${ws}Extended remote serial target in gdb-specific protocol${ws}" \
-	     "  3${ws}core${ws}Local core dump file${ws}" \
-	     "  4${ws}extended-remote localhost:$decimal${ws}Extended remote serial target in gdb-specific protocol${ws}" \
-	   "\\* 5${ws}core${ws}Local core dump file${ws}" \
-	    ]
-
-    gdb_test "info inferiors" \
-	[multi_line \
-	     "Num${ws}Description${ws}Connection${ws}Executable${ws}" \
-	     "  1${ws}process ${decimal}${ws}1 \\(native\\)${ws}${binfile}${ws}" \
-	     "  2${ws}process ${decimal}${ws}2 \\(extended-remote localhost:$decimal\\)${ws}${binfile}${ws}" \
-	     "  3${ws}process ${decimal}${ws}3 \\(core\\)${ws}${binfile}${ws}" \
-	     "  4${ws}process ${decimal}${ws}1 \\(native\\)${ws}${binfile}${ws}" \
-	     "  5${ws}process ${decimal}${ws}4 \\(extended-remote localhost:$decimal\\)${ws}${binfile}${ws}" \
-	   "\\* 6${ws}process ${decimal}${ws}5 \\(core\\)${ws}${binfile}${ws}" \
-	    ]
-
     # For debugging.
     gdb_test "info threads" ".*"
 
@@ -365,6 +338,85 @@ proc test_ping_pong_next {} {
     }
 }
 
+# Test "info inferiors" and "info connections".  MULTI_PROCESS
+# indicates whether the multi-process feature of remote targets is
+# turned off or on.
+proc test_info_inferiors {multi_process} {
+    setup "off"
+
+    gdb_test_no_output \
+	"set remote multiprocess-feature-packet $multi_process"
+
+    # Get the description for inferior INF for when the current
+    # inferior id is CURRENT.
+    proc inf_desc {inf current} {
+	set ws "\[ \t\]+"
+	global decimal
+	upvar multi_process multi_process
+
+	if {($multi_process == "off") && ($inf == 2 || $inf == 5)} {
+	    set desc "Remote target"
+	} else {
+	    set desc "process ${decimal}"
+	}
+
+	set desc "${inf}${ws}${desc}${ws}"
+	if {$inf == $current} {
+	    return "\\* $desc"
+	} else {
+	    return "  $desc"
+	}
+    }
+
+    # Get the "Num" column for CONNECTION for when the current
+    # inferior id is CURRENT_INF.
+    proc connection_num {connection current_inf} {
+	switch $current_inf {
+	    "4" { set current_connection "1"}
+	    "5" { set current_connection "4"}
+	    "6" { set current_connection "5"}
+	    default { set current_connection $current_inf}
+	}
+	if {$connection == $current_connection} {
+	    return "\\* $connection"
+	} else {
+	    return "  $connection"
+	}
+    }
+
+    set ws "\[ \t\]+"
+    global decimal binfile
+
+    # Test "info connections" and "info inferior" by switching to each
+    # inferior one by one.
+    for {set inf 1} {$inf <= 6} {incr inf} {
+	with_test_prefix "inferior $inf" {
+	    gdb_test "inferior $inf" "Switching to inferior $inf.*"
+
+	    gdb_test "info connections" \
+		[multi_line \
+		     "Num${ws}What${ws}Description${ws}" \
+		     "[connection_num 1 $inf]${ws}native${ws}Native process${ws}" \
+		     "[connection_num 2 $inf]${ws}extended-remote localhost:$decimal${ws}Extended remote serial target in gdb-specific protocol${ws}" \
+		     "[connection_num 3 $inf]${ws}core${ws}Local core dump file${ws}" \
+		     "[connection_num 4 $inf]${ws}extended-remote localhost:$decimal${ws}Extended remote serial target in gdb-specific protocol${ws}" \
+		     "[connection_num 5 $inf]${ws}core${ws}Local core dump file${ws}" \
+		    ]
+
+	    gdb_test "info inferiors" \
+		[multi_line \
+		     "Num${ws}Description${ws}Connection${ws}Executable${ws}" \
+		     "[inf_desc 1 $inf]1 \\(native\\)${ws}${binfile}${ws}" \
+		     "[inf_desc 2 $inf]2 \\(extended-remote localhost:$decimal\\)${ws}${binfile}${ws}" \
+		     "[inf_desc 3 $inf]3 \\(core\\)${ws}${binfile}${ws}" \
+		     "[inf_desc 4 $inf]1 \\(native\\)${ws}${binfile}${ws}" \
+		     "[inf_desc 5 $inf]4 \\(extended-remote localhost:$decimal\\)${ws}${binfile}${ws}" \
+		     "[inf_desc 6 $inf]5 \\(core\\)${ws}${binfile}${ws}" \
+		    ]
+	}
+    }
+}
+
 # Make a core file with two threads upfront.  Several tests load the
 # same core file.
 prepare_core
@@ -385,3 +437,10 @@ with_test_prefix "interrupt" {
 with_test_prefix "ping-pong" {
     test_ping_pong_next
 }
+
+# Test "info inferiors" and "info connections" commands.
+with_test_prefix "info-inferiors" {
+    foreach_with_prefix multi_process {"on" "off"} {
+	test_info_inferiors $multi_process
+    }
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-01-10 20:10 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-10 20:10 [binutils-gdb] Switch the inferior before outputting its id in "info inferiors" Pedro Alves

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).