From patchwork Tue Feb 28 16:42:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 65787 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 5C1D4384FB7B for ; Tue, 28 Feb 2023 16:44:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5C1D4384FB7B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677602649; bh=O5AN0kLz0j7tdA2ZKEcjpvcgbXOn/aW5JCO7wHHkx0o=; 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=IwpO1u3s/0ua39qTOMPyR83PyO6Q1VrwF71xJn+79FkgUfL5Ljlx4AETnPNr/C4Fd 87WB4HOPgEM2ONAYM2pEpiV1ZrtW3xcrUtROKTPIJ7ue92lH6cnhGLVvYt/k+EC15d TaNJb4p30OHish3umrT91Vno4GUwmhlp6ZFXzLqk= 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 5195C3858410 for ; Tue, 28 Feb 2023 16:42:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5195C3858410 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-61-Lhmom_-MOkuIoFRhkp0FXQ-1; Tue, 28 Feb 2023 11:42:30 -0500 X-MC-Unique: Lhmom_-MOkuIoFRhkp0FXQ-1 Received: by mail-ed1-f69.google.com with SMTP id w11-20020a05640234cb00b004b3247589b3so12079359edc.23 for ; Tue, 28 Feb 2023 08:42:30 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677602549; 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=O5AN0kLz0j7tdA2ZKEcjpvcgbXOn/aW5JCO7wHHkx0o=; b=rCOTp52muN/vV+/ggIXvef3nmeL6qp7F3VHuUh6qvYZEMZrltRxWMZZKaznfOc4A9j 4GX67+bh4li0w4AhDVr/SHFSIt8/tzhADshOnAdHlUOSvRY4RD3OkyOeAYZh67lqv0cJ qeexiQpUuPzlD1hLay9TFS53XNljez2GFkwwkJnqYtOdtUepm8HjDAvA8038Ce/QRafe zecfppYlyBVEBKBjRe9JgczwYZO6tSbHQQIBphpXUBPyPiFXfDotf2pWZlp4DoN0cEOi phqy8sYgcIoex42StNzfyEFENgrFSuN+jfdbY2uwZCeFoGELU01kHsmF3AaSjKhfbkvD owAQ== X-Gm-Message-State: AO0yUKUTGEuby4UgsUkJPg8sLU1Qdoxl2MDJQ28MwGYD2W0ksBS7/gkg /onY7zRJUogBDgsu5yciKr9UeFd055T8NQs8UBF4Eb/CDlBbH+ZKyMryBM0CsZsDxI1ACz6D3Ob BsmH/oPH0A8F9wSWTnkhKSUZhgcrRviaMNQhJfC6a4hcG244GcEpP+AG9rHcZfUafRD1k63FVdV VFErE= X-Received: by 2002:a17:906:7690:b0:8b1:7ae8:ba79 with SMTP id o16-20020a170906769000b008b17ae8ba79mr3050626ejm.30.1677602549204; Tue, 28 Feb 2023 08:42:29 -0800 (PST) X-Google-Smtp-Source: AK7set8Zl6zo10FZ3d6fmVknGTf9ZyzfOd7h+JL6BL/EpUutDGDekBQ4gMAxbsuU6zPMSN1Lku+YVA== X-Received: by 2002:a17:906:7690:b0:8b1:7ae8:ba79 with SMTP id o16-20020a170906769000b008b17ae8ba79mr3050609ejm.30.1677602548908; Tue, 28 Feb 2023 08:42:28 -0800 (PST) Received: from localhost (95.72.115.87.dyn.plus.net. [87.115.72.95]) by smtp.gmail.com with ESMTPSA id ce7-20020a170906b24700b008ec43ae626csm4615979ejb.167.2023.02.28.08.42.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 08:42:28 -0800 (PST) To: gdb-patches@sourceware.org Cc: Andrew Burgess Subject: [PATCHv4 06/12] gdb: don't always print breakpoint location after failed condition check Date: Tue, 28 Feb 2023 16:42:11 +0000 Message-Id: <926ad297a1712f1e3c00b0338769f86ca2eab2d9.1677602051.git.aburgess@redhat.com> 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, 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" Consider the following session: (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 condition for breakpoint 1: The program being debugged stopped while in a function called from GDB. Evaluation of the expression containing the function (some_func) will be abandoned. When the function is done executing, GDB will silently stop. Breakpoint 1, 0x0000000000401116 in some_func () at bpcond.c:5 5 return *p; (gdb) What happens here is the breakpoint condition includes a call to an inferior function, and the inferior function segfaults. We can see that GDB reports the segfault, and then gives an error message that indicates that an inferior function call was interrupted. After this GDB appears to report that it is stopped at Breakpoint 1, inside some_func. I find this second stop report a little confusing. While it is true that GDB stopped as a result of hitting breakpoint 1, I think the message GDB currently prints might give the impression that GDB is actually stopped at a location of breakpoint 1, which is not the case. Also, I find the second stop message draws attention away from the "Program received signal SIGSEGV, Segmentation fault" stop message, and this second stop might be thought of as replacing in someway the earlier message. In short, I think things would be clearer if the second stop message were not reported at all, so the output should, I think, look like this: (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 condition for breakpoint 1: The program being debugged stopped while in a function called from GDB. Evaluation of the expression containing the function (some_func) will be abandoned. When the function is done executing, GDB will silently stop. (gdb) The user can still find the number of the breakpoint that triggered the initial stop in this line: Error in testing condition for breakpoint 1: But there's now only one stop reason reported, the SIGSEGV, which I think is much clearer. To achieve this change I set the bpstat::print field when: (a) a breakpoint condition evaluation failed, and (b) the $pc of the thread changed during condition evaluation. I've updated the existing tests that checked the error message printed when a breakpoint condition evaluation failed. --- gdb/breakpoint.c | 12 ++++++++++++ gdb/testsuite/gdb.base/infcall-failure.exp | 18 ++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index c04b2e05d87..89a0ffeabb9 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -5534,6 +5534,7 @@ bpstat_check_breakpoint_conditions (bpstat *bs, thread_info *thread) else within_current_scope = false; } + CORE_ADDR pc_before_check = get_frame_pc (get_selected_frame (nullptr)); if (within_current_scope) { try @@ -5545,6 +5546,17 @@ bpstat_check_breakpoint_conditions (bpstat *bs, thread_info *thread) exception_fprintf (gdb_stderr, ex, "Error in testing condition for breakpoint %d:\n", b->number); + + /* If the pc value changed as a result of evaluating the + condition then we probably stopped within an inferior + function call due to some unexpected stop, e.g. the thread + hit another breakpoint, or the thread received an + unexpected signal. In this case we don't want to also + print the information about this breakpoint. */ + CORE_ADDR pc_after_check + = get_frame_pc (get_selected_frame (nullptr)); + if (pc_before_check != pc_after_check) + bs->print = 0; } } else diff --git a/gdb/testsuite/gdb.base/infcall-failure.exp b/gdb/testsuite/gdb.base/infcall-failure.exp index 214a64f8de3..5ad179a089d 100644 --- a/gdb/testsuite/gdb.base/infcall-failure.exp +++ b/gdb/testsuite/gdb.base/infcall-failure.exp @@ -78,10 +78,7 @@ proc_with_prefix run_cond_hits_breakpoint_test { async_p non_stop_p } { "The program being debugged stopped while in a function called from GDB\\." \ "Evaluation of the expression containing the function" \ "\\(func_bp\\) will be abandoned\\." \ - "When the function is done executing, GDB will silently stop\\." \ - "" \ - "Breakpoint ${bp_1_num}, \[^\r\n\]+" \ - "${::decimal}\\s+\[^\r\n\]+Second breakpoint\[^\r\n\]+"] + "When the function is done executing, GDB will silently stop\\."] } # Start GDB according to ASYNC_P and NON_STOP_P, then call an inferior @@ -138,13 +135,12 @@ proc_with_prefix run_cond_hits_segfault_test { async_p non_stop_p } { "${::hex} in func_segfault \\(\\) at \[^\r\n\]+:${::segv_line}" \ "${::decimal}\\s+\[^\r\n\]+Segfault here\[^\r\n\]+" \ "Error in testing condition for breakpoint ${bp_1_num}:" \ - "The program being debugged stopped while in a function called from GDB\\." \ + "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" \ "\\(func_segfault\\) will be abandoned\\." \ - "When the function is done executing, GDB will silently stop\\." \ - "" \ - "Breakpoint ${bp_1_num}, \[^\r\n\]+" \ - "${::decimal}\\s+\[^\r\n\]+Segfault here\[^\r\n\]+"] + "When the function is done executing, GDB will silently stop\\."] } # Start GDB according to ASYNC_P and NON_STOP_P, then call an inferior @@ -168,7 +164,9 @@ proc_with_prefix run_call_hits_segfault_test { async_p non_stop_p } { "Program received signal SIGSEGV, Segmentation fault\\." \ "${::hex} in func_segfault \\(\\) at \[^\r\n\]+:${::segv_line}" \ "${::decimal}\\s+\[^\r\n\]+Segfault here\[^\r\n\]+" \ - "The program being debugged stopped while in a function called from GDB\\." \ + "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" \ "\\(func_segfault\\) will be abandoned\\." \ "When the function is done executing, GDB will silently stop\\."]