From patchwork Fri Apr 19 15:13:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 88744 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A5D6A3849AFC for ; Fri, 19 Apr 2024 15:15:24 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by sourceware.org (Postfix) with ESMTPS id 106683849AF4 for ; Fri, 19 Apr 2024 15:14:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 106683849AF4 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=palves.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 106683849AF4 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713539648; cv=none; b=VsRuQ9oxzSbkJ9deDhOyc2fo52nGfHu5FqqL9Ge5VDPoWRKE884CFwkJ2ogmyPM9aBtjRFmx0lOTwcRk0uzFjVh3v8IaU3y41oZevbFE1LEW4smfmrKkAnC6kvVpr5YPwUSlxQBhBpRuRSh1QVMlKBLFGzWba1LFce7eoJg/Kg4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713539648; c=relaxed/simple; bh=hESiXq+5hsUbL0lTAJ51Uu3X3YolUfvAAOO1O47G4LU=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=ROdy0HO5X1Fu+vdSmKCvEMdTHFv/Eq69ewmsZhcOHq8m1Ko6F24flS11ltAW30b/XBnGUmAPBa/a1+VGbjV1LeDo2HRc3n4tFZhbxn8oBNgrHOxu7mRYwwT6lj88PxXFUY+5p6ICm08H9YkRUX1fxxzcPYOW297SoM9ip5bvamc= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-344047ac7e4so2015475f8f.0 for ; Fri, 19 Apr 2024 08:14:05 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713539644; x=1714144444; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7eJ0kYMA6qSjpPVsAuN6fj2FvMIon1uApzvpR6KW0ro=; b=FXBmjjhH13mCoJusEhXGTuRVrRMqoyZprZCpN0khmPEYdXe2tCqaT6dT5X3m2oI7aK P4m3snNTSd4NA2nL2KKF+bvrwR+uYjqNfAAVdgA2htgA0IZgcDgRub6BeZZx8S2Ke8Zv rn0Uf2mGf5QHBmPA/763QTP86mF8ZTteUA5IYXo2CCaCejf2LsrU9KtkBUSqR3cA5h7e tZTEwfMF4HmwTXqFuF4F94SzgvYm8owObabT6gmZwJrSrVucAlK211uuwB6zAXGPo1cB dDOcvevLTEpauIThTxYc9NXnaqXvWK2YfR5jAv04oCS5Y/El8OHnsRzr0epG4ga7xuFr Himw== X-Gm-Message-State: AOJu0YzYKgvT/z8M3Y+JaZDbKh86n73F1SC1+oDM8bxfLNCKi65WZqUG z5bZ9/2dBFqVCQTI+Q5gT11oVHbU8yXN3TbNwIKzwqOzPnAYuHpH8AbhQC40 X-Google-Smtp-Source: AGHT+IFYZvsdu99G73hvTvrQHQoB9OVe8ndXI9XDaV7d8oySlAF7HMC//muidD0C5X0TB2hO8d1rxw== X-Received: by 2002:a5d:5906:0:b0:346:f091:fb75 with SMTP id v6-20020a5d5906000000b00346f091fb75mr1974018wrd.33.1713539643520; Fri, 19 Apr 2024 08:14:03 -0700 (PDT) Received: from localhost ([2001:8a0:f93d:b900:2438:d637:5572:c30a]) by smtp.gmail.com with UTF8SMTPSA id h15-20020a056000000f00b003434c764f01sm4636427wrx.107.2024.04.19.08.14.01 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 19 Apr 2024 08:14:03 -0700 (PDT) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 06/12] Improve vRun error reporting Date: Fri, 19 Apr 2024 16:13:36 +0100 Message-ID: <20240419151342.1592474-7-pedro@palves.net> X-Mailer: git-send-email 2.43.2 In-Reply-To: <20240419151342.1592474-1-pedro@palves.net> References: <20240419151342.1592474-1-pedro@palves.net> MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org After the previous commit, if starting the inferior process with "run" (vRun packet) fails, GDBserver reports an error using the "E." textual error packet. On the GDB side, however, GDB doesn't yet do anything with the textual error string. This commit improves that. This makes remote debugging output the same as native output, when possible, another small step in the "local/remote parity" project. E.g., before, against GNU/Linux GDBserver: (gdb) run Starting program: .../gdb.base/run-fail-twice/run-fail-twice.nox Running ".../gdb.base/run-fail-twice/run-fail-twice.nox" on the remote target failed After, against GNU/Linux GDBserver (same as native): (gdb) run Starting program: .../gdb.base/run-fail-twice/run-fail-twice.nox During startup program exited with code 126. To know whether we have a textual error message, extend packet_result to carry that information. While at it, convert packet_result to use factory methods, and change its std::string parameter to a plain const char *, as that it always what we have handy to pass to it. Change-Id: Ib386f267522603f554b52a885b15229c9639e870 --- gdb/remote.c | 67 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/gdb/remote.c b/gdb/remote.c index cfb54de157d..8ef808c5ad6 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -158,20 +158,27 @@ enum packet_status /* Keeps packet's return value. If packet's return value is PACKET_ERROR, err_msg contains an error message string from E.string or the number stored as a string from E.num. */ -struct packet_result +class packet_result { - packet_result (enum packet_status status, std::string err_msg) - : m_status (status), m_err_msg (std::move (err_msg)) - { - gdb_assert (status == PACKET_ERROR); - } +private: + /* Private ctors for internal use. Clients should use the public + factory static methods instead. */ + + /* Construct a PACKET_ERROR packet_result. */ + packet_result (const char *err_msg, bool textual_err_msg) + : m_status (PACKET_ERROR), + m_err_msg (err_msg), + m_textual_err_msg (textual_err_msg) + {} + /* Construct an PACKET_OK/PACKET_UNKNOWN packet_result. */ explicit packet_result (enum packet_status status) : m_status (status) { gdb_assert (status != PACKET_ERROR); } +public: enum packet_status status () const { return this->m_status; @@ -183,9 +190,39 @@ struct packet_result return this->m_err_msg.c_str (); } + bool textual_err_msg () const + { + gdb_assert (this->m_status == PACKET_ERROR); + return this->m_textual_err_msg; + } + + static packet_result make_numeric_error (const char *err_msg) + { + return packet_result (err_msg, false); + } + + static packet_result make_textual_error (const char *err_msg) + { + return packet_result (err_msg, true); + } + + static packet_result make_ok () + { + return packet_result (PACKET_OK); + } + + static packet_result make_unknown () + { + return packet_result (PACKET_UNKNOWN); + } + private: enum packet_status m_status; std::string m_err_msg; + + /* True if we have a textual error message, from an "E.MESSAGE" + response. */ + bool m_textual_err_msg; }; /* Enumeration of packets for a remote target. */ @@ -2473,7 +2510,7 @@ packet_check_result (const char *buf, bool accept_msg) && isxdigit (buf[1]) && isxdigit (buf[2]) && buf[3] == '\0') /* "Enn" - definitely an error. */ - return { PACKET_ERROR, buf + 1 }; + return packet_result::make_numeric_error (buf + 1); /* Not every request accepts an error in a E.msg form. Some packets accepts only Enn, in this case E. is not @@ -2485,19 +2522,19 @@ packet_check_result (const char *buf, bool accept_msg) if (buf[0] == 'E' && buf[1] == '.') { if (buf[2] != '\0') - return { PACKET_ERROR, buf + 2 }; + return packet_result::make_textual_error (buf + 2); else - return { PACKET_ERROR, "no error provided" }; + return packet_result::make_textual_error ("no error provided"); } } /* The packet may or may not be OK. Just assume it is. */ - return packet_result (PACKET_OK); + return packet_result::make_ok (); } else { /* The stub does not support the packet. */ - return packet_result (PACKET_UNKNOWN); + return packet_result::make_unknown (); } } @@ -10704,7 +10741,8 @@ remote_target::extended_remote_run (const std::string &args) putpkt (rs->buf); getpkt (&rs->buf); - switch ((m_features.packet_ok (rs->buf, PACKET_vRun)).status ()) + packet_result result = m_features.packet_ok (rs->buf, PACKET_vRun); + switch (result.status ()) { case PACKET_OK: /* We have a wait response. All is well. */ @@ -10712,6 +10750,11 @@ remote_target::extended_remote_run (const std::string &args) case PACKET_UNKNOWN: return -1; case PACKET_ERROR: + /* If we have a textual error message, print just that. This + makes remote debugging output the same as native output, when + possible. */ + if (result.textual_err_msg ()) + error (("%s"), result.err_msg ()); if (remote_exec_file[0] == '\0') error (_("Running the default executable on the remote target failed; " "try \"set remote exec-file\"?"));