From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by sourceware.org (Postfix) with ESMTPS id E14C23858C2C for ; Mon, 17 Apr 2023 18:18:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E14C23858C2C 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-x1033.google.com with SMTP id l9-20020a17090a3f0900b0023d32684e7fso14692888pjc.1 for ; Mon, 17 Apr 2023 11:18:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1681755499; x=1684347499; 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=3+kX9PuGqzG+pnm/5OEGcBSmgse8tHeHqqZVx5il3LM=; b=M4EDl+yh7bLzs6aCF/gM7smBhtCIGmYXUqNqbt+srPVRbtRWIe5m9c4d7Qd2kGxYMO 2QtOel8E09LzGiJTORYPNrWfOyktEm8C6leRkR3aCU9TkVdvbvdgtNVR8gT5fzHbHHXN G3ct6SAgOy/IqDbvkhGvYIKk4JYN0IrKIpq5dSGYx9g3pdHE+BBEOehRrqulOIrS71zR GcOGq0tZckLWVy/uA/wSqFNV9PTzo7DMvESXIVZ3pSCRgK0TKcnz5whVUMWt2tCrLQMw xRq8wGFtosqYuPOKGk/JBbq1JMD9OXI1VU6HrFrLWwYT81uPA01tCqxT/RG3DqC4w2lK cfiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1681755499; x=1684347499; 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=3+kX9PuGqzG+pnm/5OEGcBSmgse8tHeHqqZVx5il3LM=; b=OE1lnq+EKdV2syMo4UfnATxDqNjG/TxlDHxU7ljvO9GRDYFh7lF0Uk3HESJYXoFZos koeAkNKImjGC2BWJCvHS6DqWEMYnUBSdDrHrEkKEZlP7NlyBifWw1JAzV2N9xGJQvsyl YjpYZzjrevm1MRLkSlP019ieZyNxAifSscUEmDL2IeCRDddfsFYVHQQuUsT3pGul5NZx X9CYlvapIw1TQVEk/LQa9Ki5e4j+HgGHRa+TuoA34J+MnhpayXlLAxtxGtbIF1d+Zf+a 6vUHFqRewowlFY5iEKl7micqHe2P0ex1+pC66XfyKk1W40HI602+Mq930fLhQ6CQtRGT eswA== X-Gm-Message-State: AAQBX9fJ8IVsRK1CL5YtNugmcBJbw6pMuzF+t91XRuigbyq0uiHQiqXT 6hizoR5JZnmo+0xgdZn4ZxYFgQ6TcUpH5Q== X-Google-Smtp-Source: AKy350aNkfsWRuV/7PvbqH+DZ1Q8iq2twxxsQf/sVB6BFpGaqow2OCfASte9TLbzmGXzA8S4ZYWCBw== X-Received: by 2002:a05:6a20:7da8:b0:f0:b68:8764 with SMTP id v40-20020a056a207da800b000f00b688764mr3693767pzj.18.1681755498838; Mon, 17 Apr 2023 11:18:18 -0700 (PDT) Received: from [192.168.117.3] (sd237023.ching-de.ab.nthu.edu.tw. [140.114.237.23]) by smtp.gmail.com with ESMTPSA id c2-20020aa78802000000b0063b7a0b9cc5sm4567685pfo.186.2023.04.17.11.18.16 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 17 Apr 2023 11:18:17 -0700 (PDT) Message-ID: <88dcc8ca-b904-14d4-4c4c-94450b9f2414@gmail.com> Date: Tue, 18 Apr 2023 02:18:13 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.10.0 Subject: [PING^2] [PATCH v4] [PR python/29603] Disable out-of-scope watchpoints From: Johnson Sun To: SimonMarchi , LancelotSIX , gdb-patches@sourceware.org References: <0e614d96-52dc-6e14-ea23-8aca19c5414c@gmail.com> <20230323183118.3172-1-j3.soon777@gmail.com> Content-Language: en-US In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.1 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,T_SCC_BODY_TEXT_LINE 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 4/10/2023 4:49 AM, JohnsonSun wrote: > I forgot to add the `[PING]` prefix in the last email. Corrected in > this email. Thanks. > > Johnson > > On 4/10/2023 4:47 AM, JohnsonSun wrote: >> Ping for: >> >> >> Johnson >> >> On 3/24/2023 2:31 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. >>> >>> Calling `breakpoint_auto_delete' on all kinds of stops (in >>> `fetch_inferior_event') seem to solve this issue, but is in fact >>> inappropriate, since `breakpoint_auto_delete' goes over all breakpoints >>> instead of just going through the bpstat chain (which only contains the >>> breakpoints that were hit right now). >>> >>> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29603 >>> --- >>>   gdb/breakpoint.c                           |  1 + >>>   gdb/testsuite/gdb.python/py-watchpoint.c   | 27 +++++++++++ >>>   gdb/testsuite/gdb.python/py-watchpoint.exp | 54 >>> ++++++++++++++++++++++ >>>   gdb/testsuite/gdb.python/py-watchpoint.py  | 30 ++++++++++++ >>>   4 files changed, 112 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 bff3bac7d1..47dcf1e127 100644 >>> --- a/gdb/breakpoint.c >>> +++ b/gdb/breakpoint.c >>> @@ -1832,6 +1832,7 @@ watchpoint_del_at_next_stop (struct watchpoint >>> *w) >>>         w->related_breakpoint = w; >>>       } >>>     w->disposition = disp_del_at_next_stop; >>> +  disable_breakpoint (w); >>>   } >>>     /* Extract a bitfield value from value VAL using the bit >>> parameters contained in >>> diff --git a/gdb/testsuite/gdb.python/py-watchpoint.c >>> b/gdb/testsuite/gdb.python/py-watchpoint.c >>> new file mode 100644 >>> index 0000000000..0c58b31647 >>> --- /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 = -1; >>> +  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 0000000000..5504736629 >>> --- /dev/null >>> +++ b/gdb/testsuite/gdb.python/py-watchpoint.exp >>> @@ -0,0 +1,54 @@ >>> +# 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 "break 24" ".*" "set breakpoint before loop" >>> +gdb_test "continue" ".*" "run until reaching loop" >>> +gdb_test "clear" ".*" "delete the breakpoint before loop" >>> +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: 1" >>> +    "Watchpoint Hit: 2" >>> +    "Watchpoint Hit: 3" >>> +    "Watchpoint Hit: 4" >>> +    "Watchpoint 3 deleted because the program has left the block in" >>> +    "which its expression is valid\." >>> +    "Watchpoint Hit: 5" >>> +    "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 0000000000..c5fae00e93 >>> --- /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.n = 0 >>> + >>> +    def stop(self): >>> +        self.n += 1 >>> +        print("Watchpoint Hit:", self.n, flush=True) >>> +        return False >>> + >>> + >>> +MyBreakpoint("i", gdb.BP_WATCHPOINT) >>> + >>> +print("Python script imported") >> >