From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32255 invoked by alias); 16 Aug 2007 21:03:19 -0000 Received: (qmail 32018 invoked by uid 22791); 16 Aug 2007 21:03:18 -0000 X-Spam-Check-By: sourceware.org Received: from igw1.br.ibm.com (HELO igw1.br.ibm.com) (32.104.18.24) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 16 Aug 2007 21:03:06 +0000 Received: from mailhub3.br.ibm.com (mailhub3 [9.18.232.110]) by igw1.br.ibm.com (Postfix) with ESMTP id 541D114821C for ; Thu, 16 Aug 2007 17:46:25 -0300 (BRT) Received: from d24av02.br.ibm.com (d24av02.br.ibm.com [9.18.232.47]) by mailhub3.br.ibm.com (8.13.8/8.13.8/NCO v8.5) with ESMTP id l7GL32nE1630272 for ; Thu, 16 Aug 2007 18:03:02 -0300 Received: from d24av02.br.ibm.com (loopback [127.0.0.1]) by d24av02.br.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id l7GL32rK020849 for ; Thu, 16 Aug 2007 18:03:02 -0300 Received: from [9.8.5.170] ([9.8.5.170]) by d24av02.br.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id l7GL2xW4020745 for ; Thu, 16 Aug 2007 18:03:01 -0300 Subject: [patch] Watchpoints: support for thread parameters From: Luis Machado Reply-To: luisgpm@linux.vnet.ibm.com To: gdb-patches@sourceware.org Content-Type: multipart/mixed; boundary="=-Njs6ABYXlYu13yk9kooj" Date: Thu, 16 Aug 2007 21:03:00 -0000 Message-Id: <1187298178.5853.11.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.6.1 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: 2007-08/txt/msg00329.txt.bz2 --=-Njs6ABYXlYu13yk9kooj Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 1131 Hi, This is a first try on the implementation of the additional "thread " parameter for the watchpoint command in order to make GDB stop only on specific threads when a watchpoint is triggered. Basically i started parsing the arguments backwards, trying to locate tokens that identify a "thread " command. After that i hand all the left parameters over to the default expression parser. Differently than the breakpoint command, the "thread " parameter for watchpoints is located at the end of the argument list due to ambiguities that would arise when putting that parameter in between expressions, since those could contain strings that would require a more complex parser with context capabilities, thus being able to figure out what is part of an expression and what is not. What do you think? Looking forward to ideas and suggestions to improve it. We could change the location of the "thread " parameter for breakpoints as well, in order to keep it standard. Best regards, -- Luis Machado Software Engineer IBM Linux Technology Center e-mail: luisgpm@linux.vnet.ibm.com --=-Njs6ABYXlYu13yk9kooj Content-Disposition: attachment; filename=watch_thread_param.diff Content-Type: text/x-patch; name=watch_thread_param.diff; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-length: 3022 2007-08-16 Luis Machado * breakpoint.c: (watch_command_1): Parse additional optional "thread" parameter to the watchpoint command and set the "thread" member of the breakpoint struct. Index: gdb/breakpoint.c =================================================================== --- gdb.orig/breakpoint.c 2007-08-16 12:37:20.000000000 -0700 +++ gdb/breakpoint.c 2007-08-16 13:45:26.000000000 -0700 @@ -5834,10 +5834,70 @@ int i, other_type_used, target_resources_ok = 0; enum bptype bp_type; int mem_cnt = 0; + int thread = -1; init_sal (&sal); /* initialize to zeroes */ - /* Parse arguments. */ + /* Make sure that we actually have parameters to parse */ + if (arg != NULL && strlen (arg) >= 1) + { + toklen = strlen (arg); /* Size of argument list */ + + /* Points tok to the end of the argument list */ + tok = arg + toklen; + + /* Go backwards in the parameters list. Skip the last parameter. + If we're expecting a 'thread ' parameter, this should + be the thread identifier. */ + while (strlen (tok) < toklen && (*tok == ' ' || *tok == '\t')) + tok--; + while (strlen (tok) < toklen && (*tok != ' ' && *tok != '\t')) + tok--; + + /* Go backwards in the parameters list. Skip one more parameter. + If we're expecting a 'thread ' parameter, we should + reach a "thread" token. */ + while (strlen (tok) < toklen && (*tok == ' ' || *tok == '\t')) + tok--; + + end_tok = tok; + + while (strlen (tok) < toklen && (*tok != ' ' && *tok != '\t')) + tok--; + + /* Move the pointer forward to skip the whitespace and + calculate the length of the token. */ + tok++; + toklen = end_tok - tok; + + if (toklen >= 1 && strncmp (tok, "thread", toklen) == 0) + { + /* At this point we've found a "thread" token, which means + the user is trying to set a watchpoint that triggers + only in a specific thread. */ + char *tmptok; + char *thread_token; + + /* Extract the thread ID from the next token. */ + thread_token = tok; + tok = end_tok + 1; + tmptok = tok; + thread = strtol (tok, &tok, 0); + + if (tok == tmptok) + error (_("Incorrect parameter after thread keyword.")); + + if (!valid_thread_id (thread)) + error (_("Unknown thread %d."), thread); + + /* truncate the string and get rid of the thread + parameter before the parameter list is parsed by the + evaluate_expression() function. */ + *thread_token = '\0'; + } + } + + /* Parse the rest of the arguments. */ innermost_block = NULL; exp_start = arg; exp = parse_exp_1 (&arg, 0, 0); @@ -5921,6 +5981,7 @@ b = set_raw_breakpoint (sal, bp_type); set_breakpoint_count (breakpoint_count + 1); b->number = breakpoint_count; + b->thread = thread; b->disposition = disp_donttouch; b->exp = exp; b->exp_valid_block = exp_valid_block; --=-Njs6ABYXlYu13yk9kooj--