From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20469 invoked by alias); 9 Feb 2005 09:19:44 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 20192 invoked from network); 9 Feb 2005 09:19:25 -0000 Received: from unknown (HELO mail.codesourcery.com) (65.74.133.9) by sourceware.org with SMTP; 9 Feb 2005 09:19:25 -0000 Received: (qmail 5611 invoked from network); 9 Feb 2005 09:19:24 -0000 Received: from localhost (HELO ?192.168.189.167?) (nathan@127.0.0.1) by mail.codesourcery.com with SMTP; 9 Feb 2005 09:19:24 -0000 Message-ID: <4209D595.7010602@codesourcery.com> Date: Wed, 09 Feb 2005 11:00:00 -0000 From: Nathan Sidwell Organization: Codesourcery LLC User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20040913 MIME-Version: 1.0 To: gdb-patches@sources.redhat.com CC: Paul Brook Subject: [PATCH] Some tracepoint fixes Content-Type: multipart/mixed; boundary="------------010101010806050302000300" X-SW-Source: 2005-02/txt/msg00046.txt.bz2 This is a multi-part message in MIME format. --------------010101010806050302000300 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1035 In porting gdb to a new architecture, I came across a number of core gdb bugs. Here is the first set of them and addresses the following issues, 1) we did not allow 'extended-remote' targets to use tracepoints. 2) We could only trace architectures with 64 registers, not 256 like a comment suggested. 3) There was an erroneous comment about tracing memory ranges 4) If a ^D was entered when entering the 'actions' list, we'd create a NULL action, which would cause a segfault when tracing started. 5) The 'tstatus' command did not actually print any status. testcase gdb.trace/tfind.exp exepected it to do so. 6) Parsing the tfind responses uses strtol to read hex. That reads 'FFFFFFFF' as '7FFFFFFF' (and sets errno). Using sscanf reads that as -1, as desired. built and tested on i686-pc-linux-gnu, (and on the unreleased architecture I ported to) ok? nathan -- Nathan Sidwell :: http://www.codesourcery.com :: CodeSourcery LLC nathan@codesourcery.com :: http://www.planetfall.pwp.blueyonder.co.uk --------------010101010806050302000300 Content-Type: text/plain; name="tracepoint1.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="tracepoint1.patch" Content-length: 4311 2005-02-08 Nathan Sidwell * tracepoint.c (target_is_remote): Allow extended-remote. (struct collection_list): Allow 256 registers, like the comment said. (add_memrange): Fix comment. (read_actions): Turn EOF into 'end'. (trace_status_command): Print the status. (finish_tfind_command): Use sscanf not strtol. Index: tracepoint.c =================================================================== RCS file: /cvs/src/src/gdb/tracepoint.c,v retrieving revision 1.68 diff -c -3 -p -r1.68 tracepoint.c *** tracepoint.c 2 Feb 2005 00:20:05 -0000 1.68 --- tracepoint.c 8 Feb 2005 11:31:20 -0000 *************** static int *** 164,170 **** target_is_remote (void) { if (current_target.to_shortname && ! strcmp (current_target.to_shortname, "remote") == 0) return 1; else return 0; --- 164,171 ---- target_is_remote (void) { if (current_target.to_shortname && ! (strcmp (current_target.to_shortname, "remote") == 0 ! || strcmp (current_target.to_shortname, "extended-remote") == 0)) return 1; else return 0; *************** read_actions (struct tracepoint *t) *** 860,865 **** --- 861,869 ---- else line = gdb_readline (0); + if (!line) + line = "end"; + linetype = validate_actionline (&line, t); if (linetype == BADLINE) continue; /* already warned -- collect another line */ *************** struct memrange *** 1074,1080 **** struct collection_list { ! unsigned char regs_mask[8]; /* room for up to 256 regs */ long listsize; long next_memrange; struct memrange *list; --- 1078,1084 ---- struct collection_list { ! unsigned char regs_mask[32]; /* room for up to 256 regs */ long listsize; long next_memrange; struct memrange *list; *************** add_memrange (struct collection_list *me *** 1171,1177 **** printf_filtered (",%ld)\n", len); } ! /* type: 0 == memory, n == basereg */ memranges->list[memranges->next_memrange].type = type; /* base: addr if memory, offset if reg relative. */ memranges->list[memranges->next_memrange].start = base; --- 1175,1181 ---- printf_filtered (",%ld)\n", len); } ! /* type: -1 == memory, n == basereg */ memranges->list[memranges->next_memrange].type = type; /* base: addr if memory, offset if reg relative. */ memranges->list[memranges->next_memrange].start = base; *************** trace_status_command (char *args, int fr *** 1873,1878 **** --- 1877,1886 ---- /* exported for use by the GUI */ trace_running_p = (target_buf[1] == '1'); + if (trace_running_p) + printf_filtered ("Trace is running.\n"); + else + printf_filtered ("Trace is not running.\n"); } else error ("Trace can only be run on remote targets."); *************** finish_tfind_command (char *msg, *** 1888,1893 **** --- 1896,1902 ---- CORE_ADDR old_frame_addr; struct symbol *old_func; char *reply; + int len; old_frame_addr = get_frame_base (get_current_frame ()); old_func = find_pc_function (read_pc ()); *************** finish_tfind_command (char *msg, *** 1899,1905 **** switch (*reply) { case 'F': ! if ((target_frameno = (int) strtol (++reply, &reply, 16)) == -1) { /* A request for a non-existant trace frame has failed. Our response will be different, depending on FROM_TTY: --- 1908,1916 ---- switch (*reply) { case 'F': ! sscanf (reply, "F%X%n", &target_frameno, &len); ! reply += len; ! if (target_frameno == -1) { /* A request for a non-existant trace frame has failed. Our response will be different, depending on FROM_TTY: *************** finish_tfind_command (char *msg, *** 1937,1943 **** } break; case 'T': ! if ((target_tracept = (int) strtol (++reply, &reply, 16)) == -1) error ("Target failed to find requested trace frame."); break; case 'O': /* "OK"? */ --- 1948,1956 ---- } break; case 'T': ! sscanf (reply, "T%X%n", &target_tracept, &len); ! reply += len; ! if (target_tracept == -1) error ("Target failed to find requested trace frame."); break; case 'O': /* "OK"? */ --------------010101010806050302000300--