From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by sourceware.org (Postfix) with ESMTPS id A40933858D28 for ; Sun, 9 Apr 2023 20:49:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A40933858D28 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-x1030.google.com with SMTP id y11-20020a17090a600b00b0024693e96b58so1566532pji.1 for ; Sun, 09 Apr 2023 13:49:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1681073397; 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=hW588sPIonxrixSGaBb18BzulFkYLNJyQAGzjxpNI7Q=; b=OGALSgkwoBPc27GeQBySWO31MvXI8TGtqlSMJ86GHYnsxFBt/qyyBpjvKRcjHHDoob 5mxiEN+cFJfKtUtGmvYtUEHTcWwjpMnn9ID8IO5zW0ShprH2f9a8lAoMkaRSZGFvmMQ9 9AG1NWfspoyFqneJf1WREXIzK3Z5dFdIb3D1BP0hbnQPCb16dLbyOrqRuSdS93eydX0i 2gfDpcPqB9gswzoP8fu/r/fd1BnyOhE+LbsWAX7TfJHoeSld0gaaixiUW+f2XTGPVa4k AGQpR8klS56Al17lFnSessNStePjG+fw+EBU1T+XxjKdLbuzTNXSFDb8uNYCbEOQ3Woz w+jQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1681073397; 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=hW588sPIonxrixSGaBb18BzulFkYLNJyQAGzjxpNI7Q=; b=J619+YOzWvX/9Pf0/tJudydS8Xp9p/uoVLlXBwITVeRL00UkHpvZRDSjTSNrUykS00 /RPdmKwbaN1Y0WahsyoOVgENgZqk2k40Afiq9tf8rwYbkQzbG/uuyB4o9ftJK9THDPng 6A4w+YRFbFIITALEyr9uz/1zOizq+Y+OfasSHVGigtMLI9F7nCNdzp/HRRQC5FHV/8va j29ZRmOf88bmw0jFTafmo5XgSKpAhzZyia6+piAgfaCIcIVdHcEcFLNWC9RGU+WIS4U6 58G60K51Lwd1QNyB1U7laqpZAwH3VnZaKo9i/IX4AeRi0DBnw5GcdlIe1my/xrfv+yvn zerw== X-Gm-Message-State: AAQBX9cUgeIxZZW5vUnwaA6xDs0HlyDXUgp1rO+KoPkOnKVJ+8/xXRvr f5cMlnY+vAaIkPcIlJqktUM= X-Google-Smtp-Source: AKy350YORqKo0caY4L0BOOzpxQM0WITK+WSuvmT/OpV1TtDcgw+h06FlJ4Ffz6vCuzxkLx13+nQPFg== X-Received: by 2002:a17:902:f9c7:b0:1a5:2fbd:d094 with SMTP id kz7-20020a170902f9c700b001a52fbdd094mr3882663plb.9.1681073397468; Sun, 09 Apr 2023 13:49:57 -0700 (PDT) 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 g2-20020a1709026b4200b0019719f752c5sm6287804plt.59.2023.04.09.13.49.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 09 Apr 2023 13:49:57 -0700 (PDT) Message-ID: Date: Mon, 10 Apr 2023 04:49:55 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.9.1 Subject: [PING] [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.2 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: 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") >