From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x536.google.com (mail-pg1-x536.google.com [IPv6:2607:f8b0:4864:20::536]) by sourceware.org (Postfix) with ESMTPS id 1535638493F4 for ; Sun, 4 Dec 2022 16:45:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1535638493F4 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-pg1-x536.google.com with SMTP id s196so8507479pgs.3 for ; Sun, 04 Dec 2022 08:45:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:references:to:from :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=qKDseqUZ/1y9J6lnn4b1qSig8zu30XiAErfjwlvJf+I=; b=P0Lxxshr04eedVKkxGVZ54ecUmoNXW1NfvYz7mpEclfjCy+5ZJtQBuC/gCLUmYA1sw wSiqRWYJUJvfs7IYhOQ3TXJZjdC1hr4fBfpYIDuksmxl6X3yol621zRkFIJBgeZkTWYE HIfWsIVJT4zBgQyedPJA1WQNsooHiwZnquSJSuEX2QrIy+0whSgx7cDFYVp+nmlo01FU expak56ro6jG61c9t4CrWaAYcZIY9TA/dml8KXQ1/9FRIh9GmAlU6X8Pbnsofw5Q4uw6 UmDtF5mjoxLsPqYLC1Ed2WxfdRz2NNISkZQj2Jt576QCXhTUrTGnoJe8xN530bXrgFFL fpnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:references:to:from :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=qKDseqUZ/1y9J6lnn4b1qSig8zu30XiAErfjwlvJf+I=; b=UHrQoL076KADzKT478ticGlWzaTtDBinAhqc091vRs+38Y/WXQJcjeiuXhByGXqF3O sXyLGXeEZbyIKuCI78TcfO6VAL7wwZ5e6jEQSY5F4dY3KXch9jeMb7nibrMZ9pZvCE6m RaiMjMjYnWDa+DvmuITsjLZQOFmSHi2qokMAYMwwp6YZJJOFgxMn/bqBU2jWe2rACmnh uXk5t38bPkDT5iaqMFWNUskXy8bboGDgOWDdnf4ON0Kq03XsK5wusfZjvVoG/3tC3gNr ZXfIphMokw2gjfoQxK2Wj4hijHY3zbHoCPYyfE/OI0z51Ngc4g/lQ0fUteIhSsBzecPL 8lmg== X-Gm-Message-State: ANoB5pkda6wCfdTAqGwSIYViR0iwumGo0g09RrINg6duIemhPL7DxGvF C2a/RXICy4mc+bW2FwXSZ5g= X-Google-Smtp-Source: AA0mqf5ck6uihnTmwy7Gl2M1f/Jc9IvKLsz0QWjbTLGtGFig4IzsqDpOQgVUdiu3u4bFIxqP7u1ZBg== X-Received: by 2002:aa7:9a4e:0:b0:563:b1bc:7f98 with SMTP id x14-20020aa79a4e000000b00563b1bc7f98mr60715691pfj.29.1670172339969; Sun, 04 Dec 2022 08:45:39 -0800 (PST) Received: from [10.14.0.2] ([45.144.227.14]) by smtp.gmail.com with ESMTPSA id q6-20020a170902a3c600b00178b77b7e71sm8949129plb.188.2022.12.04.08.45.38 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 04 Dec 2022 08:45:39 -0800 (PST) Message-ID: <23ce74fe-1d98-8b22-85f9-9b825c81b66d@gmail.com> Date: Mon, 5 Dec 2022 00:45:38 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.5.1 Subject: Re: [PING^3] [PATCH v3] [PR python/29603] Disable out-of-scope watchpoints Content-Language: en-US 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> In-Reply-To: <4fc32997-d555-1aeb-1b57-fce152a33540@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.9 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 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") >>