From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by sourceware.org (Postfix) with ESMTPS id D3F17384F48F for ; Fri, 18 Nov 2022 12:17:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D3F17384F48F 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-x1031.google.com with SMTP id h14so4351088pjv.4 for ; Fri, 18 Nov 2022 04:17:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=Wg9VwP8jCKQ6BhwMy5cp6h1XXzl9diIEnvqQw97mhVY=; b=AV35jborjenqzs8ENm4lt/hHpAyE741A/nBVzGAlm5/wxdd16H1C9dQq9rccsKNmte nGg7r51XcuNbv5J2Jr7wYjqo3dDlkY/Mu+HAxAilMOfzB6Ab2YRhWD74z/slGvVtKJI4 ebG4+qpMCzyTotidtn6UhxQKkKBxjTOYoEqVC9A705Z/bIioGGCZLPXUF2mhxWbXhfHP wFfjEauEWGhnyraZ66t/ETtogk5cVcRa9UY/4Y2va6KgU+l9Vuc99iTWVmZMZJdE2g/h Q0PRAKK3WJBOxlrgKjbTVPG6nlxg43LcSuRP/zG7kfV7SvO/7mNlzTVYaEnsy6wz7T2J oWXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Wg9VwP8jCKQ6BhwMy5cp6h1XXzl9diIEnvqQw97mhVY=; b=dWFbPOSqPxn6phPvZyi/4zGiBYDhKQ4ilGWalseFEP6ClYwvvytpsuDH1aq88rVsGG +mZwQbdjUMku/cyGX3vIjRfe1OPFqiEii8pmf91yGlvi6mGv7JJ/e8bQAR3uot/Tc3Zd NzJ8+xCo9/2RtrDFKEh4he0h2WGNHoLv4Z4I3XPvgNwT1BV/2vbGYx97KOjE6UwBfhRk UH1IzFH5EDRUU/aL/auf5VJxfPtOKAD+Nb2g+LjqdJojIZWj8c2t8QmwY9ch3qls639a 88ybBX5A+nJZoaPettAhd2vVaW4U9ion2lC0gLe9xN200poiz8tku3UYyv9FAjvPcOT/ 6+sg== X-Gm-Message-State: ANoB5pnaRaSiymlxlXrDfbU2RUBhXqCg6nTs96VQDq7l1WeJgfyU3atB v8UHKafl6dkHeLyZDWd7yXA= X-Google-Smtp-Source: AA0mqf61GZKUU1aFhjPKtb8WE21cPECF3LPAn5b/nl7ReiC6yoGJYpxSvWykNDa1V6P4JAwApZIOqw== X-Received: by 2002:a17:902:b691:b0:187:337a:b2a1 with SMTP id c17-20020a170902b69100b00187337ab2a1mr7507470pls.96.1668773839800; Fri, 18 Nov 2022 04:17:19 -0800 (PST) Received: from [192.168.0.100] (intel10.cs.nthu.edu.tw. [140.114.89.60]) by smtp.gmail.com with ESMTPSA id m11-20020a170902db0b00b0017f7c4e260fsm3548898plx.150.2022.11.18.04.17.18 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Nov 2022 04:17:19 -0800 (PST) Message-ID: Date: Fri, 18 Nov 2022 20:17:15 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: [PING] [PATCH v3] [PR python/29603] Disable out-of-scope watchpoints Content-Language: en-US To: Lancelot SIX , gdb-patches@sourceware.org References: <20221020175707.193041-1-j3.soon777@gmail.com> <20221020181101.193226-1-j3.soon777@gmail.com> From: Johnson Sun In-Reply-To: <20221020181101.193226-1-j3.soon777@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00,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 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")