From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 BEC053858C5F for ; Mon, 3 Apr 2023 13:51:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BEC053858C5F Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1680529868; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=ZEJze29aVPYJJn3vWDoFT6P0G2kucbxV8IlTOkRyuTM=; b=PcSJfxs6Wed2Uqf60NJU3HdUkD/wGB9rtjlW1GSniAzYvU0LvzylBdj0vl82OWIm4rjxsY tBHIFBVEJ3gzBajyt96FD4lB3GQmRL5OidTW7nJHrrUbxTGHrFOb5mEZfPLnBpL8BKuXX8 FrqP5rKoWKLBDMxptT2QvxiI9+5jF6o= Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-365-hxO7yNhdN-6DF475DeyiHA-1; Mon, 03 Apr 2023 09:51:07 -0400 X-MC-Unique: hxO7yNhdN-6DF475DeyiHA-1 Received: by mail-qt1-f197.google.com with SMTP id u1-20020a05622a198100b003e12a0467easo19811282qtc.11 for ; Mon, 03 Apr 2023 06:51:07 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680529866; h=mime-version:message-id:date:references:in-reply-to:subject:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ZEJze29aVPYJJn3vWDoFT6P0G2kucbxV8IlTOkRyuTM=; b=W4BReSX8eeaHKxc4qvVYcuzPUGcVMVmoGpOwWWqmqPPbcjekYwQhuYrqCvT8uke/CH pu3LfIKE3oRi+LL3okbuL+oNTO4+buvuFZiveF4hNnpyha7Lt5ZTjpXHmEny5IMrMdy7 kS54xrmVkjf1oR9YcjUn9P3nu3get5tBHTGBo9ImPkw9GqzsRoOv9zI3ol1apn+xRflO hCi0T24n6GAa32KFtNRtBiCANBqb9aVZkYfnQGQGEDZZxyvOenaZ5onrjm7BSuMLZkgR ZxL24bmwTdKMvFDmn6dCT7SA1rw3hV6MQG9jz1Uo2wm5QrtrgUoIqyRjSKbZraU+/ukR QhFQ== X-Gm-Message-State: AAQBX9fyxADSOadtuH1yUgjhTdwJky93nUIjGBWIr08hQVgm5vg0WN3n Z9DR0tcIoV0FF4kfgjuoiX5W+U4b8iaVGyJ6jjVoGk2iaoARzoBgE5+n8h5gELhaJmZWh7ZL+oZ Z85xbP4POS6Hwr+s4fG/YJtEA8tYe2D9CxZS2Uo3NyFAgxcfVk39PyTpDFhV2BQkz6Y/47yQojH UqxA0b1g== X-Received: by 2002:ad4:4ee7:0:b0:56e:ae3c:129d with SMTP id dv7-20020ad44ee7000000b0056eae3c129dmr32984249qvb.0.1680529866349; Mon, 03 Apr 2023 06:51:06 -0700 (PDT) X-Google-Smtp-Source: AKy350Y3X6NSWdd3urevingUFonkrSJg5RlQX6y6+91qdWxbWpCcfQzSiyW9J60i1tddleXcW5CF0g== X-Received: by 2002:ad4:4ee7:0:b0:56e:ae3c:129d with SMTP id dv7-20020ad44ee7000000b0056eae3c129dmr32984183qvb.0.1680529865730; Mon, 03 Apr 2023 06:51:05 -0700 (PDT) Received: from localhost (95.72.115.87.dyn.plus.net. [87.115.72.95]) by smtp.gmail.com with ESMTPSA id ny8-20020a056214398800b005dd8b934584sm2637559qvb.28.2023.04.03.06.51.05 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Apr 2023 06:51:05 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Subject: Re: [PATCHv5 05/11] gdb: don't always print breakpoint location after failed condition check In-Reply-To: References: Date: Mon, 03 Apr 2023 14:51:04 +0100 Message-ID: <87fs9hcbw7.fsf@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain 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 List-Id: Andrew Burgess writes: > 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. I went ahead and pushed this commit. If there are any problems, please let me know, I'm happy to address any issues. Thanks, Andrew > --- > 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 dcd42e6b2e2..445b46a706a 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\\."] > -- > 2.25.4