From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29914 invoked by alias); 30 Jul 2009 00:07:19 -0000 Received: (qmail 29906 invoked by uid 22791); 30 Jul 2009 00:07:18 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00 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; Thu, 30 Jul 2009 00:07:10 +0000 Received: from jupiter.vmware.com (mailhost5.vmware.com [10.16.68.131]) by smtp-outbound-2.vmware.com (Postfix) with ESMTP id 14D2D460EC; Wed, 29 Jul 2009 17:07:09 -0700 (PDT) Received: from [10.20.94.141] (msnyder-server.eng.vmware.com [10.20.94.141]) by jupiter.vmware.com (Postfix) with ESMTP id 095AADC1F4; Wed, 29 Jul 2009 17:07:09 -0700 (PDT) Message-ID: <4A70E268.6010401@vmware.com> Date: Thu, 30 Jul 2009 00:41:00 -0000 From: Michael Snyder User-Agent: Thunderbird 1.5.0.12 (X11/20080411) MIME-Version: 1.0 To: "gdb-patches@sourceware.org" CC: "drow@false.org" Subject: [RFC] small change for better error reporting in remote.c Content-Type: multipart/mixed; boundary="------------050007010709020607060205" 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: 2009-07/txt/msg00726.txt.bz2 This is a multi-part message in MIME format. --------------050007010709020607060205 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 703 AFAICT, this has been mildly broken forever. If you look at store_register_using_P and fetch_register_using_p, they both call remote_send, followed by packet_ok, and then send error if PACKET_ERROR. Unfortunately the PACKET_ERROR path is dead code, because remote_send already bails with a much more general (ie. less useful) error msg if we get back an Exx reply. Most of us will have never seen this happen, because how can a remote target fail to write a register? But it can happen when the target is a replay recording as with Virtutech and VMware targets. This change is to give a more helpful error message, eg. 'Could not write register "eip"', as opposed to 'Remote failure reply: E00'. --------------050007010709020607060205 Content-Type: text/plain; name="errmsg.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="errmsg.txt" Content-length: 1969 2009-07-29 Michael Snyder * remote.c (store_register_using_P): Call putpkt and getpkt directly instead of calling remote_send. (store_register_using_G): Ditto. (fetch_register_using_p): Ditto. Index: remote.c =================================================================== RCS file: /cvs/src/src/gdb/remote.c,v retrieving revision 1.364 diff -u -p -r1.364 remote.c --- remote.c 14 Jul 2009 21:40:30 -0000 1.364 +++ remote.c 29 Jul 2009 23:52:27 -0000 @@ -4873,7 +4873,8 @@ fetch_register_using_p (struct regcache *p++ = 'p'; p += hexnumstr (p, reg->pnum); *p++ = '\0'; - remote_send (&rs->buf, &rs->buf_size); + putpkt (rs->buf); + getpkt (&rs->buf, &rs->buf_size, 0); buf = rs->buf; @@ -5121,7 +5122,8 @@ remote_prepare_to_store (struct regcache packet was not recognized. */ static int -store_register_using_P (const struct regcache *regcache, struct packet_reg *reg) +store_register_using_P (const struct regcache *regcache, + struct packet_reg *reg) { struct gdbarch *gdbarch = get_regcache_arch (regcache); struct remote_state *rs = get_remote_state (); @@ -5141,7 +5143,8 @@ store_register_using_P (const struct reg p = buf + strlen (buf); regcache_raw_collect (regcache, reg->regnum, regp); bin2hex (regp, p, register_size (gdbarch, reg->regnum)); - remote_send (&rs->buf, &rs->buf_size); + putpkt (rs->buf); + getpkt (&rs->buf, &rs->buf_size, 0); switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_P])) { @@ -5189,7 +5192,10 @@ store_registers_using_G (const struct re /* remote_prepare_to_store insures that rsa->sizeof_g_packet gets updated. */ bin2hex (regs, p, rsa->sizeof_g_packet); - remote_send (&rs->buf, &rs->buf_size); + putpkt (rs->buf); + getpkt (&rs->buf, &rs->buf_size, 0); + if (rs->buf[0] == 'E') + error (_("Could not write registers")); } /* Store register REGNUM, or all registers if REGNUM == -1, from the contents --------------050007010709020607060205--