From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18820 invoked by alias); 1 Mar 2012 14:47:43 -0000 Received: (qmail 18809 invoked by uid 22791); 1 Mar 2012 14:47:40 -0000 X-SWARE-Spam-Status: No, hits=-1.4 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 01 Mar 2012 14:47:10 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1S37Hg-0003eK-K6 from Hui_Zhu@mentor.com ; Thu, 01 Mar 2012 06:47:08 -0800 Received: from SVR-ORW-FEM-02.mgc.mentorg.com ([147.34.96.206]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Thu, 1 Mar 2012 06:46:37 -0800 Received: from [127.0.0.1] (147.34.91.1) by svr-orw-fem-02.mgc.mentorg.com (147.34.96.168) with Microsoft SMTP Server id 14.1.289.1; Thu, 1 Mar 2012 06:47:06 -0800 Message-ID: <4F4F8BE2.7030503@mentor.com> Date: Thu, 01 Mar 2012 14:47:00 -0000 From: Hui Zhu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.2) Gecko/20120216 Thunderbird/10.0.2 MIME-Version: 1.0 To: Pedro Alves , CC: Yao Qi Subject: Fix error when gdb connect to a stub that tracepoint is running[1/2] Add a flag initialized to struct trace_status Content-Type: multipart/mixed; boundary="------------010009010608000004050208" 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: 2012-03/txt/msg00016.txt.bz2 --------------010009010608000004050208 Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit Content-length: 2394 Hi Pedro, After discussion with Yao in irc, our thought is if we want handle it in update_global_location_list, there will a lot of part need to be change, because there are a lot of call level. For example: #0 remote_download_tracepoint (loc=0x35040b0) at ../../src/gdb/remote.c:9982 #1 0x00000000006727c1 in download_tracepoint_locations () at ../../src/gdb/breakpoint.c:10670 #2 0x0000000000673111 in update_global_location_list (should_insert=1) at ../../src/gdb/breakpoint.c:11021 #3 0x0000000000663752 in create_overlay_event_breakpoint () at ../../src/gdb/breakpoint.c:2322 #4 0x0000000000675c9f in breakpoint_re_set () at ../../src/gdb/breakpoint.c:12621 #5 0x00000000007efe65 in solib_add (pattern=0x0, from_tty=1, target=0x1d1e860, readsyms=1) at ../../src/gdb/solib.c:928 #6 0x000000000057b452 in enable_break (info=0x3307890, from_tty=1) at ../../src/gdb/solib-svr4.c:1624 #7 0x000000000057c428 in svr4_solib_create_inferior_hook (from_tty=1) at ../../src/gdb/solib-svr4.c:2234 #8 0x00000000007f04a9 in solib_create_inferior_hook (from_tty=1) at ../../src/gdb/solib.c:1172 #9 0x00000000006cc8e5 in post_create_inferior (target=0x1d1e860, from_tty=1) at ../../src/gdb/infcmd.c:431 #10 0x00000000006d479d in start_remote (from_tty=1) at ../../src/gdb/infrun.c:2309 #11 0x00000000005d80c9 in remote_start_remote (from_tty=1, target=0x1cefce0, extended_p=0) at ../../src/gdb/remote.c:3367 The idea of this patch is let remote_get_trace_status doesn't try to access to target status before remote_start_remote call remote_get_trace_status. Then when GDB call download_tracepoint_locations try to download tracepoint before call remote_get_trace_status, it will got !ts->running_known in remote_can_download_tracepoint. Then GDB will not download tracepoint before remote_start_remote call remote_get_trace_status. BTW, to handle this issue we need patch in http://sourceware.org/ml/gdb-patches/2012-01/msg01008.html too. Thanks, Hui 2012-02-27 Hui Zhu Yao Qi * remote.c (remote_start_remote): ts->initialized to false in the begin of this function and set it to true before call remote_get_trace_status. (remote_get_trace_status): Return directly if ts->initialized is false. tracepoint.c(tfile_open): Set ts->initialized to true. tracepoint.h(trace_status): Add initialized. --------------010009010608000004050208 Content-Type: text/plain; name="reset-trace-status.txt" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="reset-trace-status.txt" Content-length: 2956 --- remote.c | 30 ++++++++++++++++++++---------- tracepoint.c | 1 + tracepoint.h | 3 +++ 3 files changed, 24 insertions(+), 10 deletions(-) --- a/remote.c +++ b/remote.c @@ -3203,6 +3203,7 @@ remote_start_remote (int from_tty, struc struct remote_state *rs = get_remote_state (); struct packet_config *noack_config; char *wait_status = NULL; + struct trace_status *ts = current_trace_status (); immediate_quit++; /* Allow user to interrupt it. */ @@ -3212,6 +3213,9 @@ remote_start_remote (int from_tty, struc /* Ack any packet which the remote side has already sent. */ serial_write (remote_desc, "+", 1); + /* Set status to not initialized. */ + ts->initialized = 0; + /* The first packet we send to the target is the optional "supported packets" request. If the target can answer this, it will tell us which later probes to skip. */ @@ -3435,7 +3439,8 @@ remote_start_remote (int from_tty, struc /* Possibly the target has been engaged in a trace run started previously; find out where things are at. */ - if (remote_get_trace_status (current_trace_status ()) != -1) + ts->initialized = 1; + if (remote_get_trace_status (ts) != -1) { struct uploaded_tp *uploaded_tps = NULL; struct uploaded_tsv *uploaded_tsvs = NULL; @@ -10276,6 +10281,19 @@ remote_get_trace_status (struct trace_st extern int trace_regblock_size; volatile struct gdb_exception ex; + /* We're working with a live target. */ + ts->from_file = 0; + + /* Set some defaults. */ + ts->running_known = 0; + ts->stop_reason = trace_stop_reason_unknown; + ts->traceframe_count = -1; + ts->buffer_free = 0; + ts->running = 0; + + if (!ts->initialized) + goto out; + trace_regblock_size = get_remote_arch_state ()->sizeof_g_packet; putpkt ("qTStatus"); @@ -10294,20 +10312,12 @@ remote_get_trace_status (struct trace_st if (*p == '\0') return -1; - /* We're working with a live target. */ - ts->from_file = 0; - - /* Set some defaults. */ - ts->running_known = 0; - ts->stop_reason = trace_stop_reason_unknown; - ts->traceframe_count = -1; - ts->buffer_free = 0; - if (*p++ != 'T') error (_("Bogus trace status reply from target: %s"), target_buf); parse_trace_status (p, ts); +out: return ts->running; } --- a/tracepoint.c +++ b/tracepoint.c @@ -3670,6 +3670,7 @@ tfile_open (char *filename, int from_tty trace_regblock_size = 0; ts = current_trace_status (); + ts->initialized = 1; /* We know we're working with a file. */ ts->from_file = 1; /* Set defaults in case there is no status line. */ --- a/tracepoint.h +++ b/tracepoint.h @@ -72,6 +72,9 @@ enum trace_stop_reason struct trace_status { + /* The target will try to get the status only when this is true. */ + int initialized; + /* This is true if the status is coming from a file rather than a live target. */ int from_file; --------------010009010608000004050208--