From patchwork Tue Feb 28 16:42:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 65784 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 1C0CA3850204 for ; Tue, 28 Feb 2023 16:43:41 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1C0CA3850204 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677602621; bh=P4AIs3NaMN+oWkXC1ifSu4E621I5Wzpj2tymbp7ENQY=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=gCWws8gSIKXqm/CW30VFOYDk5dkuZTsAxUdOmPo+rvSbgSyUOR2EsTAoy8BBIwpmL uBXOdudLhDee9Y9M7nfr4UaoaOJfOt0b82uN+qdnpRKlEZN2OY4/W2qF5WMZEbbwSt DhyF1KGyeWKUav5Kh4kCC2JLrpwQN+Auo2k6wkQs= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 7810C3858D3C for ; Tue, 28 Feb 2023 16:42:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7810C3858D3C Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-529-jz0m8feENpOTrlmyvpcLwA-1; Tue, 28 Feb 2023 11:42:24 -0500 X-MC-Unique: jz0m8feENpOTrlmyvpcLwA-1 Received: by mail-ed1-f72.google.com with SMTP id fi8-20020a056402550800b004a26cc7f6cbso14732679edb.4 for ; Tue, 28 Feb 2023 08:42:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677602543; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=P4AIs3NaMN+oWkXC1ifSu4E621I5Wzpj2tymbp7ENQY=; b=zce8WLlqnu1hdARsFkdoEoDbTdYlpcLKmXuNzf4jNqg91r30aaLY7xvULohk/XK6zJ xTcOchlFQQ3mB6x673qDLdxVQDrCiEzkBSkhmGvtLBjCow60Qc6JDy8BVUJd621MCZoi zfk0o7pPaERdJYGrVpLj5I/icwpTY8nrzDSbnuV2FHW5NVd2F/rYK1FRSHyQgR909epR OBpeViSgD30TBIxnYr8ol09lChODdDwEBmDvsAWl79KHmqYIGXTRiBHBN4a3nDfKx8p0 yGqrbFKCd9E5cQMXRcp2s1uPiezzjr+2tF5E+C6HPfQpeIsNU+lKunnrOLVmGcExzwaZ mI3w== X-Gm-Message-State: AO0yUKXshjn49YAYnXSjWJacv7fNv7QvZ9Ez2E8xchKVCjOWZFTRB4ya FBNhNgLktLG9G/3Dm/8+BZiAJdLNQXnviFX5DVJYAd6jTIj9b7C3cvYY7SR79ozlF/jCMddFHpF OXDTepkohav0gbGJt4vsSwIJkLoHhnNqs2R8iDKW1cdsfx/GgO9EVHa/EZb+8JE95J/uCgtHZdR h1cQk= X-Received: by 2002:a05:6402:416:b0:4ad:7c30:2599 with SMTP id q22-20020a056402041600b004ad7c302599mr4677249edv.13.1677602543412; Tue, 28 Feb 2023 08:42:23 -0800 (PST) X-Google-Smtp-Source: AK7set/ovnGKMIRqs6ag2S9vaqykQPcAnocXDxQuU56IxNyeLHbARFl+Jzs3ST23kObMaxNGO5RWxA== X-Received: by 2002:a05:6402:416:b0:4ad:7c30:2599 with SMTP id q22-20020a056402041600b004ad7c302599mr4677227edv.13.1677602543037; Tue, 28 Feb 2023 08:42:23 -0800 (PST) Received: from localhost (95.72.115.87.dyn.plus.net. [87.115.72.95]) by smtp.gmail.com with ESMTPSA id t19-20020a50d713000000b004af73333d6esm4596634edi.53.2023.02.28.08.42.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 08:42:22 -0800 (PST) To: gdb-patches@sourceware.org Cc: Andrew Burgess Subject: [PATCHv4 02/12] gdb: include breakpoint number in testing condition error message Date: Tue, 28 Feb 2023 16:42:07 +0000 Message-Id: X-Mailer: git-send-email 2.25.4 In-Reply-To: References: MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, 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.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Andrew Burgess via Gdb-patches From: Andrew Burgess Reply-To: Andrew Burgess Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" When GDB fails to test the condition of a conditional breakpoint, for whatever reason, the error message looks like this: (gdb) break foo if (*(int *) 0) == 1 Breakpoint 1 at 0x40111e: file bpcond.c, line 11. (gdb) r Starting program: /tmp/bpcond Error in testing breakpoint condition: Cannot access memory at address 0x0 Breakpoint 1, foo () at bpcond.c:11 11 int a = 32; (gdb) The line I'm interested in for this commit is this one: Error in testing breakpoint condition: In the case above we can figure out that the problematic breakpoint was #1 because in the final line of the message GDB reports the stop a breakpoint #1. However, in the next few patches I plan to change this. In some cases I don't think it makes sense for GDB to report the stop as being at breakpoint #1, consider this case: (gdb) list some_func 1 int 2 some_func () 3 { 4 int *p = 0; 5 return *p; 6 } 7 8 void 9 foo () 10 { (gdb) break foo if (some_func ()) Breakpoint 1 at 0x40111e: file bpcond.c, line 11. (gdb) r Starting program: /tmp/bpcond Program received signal SIGSEGV, Segmentation fault. 0x0000000000401116 in some_func () at bpcond.c:5 5 return *p; Error in testing breakpoint condition: The program being debugged was signaled while in a function called from GDB. GDB remains in the frame where the signal was received. To change this behavior use "set unwindonsignal on". Evaluation of the expression containing the function (some_func) will be abandoned. When the function is done executing, GDB will silently stop. Program received signal SIGSEGV, Segmentation fault. Breakpoint 1, 0x0000000000401116 in some_func () at bpcond.c:5 5 return *p; (gdb) Notice that, the final lines of output report the stop as being at breakpoint #1, even though we are actually located within some_func. I find this behaviour confusing, and propose that this should be changed. However, if I make that change then every reference to breakpoint #1 will be lost from the error message. So, in this commit, in preparation for the later commits, I propose to change the 'Error in testing breakpoint condition:' line to this: Error in testing condition for breakpoint NUMBER: where NUMBER will be filled in as appropriate. Here's the first example with the updated error: (gdb) break foo if (*(int *) 0) == 0 Breakpoint 1 at 0x40111e: file bpcond.c, line 11. (gdb) r Starting program: /tmp/bpcond Error in testing condition for breakpoint 1: Cannot access memory at address 0x0 Breakpoint 1, foo () at bpcond.c:11 11 int a = 32; (gdb) The breakpoint number does now appear twice in the output, but I don't see that as a negative. This commit just changes the one line of the error, and updates the few tests that either included the old error in comments, or actually checked for the error in the expected output. As the only test that checked the line I modified is a Python test, I've added a new test that doesn't rely on Python that checks the error message in detail. While working on the new test, I spotted that it would fail when run with native-gdbserver and native-extended-gdbserver target boards. This turns out to be due to a gdbserver bug. To avoid cluttering this commit I've added a work around to the new test script so that the test passes for the remote boards, in the next few commits I will fix gdbserver, and update the test script to remove the work around. --- gdb/breakpoint.c | 3 +- gdb/testsuite/gdb.base/bp-cond-failure.c | 30 +++++ gdb/testsuite/gdb.base/bp-cond-failure.exp | 112 ++++++++++++++++++ .../gdb.base/catch-signal-siginfo-cond.exp | 2 +- gdb/testsuite/gdb.base/gnu-ifunc.exp | 2 +- .../gdb.python/py-finish-breakpoint.exp | 2 +- 6 files changed, 147 insertions(+), 4 deletions(-) create mode 100644 gdb/testsuite/gdb.base/bp-cond-failure.c create mode 100644 gdb/testsuite/gdb.base/bp-cond-failure.exp diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index a42d26fd25a..c04b2e05d87 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -5543,7 +5543,8 @@ bpstat_check_breakpoint_conditions (bpstat *bs, thread_info *thread) catch (const gdb_exception_error &ex) { exception_fprintf (gdb_stderr, ex, - "Error in testing breakpoint condition:\n"); + "Error in testing condition for breakpoint %d:\n", + b->number); } } else diff --git a/gdb/testsuite/gdb.base/bp-cond-failure.c b/gdb/testsuite/gdb.base/bp-cond-failure.c new file mode 100644 index 00000000000..2a9974b47ce --- /dev/null +++ b/gdb/testsuite/gdb.base/bp-cond-failure.c @@ -0,0 +1,30 @@ +/* Copyright 2022-2023 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +foo () +{ + return 0; /* Breakpoint here. */ +} + +int +main () +{ + int res = foo (); + + return res; +} diff --git a/gdb/testsuite/gdb.base/bp-cond-failure.exp b/gdb/testsuite/gdb.base/bp-cond-failure.exp new file mode 100644 index 00000000000..b528ccce4ad --- /dev/null +++ b/gdb/testsuite/gdb.base/bp-cond-failure.exp @@ -0,0 +1,112 @@ +# Copyright 2022-2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Check the format of the error message given when a breakpoint +# condition fails. +# +# In this case the breakpoint condition does not make use of inferior +# function calls, instead, the expression used for the breakpoint +# condition will throw an error when evaluated. +# +# We check that the correct breakpoint number appears in the error +# message, and that the error is reported at the correct source +# location. + +standard_testfile + +if { [prepare_for_testing "failed to prepare" ${binfile} "${srcfile}" \ + {debug}] == -1 } { + return +} + +# Run to main so that we connect to the target if using 'target +# remote'. This means that the is_address_zero_readable, and the +# 'show breakpoint condition-evaluation' checks below will be +# performed with the remote connection in place. +if { ![runto_main] } { + return -1 +} + +# This test relies on reading address zero triggering a SIGSEGV. +if { [is_address_zero_readable] } { + return +} + +# Where the breakpoint will be placed. +set bp_line [gdb_get_line_number "Breakpoint here"] + +proc run_test { cond_eval } { + clean_restart ${::binfile} + + if { ![runto_main] } { + return -1 + } + + if { $cond_eval ne "auto" } { + gdb_test_no_output "set breakpoint condition-evaluation ${cond_eval}" + } + + # Setup the conditional breakpoint and record its number. + gdb_breakpoint "${::srcfile}:${::bp_line} if (*(int *) 0) == 0" + set bp_num [get_integer_valueof "\$bpnum" "*UNKNOWN*"] + + gdb_test "continue" \ + [multi_line \ + "Continuing\\." \ + "Error in testing condition for breakpoint ${bp_num}:" \ + "Cannot access memory at address 0x0" \ + "" \ + "Breakpoint ${bp_num}, foo \\(\\) at \[^\r\n\]+:${::bp_line}" \ + "${::decimal}\\s+\[^\r\n\]+Breakpoint here\[^\r\n\]+"] +} + +# If we're using a remote target then conditions could be evaulated +# locally on the host, or on the remote target. Otherwise, conditions +# are always evaluated locally. +# +# Using "auto" will select the target if the target supports condition +# evaluation, otherwise, the local host will be used. +# +# So, we always include "auto", but then we look at the output of +# 'show breakpoint condition-evaluation', if this tells us that "auto" +# is using the target, then we specifically add "host" to the list of +# modes to check. + +set cond_eval_modes { "auto" } + +gdb_test_multiple "show breakpoint condition-evaluation" "" { + -re -wrap "Breakpoint condition evaluation mode is auto \\(currently target\\)\\." { + + ## NOTE: Instead of testing with "auto" and "host" in this + ## case we only test with "host". This is because a GDB bug + ## prevents the "auto" (a.k.a. target) mode from working. + ## + ## Don't worry, this will be fixed in a later commit, and this + ## comment will be removed at that time. + ## + ## lappend cond_eval_modes "host" + + set cond_eval_modes { "host" } + pass $gdb_test_name + } + + -re -wrap "Breakpoint condition evaluation mode is auto \\(currently host\\)\\." { + pass $gdb_test_name + } +} + +foreach_with_prefix cond_eval $cond_eval_modes { + run_test $cond_eval +} diff --git a/gdb/testsuite/gdb.base/catch-signal-siginfo-cond.exp b/gdb/testsuite/gdb.base/catch-signal-siginfo-cond.exp index 182b2f25faa..f400fc03b28 100644 --- a/gdb/testsuite/gdb.base/catch-signal-siginfo-cond.exp +++ b/gdb/testsuite/gdb.base/catch-signal-siginfo-cond.exp @@ -18,7 +18,7 @@ # # (gdb) continue # Continuing. -# Error in testing breakpoint condition: +# Error in testing condition for breakpoint NUM: # Selected thread is running. # # Catchpoint 3 (signal SIGUSR1), 0x0000003615e35877 in __GI_raise (sig=10) at raise.c:56 diff --git a/gdb/testsuite/gdb.base/gnu-ifunc.exp b/gdb/testsuite/gdb.base/gnu-ifunc.exp index 0a435806409..22462bea233 100644 --- a/gdb/testsuite/gdb.base/gnu-ifunc.exp +++ b/gdb/testsuite/gdb.base/gnu-ifunc.exp @@ -281,7 +281,7 @@ proc misc_tests {resolver_attr resolver_debug final_debug} { # Also test a former patch regression: # Continuing. - # Error in testing breakpoint condition: + # Error in testing condition for breakpoint NUM: # Attempt to take address of value not located in memory. # # Breakpoint 2, main () at ./gdb.base/gnu-ifunc.c:33 diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint.exp b/gdb/testsuite/gdb.python/py-finish-breakpoint.exp index b6bd7a63c8f..e5a46874afd 100644 --- a/gdb/testsuite/gdb.python/py-finish-breakpoint.exp +++ b/gdb/testsuite/gdb.python/py-finish-breakpoint.exp @@ -188,7 +188,7 @@ with_test_prefix "finish in normal frame" { gdb_test "python TestBreakpoint()" "TestBreakpoint init" "set BP in condition" gdb_test "continue" \ - "test don't stop: 1.*test don't stop: 2.*test stop.*Error in testing breakpoint condition.*The program being debugged stopped while in a function called from GDB.*" \ + "test don't stop: 1.*test don't stop: 2.*test stop.*Error in testing condition for breakpoint ${::decimal}.*The program being debugged stopped while in a function called from GDB.*" \ "stop in condition function" gdb_test "continue" "Continuing.*" "finish condition evaluation"