From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pl1-x629.google.com (mail-pl1-x629.google.com [IPv6:2607:f8b0:4864:20::629]) by sourceware.org (Postfix) with ESMTPS id E32373858C66 for ; Thu, 12 Jan 2023 18:34:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E32373858C66 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-pl1-x629.google.com with SMTP id jn22so21047627plb.13 for ; Thu, 12 Jan 2023 10:34:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:content-language:references :to:from:subject:user-agent:mime-version:date:message-id:from:to:cc :subject:date:message-id:reply-to; bh=xDGKjClJgR6GeVkQqxqHtUTbIEtA9GkHvR/85YS5gdA=; b=mZdw3khHdNwnIguVw994OV3Pz1HRZTZhxSzj5SyvWfxBqwGc5tacXaM70Zs313evPH 093q+frJynm0vWt6SRggmisKtj9N8WHzp+cse90Lf0Jk/LeO/TxmC4kVYl93wZ/DrArT +Mrn2FgLIwzAd2371hfMJhjj2L6hCs4CTQJ+0lUxT0jkBtzD9fNeDbi7jn0qVkHp44I8 c5HQP+P47Kk547LdvpVN6vW/sna6l9r6cmRwSvKPFr5tFpqUWlfKzhzScyGDgednM/pz 0ksMlTnAW+UUFZgEqy8nnd1LZi7BM5E2QdBBSS/IJCAMT0Q5fbYjanSrr4cU7d2guF+7 zTnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:content-language:references :to:from:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=xDGKjClJgR6GeVkQqxqHtUTbIEtA9GkHvR/85YS5gdA=; b=xSlbcOQy3qHChVXEYxwwrp89pqyxwbpU5m75FzUCrLgqeQ1g111Q93k9gCaLMBmPdC 4teA/tyFwmksbJpQkqUJIZB6m1j7RfaTWQrUFnJPLihMkznhGeO1hffnCVTwplkbSTyr txDYMaL1K9fTQwdqw3EVkq74DT73TORs5xO2AElB/ZrrthzkVud2W57n1F7RbjLOXOQt ezdDDqJFRzECLrTg43OFG3i2fn5GFXMIf1AJiH2hy+DfNmYocCI5mDR5WMxLWXTMgHgT X8sYJM8h/NV6xhVj07NBrOYUcYezuHOaLgubpmLnBBKT2qy5NQlI9VYOIYjoDlnu57Y0 ZvyQ== X-Gm-Message-State: AFqh2koPqnLvgfduMGUUefl0Nq1UGJqj9QIIuZfj2P8uKOULIaLhLCMB JwGQruQtF0TA/15G13xcna0= X-Google-Smtp-Source: AMrXdXswmp8jbk9zJgSPC+6eajHMEZkAFMeLYzZha23xwJNBx4A76xIlQEavpbSqfQGlBxJSeLirZg== X-Received: by 2002:a17:903:22c5:b0:193:2ed4:5615 with SMTP id y5-20020a17090322c500b001932ed45615mr21906931plg.29.1673548466793; Thu, 12 Jan 2023 10:34:26 -0800 (PST) Received: from [192.168.2.101] (61-220-36-70.hinet-ip.hinet.net. [61.220.36.70]) by smtp.gmail.com with ESMTPSA id 21-20020a170902c21500b00189c4b8ca21sm107377pll.18.2023.01.12.10.34.25 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 12 Jan 2023 10:34:26 -0800 (PST) Message-ID: <5a11d09b-99a6-0247-b8f0-0c2aa4c23578@gmail.com> Date: Fri, 13 Jan 2023 02:34:22 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: Re: [PING^7] [PATCH v3] [PR python/29603] Disable out-of-scope watchpoints From: Johnson Sun To: LancelotSIX , gdb-patches@sourceware.org References: <20221020175707.193041-1-j3.soon777@gmail.com> <20221020181101.193226-1-j3.soon777@gmail.com> <4fc32997-d555-1aeb-1b57-fce152a33540@gmail.com> <23ce74fe-1d98-8b22-85f9-9b825c81b66d@gmail.com> <8cf0cf4f-9370-749c-13a3-665a5c703115@gmail.com> <262532fd-3e7b-7936-070a-2b56ccd6495a@gmail.com> <9099d833-147a-d9ae-e969-579af15a6003@gmail.com> Content-Language: en-US In-Reply-To: <9099d833-147a-d9ae-e969-579af15a6003@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.0 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,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 List-Id: Ping for: . Johnson On 12/28/2022 12:40 AM, JohnsonSun wrote: > Ping for: > . > > Johnson > > On 12/21/2022 6:08 AM, Johnson Sun wrote: >> Ping for: >> . >> >> Johnson >> >> On 12/13/2022 5:44 AM, Johnson Sun wrote: >>> Ping for: >>> . >>> >>> Johnson >>> >>> On 12/5/2022 12:45 AM, Johnson Sun wrote: >>>> Ping for: >>>> . >>>> >>>> Johnson >>>> >>>> On 11/25/2022 11:11 PM, Johnson Sun wrote: >>>>> Ping for: >>>>> . >>>>> >>>>> Johnson >>>>> >>>>> On 11/18/2022 8:17 PM, JohnsonSun wrote: >>>>>> Ping for: >>>>>> . >>>>>> >>>>>> Johnson >>>>>> >>>>>> On 10/21/2022 2:11 AM, Johnson Sun wrote: >>>>>>> Currently, when a local software watchpoint goes out of scope, >>>>>>> GDB sets the >>>>>>> watchpoint's disposition to `delete at next stop' and then >>>>>>> normal stops >>>>>>> (i.e., stop and wait for the next GDB command). When GDB normal >>>>>>> stops, it >>>>>>> automatically deletes the breakpoints with their disposition set to >>>>>>> `delete at next stop'. >>>>>>> >>>>>>> Suppose a Python script decides not to normal stop when a local >>>>>>> software >>>>>>> watchpoint goes out of scope, the watchpoint will not be >>>>>>> automatically >>>>>>> deleted even when its disposition is set to `delete at next stop'. >>>>>>> >>>>>>> Since GDB single-steps the program and tests the watched >>>>>>> expression after each >>>>>>> instruction, not deleting the watchpoint causes the watchpoint >>>>>>> to be hit many >>>>>>> more times than it should, as reported in PR python/29603. >>>>>>> >>>>>>> This was happening because the watchpoint is not deleted or >>>>>>> disabled when >>>>>>> going out of scope. >>>>>>> >>>>>>> This commit fixes this issue by disabling the watchpoint when >>>>>>> going out of >>>>>>> scope. It also adds a test to ensure this feature isn't >>>>>>> regressed in the >>>>>>> future. >>>>>>> >>>>>>> Two other solutions seem to solve this issue, but are in fact >>>>>>> inappropriate: >>>>>>> 1. Automatically delete breakpoints on all kinds of stops >>>>>>>     (in `fetch_inferior_event'). This solution is very slow >>>>>>> since the deletion >>>>>>>     requires O(N) time for N breakpoints. >>>>>>> 2. Disable the watchpoint after the watchpoint's disposition is >>>>>>> set to >>>>>>>     `delete at next stop' (in `watchpoint_del_at_next_stop'). >>>>>>> This solution >>>>>>>     modifies a non-extension-related code path, and isn't >>>>>>> preferred since this >>>>>>>     issue cannot occur without extension languages. (gdb scripts >>>>>>> always normal >>>>>>>     stop before continuing execution) >>>>>>> >>>>>>> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29603 >>>>>>> --- >>>>>>>   gdb/breakpoint.c                           |  2 + >>>>>>>   gdb/testsuite/gdb.python/py-watchpoint.c   | 27 ++++++++++++ >>>>>>>   gdb/testsuite/gdb.python/py-watchpoint.exp | 48 >>>>>>> ++++++++++++++++++++++ >>>>>>>   gdb/testsuite/gdb.python/py-watchpoint.py  | 30 ++++++++++++++ >>>>>>>   4 files changed, 107 insertions(+) >>>>>>>   create mode 100644 gdb/testsuite/gdb.python/py-watchpoint.c >>>>>>>   create mode 100644 gdb/testsuite/gdb.python/py-watchpoint.exp >>>>>>>   create mode 100644 gdb/testsuite/gdb.python/py-watchpoint.py >>>>>>> >>>>>>> diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c >>>>>>> index bff3bac7d1a..15f4ae2131c 100644 >>>>>>> --- a/gdb/breakpoint.c >>>>>>> +++ b/gdb/breakpoint.c >>>>>>> @@ -5340,6 +5340,8 @@ bpstat_check_breakpoint_conditions (bpstat >>>>>>> *bs, thread_info *thread) >>>>>>>     /* Evaluate extension language breakpoints that have a >>>>>>> "stop" method >>>>>>>        implemented.  */ >>>>>>>     bs->stop = breakpoint_ext_lang_cond_says_stop (b); >>>>>>> +  if (b->disposition == disp_del_at_next_stop) >>>>>>> +    disable_breakpoint(b); >>>>>>>       if (is_watchpoint (b)) >>>>>>>       { >>>>>>> diff --git a/gdb/testsuite/gdb.python/py-watchpoint.c >>>>>>> b/gdb/testsuite/gdb.python/py-watchpoint.c >>>>>>> new file mode 100644 >>>>>>> index 00000000000..4e1760bb05b >>>>>>> --- /dev/null >>>>>>> +++ b/gdb/testsuite/gdb.python/py-watchpoint.c >>>>>>> @@ -0,0 +1,27 @@ >>>>>>> +/* This testcase is part of GDB, the GNU debugger. >>>>>>> + >>>>>>> +   Copyright 2022 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 >>>>>>> .  */ >>>>>>> + >>>>>>> +#include >>>>>>> + >>>>>>> +int >>>>>>> +main (void) >>>>>>> +{ >>>>>>> +  int i; >>>>>>> +  for (i = 0; i < 3; i++) >>>>>>> +    printf ("%d", i); >>>>>>> +  return 0; >>>>>>> +} >>>>>>> diff --git a/gdb/testsuite/gdb.python/py-watchpoint.exp >>>>>>> b/gdb/testsuite/gdb.python/py-watchpoint.exp >>>>>>> new file mode 100644 >>>>>>> index 00000000000..ac58d75c523 >>>>>>> --- /dev/null >>>>>>> +++ b/gdb/testsuite/gdb.python/py-watchpoint.exp >>>>>>> @@ -0,0 +1,48 @@ >>>>>>> +# Copyright (C) 2022 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 that Watchpoints are deleted after use. >>>>>>> + >>>>>>> +load_lib gdb-python.exp >>>>>>> + >>>>>>> +standard_testfile >>>>>>> + >>>>>>> +if {[prepare_for_testing "failed to prepare" $testfile >>>>>>> $srcfile]} { >>>>>>> +    return -1 >>>>>>> +} >>>>>>> + >>>>>>> +# Skip all tests if Python scripting is not enabled. >>>>>>> +if { [skip_python_tests] } { continue } >>>>>>> + >>>>>>> +if ![runto_main] then { >>>>>>> +    return 0 >>>>>>> +} >>>>>>> + >>>>>>> +# For remote host testing >>>>>>> +set pyfile [gdb_remote_download host >>>>>>> ${srcdir}/${subdir}/${testfile}.py] >>>>>>> + >>>>>>> +gdb_test_no_output "set can-use-hw-watchpoints 0" "Don't use >>>>>>> hardware watchpoints" >>>>>>> +gdb_test "python print(len(gdb.breakpoints()))" "1" "check >>>>>>> default BP count" >>>>>>> +gdb_test "source $pyfile" ".*Python script imported.*" \ >>>>>>> +    "import python scripts" >>>>>>> +gdb_test "python print(len(gdb.breakpoints()))" "2" "check >>>>>>> modified BP count" >>>>>>> +gdb_test_sequence "continue" "run until program stops" { >>>>>>> +    "Watchpoint Hit: ." >>>>>>> +    "\[\r\n\]+Watchpoint . deleted because the program has left >>>>>>> the block in" >>>>>>> +    "\[\r\n\]+which its expression is valid\." >>>>>>> +    "Watchpoint Hit: ." >>>>>>> +    "\[\r\n\]+012\\[Inferior 1 \\(process .*\\) exited >>>>>>> normally\\]" >>>>>>> +} >>>>>>> +gdb_test "python print(len(gdb.breakpoints()))" "1" "check BP >>>>>>> count" >>>>>>> diff --git a/gdb/testsuite/gdb.python/py-watchpoint.py >>>>>>> b/gdb/testsuite/gdb.python/py-watchpoint.py >>>>>>> new file mode 100644 >>>>>>> index 00000000000..ce5dee118ad >>>>>>> --- /dev/null >>>>>>> +++ b/gdb/testsuite/gdb.python/py-watchpoint.py >>>>>>> @@ -0,0 +1,30 @@ >>>>>>> +# Copyright (C) 2022 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 >>>>>>> . >>>>>>> + >>>>>>> + >>>>>>> +class MyBreakpoint(gdb.Breakpoint): >>>>>>> +    def __init__(self, *args, **kwargs): >>>>>>> +        gdb.Breakpoint.__init__(self, *args, **kwargs) >>>>>>> +        self.i = 0 >>>>>>> + >>>>>>> +    def stop(self): >>>>>>> +        self.i += 1 >>>>>>> +        print("Watchpoint Hit:", self.i) >>>>>>> +        return False >>>>>>> + >>>>>>> + >>>>>>> +MyBreakpoint("i", gdb.BP_WATCHPOINT) >>>>>>> + >>>>>>> +print("Python script imported") >>>>>> >