From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x1035.google.com (mail-pj1-x1035.google.com [IPv6:2607:f8b0:4864:20::1035]) by sourceware.org (Postfix) with ESMTPS id 93CD0384F8BA for ; Fri, 25 Nov 2022 15:11:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 93CD0384F8BA 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-pj1-x1035.google.com with SMTP id o5-20020a17090a678500b00218cd5a21c9so4393011pjj.4 for ; Fri, 25 Nov 2022 07:11:36 -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=gREN8qFB0gWncG4c6Yko1ruxOdQYRT7C8pAVkUpKDCc=; b=imVyqiol+RotVMHq/8fqmJSa/fD0ZhgfTTz7BWSkIqRAECwv101TwVl4eW6c7S+DlB z9CscAgDupzpBPddG6aR0A8WDOx4bPGDDhAykeK0OwB+e+mhzze29LTEpCF0aqCf4PqF gW7cpAcYqlckyPt92OQ3Nvmh9xCCGRPVXz/FQ2v9haTXFz2T5HNCh4RTqSp9eu1Eq/95 TB3xXFu57PYr1w3HcByQ0N9IxIcodb8i3VD7a9oGHf8eYu9C1l6neCfAMrKqTHZH+aJP AZnDR6RuMTTcjVEdzkNWmnd1eFB/H8QgQ7PYdcmtCdjpEgRVkAeeVPy0n34h44YZdtGf flsg== 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=gREN8qFB0gWncG4c6Yko1ruxOdQYRT7C8pAVkUpKDCc=; b=J6wvuGrOoAUL+/PPgmYHHDK0Z5QNdOqJopOpF8dt+e5u0VUV5e7KmhU9BPTi1/woyj 0pEjsJPzDk1PgfJj9XKWGKn8jEsHg3HCslmTUO0MSfrXEx/uemfzTlPbdsP2fEPXf2f7 DFD9XGFy/zWElSHyF9zNnsM4wTP/gAOfLnV3FxSiP4kaYd4ep2Um/0UC3VqHbV6U9WNT IJqYQ2+NEWl2tF7w1zdrK0bW2qibf79OT2Pw9nbg4XAZjG3zKp7nFnH0Gmdrxox52L9M zK5UhrCxKr4EvEw0z+0dFWikXe1gHSPCdb5JboXjLpXWrGNIxLrky+4RBtnzGNYAa5tW QeBQ== X-Gm-Message-State: ANoB5pnUIWZ6x/M784nSMzNX4iNFa3z/QGg5iD8oZjJeohoZFB1xszCd DvlCR4RUNGlc8u+zG0sIMX0= X-Google-Smtp-Source: AA0mqf4O78S15rF8jPlRpNSNsO/swX7J9L0mOiCyBFUjFrVFL8apJ1kv3zNo4zW9yszQSQ5d8ieNJQ== X-Received: by 2002:a17:902:bc4a:b0:189:6795:d945 with SMTP id t10-20020a170902bc4a00b001896795d945mr3384512plz.136.1669389095619; Fri, 25 Nov 2022 07:11:35 -0800 (PST) Received: from [192.168.2.107] (61-220-36-70.hinet-ip.hinet.net. [61.220.36.70]) by smtp.gmail.com with ESMTPSA id o13-20020a170903210d00b00186616b8fbasm3526349ple.10.2022.11.25.07.11.34 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 25 Nov 2022 07:11:35 -0800 (PST) Message-ID: <4fc32997-d555-1aeb-1b57-fce152a33540@gmail.com> Date: Fri, 25 Nov 2022 23:11:33 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.5.0 Subject: [PING^2] [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> In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.8 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,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/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") >