From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19770 invoked by alias); 13 Feb 2011 00:01:17 -0000 Received: (qmail 19761 invoked by uid 22791); 13 Feb 2011 00:01:16 -0000 X-SWARE-Spam-Status: No, hits=-4.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp-outbound-2.vmware.com (HELO smtp-outbound-2.vmware.com) (65.115.85.73) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 13 Feb 2011 00:01:09 +0000 Received: from mailhost4.vmware.com (mailhost4.vmware.com [10.16.67.124]) by smtp-outbound-2.vmware.com (Postfix) with ESMTP id DBC0E36007; Sat, 12 Feb 2011 16:01:06 -0800 (PST) Received: from msnyder-server.eng.vmware.com (promd-2s-dhcp138.eng.vmware.com [10.20.124.138]) by mailhost4.vmware.com (Postfix) with ESMTP id D2170C9DBB; Sat, 12 Feb 2011 16:01:06 -0800 (PST) Message-ID: <4D571F42.4040907@vmware.com> Date: Sun, 13 Feb 2011 00:01:00 -0000 From: Michael Snyder User-Agent: Thunderbird 2.0.0.24 (X11/20101201) MIME-Version: 1.0 To: Eli Zaretskii CC: "pedro@codesourcery.com" , "gdb-patches@sourceware.org" , "tromey@redhat.com" Subject: Re: [rfc] 'thread tid' command References: <4D55B457.4090404@vmware.com> <201102112356.22969.pedro@codesourcery.com> <4D55D536.3040804@vmware.com> <83aai1r8qr.fsf@gnu.org> <4D570F07.2090802@vmware.com> In-Reply-To: <4D570F07.2090802@vmware.com> Content-Type: multipart/mixed; boundary="------------060703030300050706060506" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-02/txt/msg00242.txt.bz2 This is a multi-part message in MIME format. --------------060703030300050706060506 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1480 Michael Snyder wrote: > Eli Zaretskii wrote: >>> Date: Fri, 11 Feb 2011 16:32:54 -0800 >>> From: Michael Snyder >>> CC: "gdb-patches@sourceware.org" >>> >>> Pedro Alves wrote: >>>> On Friday 11 February 2011 22:12:39, Michael Snyder wrote: >>>>> This is purposefully rough, 'cause I hope for discussion. >>>>> >>>>> This is a new command to help manage large thread lists. >>>>> I started with the idea "I want to find out which thread >>>>> has target id 12345", then extended it to also handle the >>>>> new concept of thread names (which thread has name 'foo'), >>>>> and extra info as well (which thread has extra info that >>>>> includes the string "xyz"). >>>>> >>>>> The syntax (I'm open to renaming etc.): >>>>> >>>>> thread tid [NAME | TARGET_ID | EXTRA_INFO] >>>> Shouldn't this be under "info" or "show"? >>> Suits me, but >>> 1) I'd prefer it wasn't "show", because there is no "set". >>> 2) Info what? tid? thread-id? >> thread show [NAME | TARGET_ID | EXTRA_INFO] >> thread info [NAME | TARGET_ID | EXTRA_INFO] > > How about "thread find"? Here's a new diff combining both patches (since they sort of relate), and implementing some of your suggestions. * info thread can now take a list of thread ids (closer to a thread set) * thread find (so called) can now take a regular expression. Tom, since you implemented the thread name, I'd like to know if this scheme fits in with what you had in mind. --------------060703030300050706060506 Content-Type: text/plain; name="tid.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="tid.txt" Content-length: 4474 2011-02-10 Michael Snyder * thread.c (info_threads_command): Process arg as thread id, or list of thread ids. (thread_find_command): New command. (_initialize_thread): Document argument for info threads. Document 'thread find' command. Index: thread.c =================================================================== RCS file: /cvs/src/src/gdb/thread.c,v retrieving revision 1.131 diff -u -p -u -p -r1.131 thread.c --- thread.c 19 Jan 2011 17:21:36 -0000 1.131 +++ thread.c 12 Feb 2011 23:53:18 -0000 @@ -43,6 +43,7 @@ #include "observer.h" #include "annotate.h" #include "cli/cli-decode.h" +#include "gdb_regex.h" /* Definition of struct thread_info exported to gdbthread.h. */ @@ -957,15 +958,35 @@ No selected thread. See `help thread'.\ /* Print information about currently known threads - * Note: this has the drawback that it _really_ switches - * threads, which frees the frame cache. A no-side - * effects info-threads command would be nicer. - */ + Optional ARG is a thread id, or list of thread ids. + + Note: this has the drawback that it _really_ switches + threads, which frees the frame cache. A no-side + effects info-threads command would be nicer. */ static void info_threads_command (char *arg, int from_tty) { - print_thread_info (uiout, -1, -1); + int tid = -1; + + if (arg == NULL || *arg == '\0') + { + print_thread_info (uiout, -1, -1); + return; + } + + while (arg != NULL && *arg != '\0') + { + int tmp_tid + = (int) parse_and_eval_long (scan_expression_with_cleanup (&arg, + NULL)); + + if (tmp_tid != 0) + { + tid = tmp_tid; + print_thread_info (uiout, tid, -1); + } + } } /* Switch from one thread to another. */ @@ -1313,6 +1334,56 @@ thread_name_command (char *arg, int from info->name = arg ? xstrdup (arg) : NULL; } +/* Find thread ids with a name, target pid, or extra info matching ARG. */ + +static void +thread_find_command (char *arg, int from_tty) +{ + struct thread_info *tp; + char *tmp; + unsigned long match = 0; + + if (arg == NULL || *arg == '\0') + error (_("Command requires an argument.")); + + tmp = re_comp (arg); + if (tmp != 0) + error (_("Invalid regexp (%s): %s"), tmp, arg); + + update_thread_list (); + for (tp = thread_list; tp; tp = tp->next) + { + if (tp->name != NULL && re_exec (tp->name)) + { + printf_filtered ("Thread %d has name '%s'\n", tp->num, tp->name); + match++; + } + + tmp = target_thread_name (tp); + if (tmp != NULL && re_exec (tmp)) + { + printf_filtered ("Thread %d has target name '%s'\n", tp->num, tmp); + match++; + } + + tmp = target_pid_to_str (tp->ptid); + if (tmp != NULL && re_exec (tmp)) + { + printf_filtered ("Thread %d has target id '%s'\n", tp->num, tmp); + match++; + } + + tmp = target_extra_thread_info (tp); + if (tmp != NULL && re_exec (tmp)) + { + printf_filtered ("Thread %d has extra info '%s'\n", tp->num, tmp); + match++; + } + } + if (!match) + printf_filtered ("No threads match '%s'\n", arg); +} + /* Print notices when new threads are attached and detached. */ int print_thread_events = 1; static void @@ -1403,8 +1474,10 @@ _initialize_thread (void) { static struct cmd_list_element *thread_apply_list = NULL; - add_info ("threads", info_threads_command, - _("IDs of currently known threads.")); + add_info ("threads", info_threads_command, _("\ +Usage: info threads [ID [ID]...]. Display currently known threads.\n\ +If ID is given, display only that thread or those threads;\ +otherwise, all threads are displayed.")); add_prefix_cmd ("thread", class_run, thread_command, _("\ Use this command to switch between threads.\n\ @@ -1418,11 +1491,15 @@ The new thread ID must be currently know add_cmd ("all", class_run, thread_apply_all_command, _("Apply a command to all threads."), &thread_apply_list); - add_cmd ("name", class_run, thread_name_command, + add_cmd ("name", no_class, thread_name_command, _("Set the current thread's name.\n\ Usage: thread name [NAME]\n\ If NAME is not given, then any existing name is removed."), &thread_cmd_list); + add_cmd ("find", no_class, thread_find_command, _("\ +Find thread ids with a name, target pid, or extra info matching REGEXP."), + &thread_cmd_list); + if (!xdb_commands) add_com_alias ("t", "thread", class_run, 1); --------------060703030300050706060506--