public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM]  scox/strace: Send both stopped thread and general thread to syscall clients.
@ 2017-01-02 23:36 scox
  0 siblings, 0 replies; only message in thread
From: scox @ 2017-01-02 23:36 UTC (permalink / raw)
  To: archer-commits

The branch, scox/strace has been updated
       via  d9fbfc03d6950e913fb10b3ccdfd70499b7f331b (commit)
      from  2020670cfec28db64144a510f0bac8a32b99a8f6 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit d9fbfc03d6950e913fb10b3ccdfd70499b7f331b
Author: Stan Cox <scox@redhat.com>
Date:   Mon Jan 2 18:30:07 2017 -0500

    Send both stopped thread and general thread to syscall clients.
    
    	* server.c (handle_general_set): Revert to original catch syscall
    	protocol.
    	* server.h: Likewise.
    	* linux-low.c (gdb_catch_this_syscall_p):  Likewise.
    	* remote-utils.c (prepare_resume_reply): Include general thread as
    	a stop reply component for syscalls.

-----------------------------------------------------------------------

Summary of changes:
 gdb/contrib/gdbrp-dump.py                 |   92 ++++++++++++--------
 gdb/gdbserver/ChangeLog                   |    9 ++
 gdb/gdbserver/linux-low.c                 |   28 ++-----
 gdb/gdbserver/remote-utils.c              |   10 ++
 gdb/gdbserver/server.c                    |   27 +++---
 gdb/gdbserver/server.h                    |    5 +-
 gdb/testsuite/ChangeLog                   |    5 +
 gdb/testsuite/gdb.server/multi-client.exp |  138 ++++++++++++++++++++++------
 gdb/testsuite/gdb.server/strace-threads.c |   70 ++++++--------
 9 files changed, 238 insertions(+), 146 deletions(-)

First 500 lines of diff:
diff --git a/gdb/contrib/gdbrp-dump.py b/gdb/contrib/gdbrp-dump.py
index f2d1d46..400ff5f 100755
--- a/gdb/contrib/gdbrp-dump.py
+++ b/gdb/contrib/gdbrp-dump.py
@@ -32,6 +32,7 @@ import sys
 import binascii
 import chardet
 import re
+import os.path
 from commands import getstatusoutput
 
 executable = ""
@@ -41,6 +42,7 @@ want_lineno = True
 hexchars = (['a', 'c', 'b', 'e', 'd', 'f', '1', '0', '3', '2', '5', '4', '7', '6', '9', '8'])
 addr_map = list()
 verbose = False
+brief = False
 multi_client = False
 
 # Convert arg substring starting at s ending at e to big endian
@@ -79,7 +81,7 @@ def print_rip(regval, eol):
     base_addr = 0
     base_obj = ""
 
-    if len(regval) == 0:
+    if len(regval) == 0 or regval[0:2] == 'xx':
         return
     address = int(str('0x' + regval), 16)
     if len(executable) > 0:
@@ -114,10 +116,13 @@ def print_rip(regval, eol):
 
 def print_register(regno, field, begin, end):
     regval = big_endian(field, begin, end)
-    if register(regno) == "rip":
-        print_rip(regval, False)
-    else:
-        print register(regno), "=", regval,
+    try:
+        if register(regno) == "rip":
+            print_rip(regval, False)
+        else:
+            print register(regno), "=", regval,
+    except ValueError:
+        print "XX"
 
 
 def dump_registers(arg):
@@ -151,6 +156,27 @@ def dump_memory(arg):
             print prefix,
     print
 
+def print_pid(arg):
+    ti = 0
+    if arg.find("/") > 0:
+        arg = arg[0:arg.find("/")].rstrip()
+    pid = arg.split(".")
+    if len(pid) > 1:
+        if pid[0][0:1] == "p":
+            print "pid=%s/%d" % (pid[0][1:], int(pid[0][1:], 16)),
+        elif pid[0] == "-1":
+            print "pid=*",
+        else:
+            print "pid=%s/%d" % (pid[0][0:],int("0x" + pid[0][0:], 16)),
+        ti = 1
+    if pid[ti] == "-1":
+        print " tid=*",
+    else:
+        try:
+            print " tid=%s/%d" % (pid[ti], int(pid[ti],16))
+        except ValueError:
+            print " xxx"
+
 # Dump the packet that is sent from the client
 
 def dump_client_packet(line):
@@ -339,6 +365,10 @@ def dump_client_packet(line):
                 if argidx == len(args):
                     break
                 arg = args[argidx]
+                if arg.find("/") > 0:
+                    arg = arg[0:arg.find("/")].rstrip()
+                else:
+                    arg = arg.rstrip()
                 if a == "action":
                     print a, "=",
                     if arg[0] == "c":
@@ -353,28 +383,9 @@ def dump_client_packet(line):
                         argidx += 1
                         print "range step %s-%s" % (arg[1:], args[argidx]),
                 elif a == "thread-id":
-                    pid = arg.split(".")
-                    if len(pid) > 1:
-                        print "pid =",
-                        if pid[0][0:1] == "p":
-                            print pid[0][0:],
-                        elif pid[0] == "-1":
-                            print "*",
-                        else:
-                            print "pid =", int("0x" + pid[0][0:], 16),
-                        ti = 1
-                    else:
-                        ti = 0
-                    print "tid =",
-                    if pid[ti] == "-1":
-                        print "*",
-                    else:
-                        print pid[ti],
+                    print "Thread:" ,
+                    print_pid (arg)
                 elif a == "symbol-name":
-                    if arg.find("/") > 0:
-                        arg = arg[0:arg.find("/")].rstrip()
-                    else:
-                        arg = arg.rstrip()
                     if len(arg) > 1:
                         idx = len(arg)
                         if idx % 2 > 0:
@@ -390,8 +401,6 @@ def dump_client_packet(line):
                     else:
                         if arg.find("...") > 0:
                             arg = arg[0:arg.find("...")]
-                    if arg.find("/") > 0:
-                        arg = arg[0:arg.find("/")]
                     print a, "=", arg,
                 argidx = argidx + 1
             print
@@ -432,14 +441,17 @@ def dump_server_packet(line, last_request):
     if args[0][0] == 'T' or args[0][0] == 'S':
         if args[0][0] == 'S':
             args[0] = args[0][5:]
-        print dsp_prefix, "packet reply: signal=", signal(int(args[0][1:3], 16)),
+            try:
+                print dsp_prefix, "packet reply: signal=", signal(int(args[0][1:3], 16)),
+            except ValueError:
+                pass
         subargs = args[0].split(':')
         print
         print dsp_prefix,
         try:
             if args[0][3:5] == "sy":
-                status, text = getstatusoutput('grep " ' + str(int(subargs[1], 16)) + '$" /usr/include/asm/unistd_64.h')
-                print text[8:],
+                status, text = getstatusoutput('grep "_NR_.* ' + str(int(subargs[1], 16)) + '$" /usr/include/asm/unistd_64.h')
+                print text[text.find("#define ")+8:],
             elif args[0][3:5] == "wa":
                 print "watch =", subargs[1],
             else:
@@ -457,8 +469,9 @@ def dump_server_packet(line, last_request):
                 continue
             subargs = a.split(':')
             if subargs[0] == "thread":
-                print dsp_prefix, "Thread:", subargs[1],
-            else:
+                print dsp_prefix,"Thread:" ,
+                print_pid (subargs[1])
+            elif a[0:2].isdigit():
                 print dsp_prefix,
                 print_register(a[0:2], subargs[1], 0, 0)
                 print
@@ -487,15 +500,15 @@ def print_this_line(aline):
 
     if aline.find("readahead cache") >= 0:
         return False
+    if verbose:
+        return True
     if aline.find("getpkt") >= 0 or aline.find("putpkt") >= 0 or aline.find("Sending packet") >= 0:
         return True
-    if multi_client:
+    if multi_client and not brief:
         if re.match("^ *[*]*[0-9][0-9]* LWP", aline, flags=0):
             return True
         elif re.match("^ *\*\* client state", aline, flags=0):
             return True
-    elif verbose:
-        return True
     return False
 
 # Decode a packet.  The encoding scheme is described in: info gdb.info 'remote p' overview
@@ -533,6 +546,7 @@ def usage(comment):
 
 def main():
     global verbose
+    global brief
     global want_lineno
     global red_shift
     global multi_client
@@ -548,11 +562,13 @@ def main():
 
     argn = 1
     logname = ""
-    proc_map = "/tmp/proc-map"
+    proc_map = ""
 
     while argn < len(sys.argv):
         if sys.argv[argn] == "--verbose" or sys.argv[argn] == "-v":
             verbose = True
+        elif sys.argv[argn] == "--brief" or sys.argv[argn] == "-b":
+            brief = True
         elif sys.argv[argn] == "--no-color":
             red_shift = ""
         elif sys.argv[argn] == "--no-lineno":
@@ -569,6 +585,8 @@ def main():
 
     # Create address mapping file
 
+    if len(proc_map) == 0:
+        proc_map = os.path.dirname (logname) + "/client-map"
     try:
         logfile = open(proc_map)
         for line in logfile:
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 1e32722..bcb6681 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,12 @@
+2017-01-02  Stan Cox  <scox@redhat.com>
+
+	* server.c (handle_general_set): Revert to original catch syscall
+	protocol.
+	* server.h: Likewise.
+	* linux-low.c (gdb_catch_this_syscall_p):  Likewise.
+	* remote-utils.c (prepare_resume_reply): Include general thread as
+	a stop reply component for syscalls.
+
 2016-10-23  Stan Cox  <scox@redhat.com>
 
 	* server.c (set_client_state): Transfer initial commandline info.
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 9262e4b..d771182 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -3191,37 +3191,23 @@ gdb_catch_this_syscall_p (struct lwp_info *event_child)
   int sysno;
   struct thread_info *thread = get_lwp_thread (event_child);
   struct process_info *proc = get_thread_process (thread);
-  ptid thread_ptid = thread_to_gdb_id (thread);
-  ptid proc_ptid = ptid_of (proc);
 
   if (VEC_empty (int, proc->syscalls_to_catch))
     return 0;
+
   if (VEC_index (int, proc->syscalls_to_catch, 0) == NO_SYSCALL)
     return 0;
+  
+  if (VEC_index (int, proc->syscalls_to_catch, 0) == ANY_SYSCALL)
+    return 1;
 
   get_syscall_trapinfo (event_child, &sysno);
-
-  /* (FOLLOW,SYSCALL1,...,SYSCALLN) OR (FOLLOW,ANY) OR (ANY) */
-  if (VEC_index (int, proc->syscalls_to_catch, 0) != FOLLOW_CHILD
-      && (ptid_get_pid (thread_ptid) != ptid_get_pid (proc_ptid)
-	  || ptid_get_lwp (thread_ptid) != ptid_get_pid (thread_ptid)))
-      return 0;
-
   for (i = 0;
        VEC_iterate (int, proc->syscalls_to_catch, i, iter);
        i++)
-    switch (iter)
-      {
-      case FOLLOW_CHILD:
-	break;
-      case ANY_SYSCALL:
-	return 1;
-	break;
-      default:
-	if (iter == sysno)
-	  return 1;
-      }
-  
+    if (iter == sysno)
+      return 1;
+
   return 0;
 }
 
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index ed9ecbd..f1064bb 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -1271,6 +1271,16 @@ prepare_resume_reply (char *buf, ptid_t ptid,
 		buf = write_ptid (buf, ptid);
 		strcat (buf, ";");
 		buf += strlen (buf);
+		if (non_stop
+		    && (status->kind == TARGET_WAITKIND_SYSCALL_ENTRY
+			|| status->kind == TARGET_WAITKIND_SYSCALL_RETURN))
+		  {
+		    sprintf (buf, "thread:");
+		    buf += strlen (buf);
+		    buf = write_ptid (buf, general_thread);
+		    strcat (buf, ";");
+		    buf += strlen (buf);
+		  }
 
 		core = target_core_of_thread (ptid);
 
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 050c629..f79ce10 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -167,6 +167,7 @@ set_client_state (gdb_fildes_t fd)
   cs->packet_type = other_packet;
   cs->last_packet_type = other_packet;
   cs->pending = none_pending;
+  cs->syscall_op = NO_SYSCALL;
   cs->own_buffer_ = (char*) xmalloc (PBUFSIZ + 1);
   client_states.current_cs = cs;
   cs->ss->attach_count_ = 0;
@@ -396,18 +397,18 @@ get_packet_type (client_state *cs)
 	{
 	  for (csi = client_states.first; csi != NULL; csi = csi->next)
 	    {
-	      if (attached_to_same_proc (cs, csi) && csi->syscall_op)
+	      if (attached_to_same_proc (cs, csi) && csi->syscall_op != NO_SYSCALL)
 		{
 		  process = current_process ();
 		  VEC_replace (int, process->syscalls_to_catch, 0, csi->syscall_op);
-		  csi->syscall_op = 0;
+		  csi->syscall_op = NO_SYSCALL;
 		}
 	    }
 	  return vContc;
 	}
       else if (strncmp (own_buffer, "vCont;s", 7) == 0)
 	return vConts;
-      else if (strncmp (own_buffer, "vCont;r", 7) == 0) 
+      else if (strncmp (own_buffer, "vCont;r", 7) == 0)
 	{
 	  for (csi = client_states.first; csi != NULL; csi = csi->next)
 	    {
@@ -436,7 +437,7 @@ get_packet_type (client_state *cs)
     case 'H':
       if (own_buffer[1] == 'g')
 	{
-	  client_states.current_cs->new_general_thread = 
+	  client_states.current_cs->new_general_thread =
 	    read_ptid (&own_buffer[2], NULL);
 	  return Hg;
 	}
@@ -470,7 +471,7 @@ struct notif_server notif_stop =
 static void
 resolve_waiter (client_state *cs, client_state *waitee_cs)
 {
-  enum packet_types this_packet_type = 
+  enum packet_types this_packet_type =
     (enum packet_types)((cs->packet_type) ? cs->packet_type : cs->last_packet_type);
   client_state *save_client_state;
 
@@ -753,6 +754,10 @@ notify_clients (char *buffer, int have_first_notify)
 	  make_waitee_a_waiter = 1;
 	  same_pid_cs->nonstop_pending = pending_notifier;
 	  break;
+	case TARGET_WAITKIND_IGNORE:
+	  /* TODO why do syscalls sometimes arrive as ignore */
+	  if (! strstr (buffer, "syscall_"))
+	    break;
 	case TARGET_WAITKIND_SYSCALL_ENTRY:
 	case TARGET_WAITKIND_SYSCALL_RETURN:
 	  have_syscall = 1;
@@ -1483,8 +1488,6 @@ handle_general_set (char *own_buf)
 	enabled = 0;
       else if (p[0] == '1' && (p[1] == ';' || p[1] == '\0'))
 	enabled = 1;
-      else if (p[0] == '2' && (p[1] == ';' || p[1] == '\0'))
-	enabled = 2;
       else
 	{
 	  fprintf (stderr, "Unknown catch-syscalls mode requested: %s\n",
@@ -1496,12 +1499,8 @@ handle_general_set (char *own_buf)
       process = current_process ();
       VEC_truncate (int, process->syscalls_to_catch, 0);
 
-      /* (FOLLOW,SYSCALL1,...,SYSCALLN) (FOLLOW,ANY) (ANY) */
-      switch (enabled)
+      if (enabled)
 	{
-	case 2:
-	  VEC_safe_push (int, process->syscalls_to_catch, FOLLOW_CHILD);
-	case 1:
 	  p += 1;
 	  if (*p == ';')
 	    {
@@ -5273,7 +5272,7 @@ process_serial_event (void)
     }
 
   if (! do_multiplexing (get_client_state()))
-	  return 0;
+    return 0;
 
   if (new_packet_len != -1)
     putpkt_binary (own_buffer, new_packet_len);
@@ -5440,7 +5439,7 @@ handle_target_event (int err, gdb_client_data client_data)
 	    }
 	}
       else
-	push_stop_notification (last_ptid, &last_status);
+	  push_stop_notification (last_ptid, &last_status);
     }
 
   /* Be sure to not change the selected thread behind GDB's back.
diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h
index 4726831..18cd43c 100644
--- a/gdb/gdbserver/server.h
+++ b/gdb/gdbserver/server.h
@@ -113,10 +113,7 @@ extern void discard_queued_stop_replies (ptid_t ptid);
 #define ANY_SYSCALL (-2)
 
 /* Trace child processes created via fork or clone.  */
-#define FOLLOW_CHILD (-3)
-
-/* Trace child processes created via fork or clone.  */
-#define NO_SYSCALL (-4)
+#define NO_SYSCALL (-3)
 
 #endif /* SERVER_H */
 
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index ac24021..6781df6 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-01-02  Stan Cox  <scox@redhat.com>
+
+	* gdb.server/multi-client.exp: Add multithreaded test.
+	* gdb.server/strace-threads.c: Likewise.
+
 2016-10-23  Stan Cox  <scox@redhat.com>
 
 	* gdb.server/multi-client.exp:  Add threaded test.
diff --git a/gdb/testsuite/gdb.server/multi-client.exp b/gdb/testsuite/gdb.server/multi-client.exp
index c82db90..e1689fc 100644
--- a/gdb/testsuite/gdb.server/multi-client.exp
+++ b/gdb/testsuite/gdb.server/multi-client.exp
@@ -13,7 +13,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-exp_internal 1
+# exp_internal 1
 
 load_lib gdbserver-support.exp
 load_lib prelink-support.exp
@@ -111,7 +111,7 @@ proc get_target_pid { target_exec } {
 	perror "$test Failed to get pid of target process. $expect_out(buffer)"
 	return 1
     }
-    verbose "XXX spawn_id $res"
+    close -i $res
     set pgrep_spawn_id $res
     return $target_pid
 }
@@ -130,12 +130,12 @@ proc gdb_command { COMMAND RESPONSE COMMENT } {
 	}
 	if {$ok == 1} { 
 	    pass "$COMMENT"
-	} else {
-	    fail "$COMMENT"
 	}
     }
 }
 
+set clean_idx 0
+
 proc cleanup_server_and_clients { } {
     global strace_spawn_id
     global server_spawn_id
@@ -143,28 +143,24 @@ proc cleanup_server_and_clients { } {
     global gdb_spawn_id 
     global inferior_spawn_id
     global pgrep_spawn_id
+    global clean_idx
     
-    catch {verbose "BBB strace [exp_pid -i $strace_spawn_id]"}
-    catch {verbose "BBB gdb [exp_pid -i $gdb_spawn_id]"}
-    catch {verbose "BBB inferior [exp_pid -i $inferior_spawn_id]"}
-    catch {verbose "BBB pgrep [exp_pid -i $pgrep_spawn_id]"}
-
+    incr clean_idx
+    close_gdbserver
     catch {exec kill -KILL [exp_pid -i $strace_spawn_id]}
     catch {exec kill -KILL [exp_pid -i $gdb_spawn_id]}
     catch {exec kill -KILL [exp_pid -i $inferior_spawn_id]}
     catch {exec kill -KILL [exp_pid -i $pgrep_spawn_id]}
     if { $target_pid > 1 } {catch {exec kill -KILL $target_pid}}
-    close_gdbserver
     gdb_exit
-    system "ps" "-fax" "--width=320" "-o" "pid,ppid,lwp,rss,time,cmd" ">|" "/tmp/,x"
 }
 
+foreach NONSTOP { off on } {
+
 #-------------------------------------------------------
 
 verbose "##### Test coordination of a gdb client and an strace client"
 
-foreach NONSTOP { off on } {
-
 set res [gdbserver_start "--multi" ""]
 sleep 2


hooks/post-receive
--
Repository for Project Archer.


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

only message in thread, other threads:[~2017-01-02 23:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-02 23:36 [SCM] scox/strace: Send both stopped thread and general thread to syscall clients scox

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).