From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pl1-x62e.google.com (mail-pl1-x62e.google.com [IPv6:2607:f8b0:4864:20::62e]) by sourceware.org (Postfix) with ESMTPS id 3AB7B384DDB5 for ; Mon, 12 Dec 2022 21:44:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3AB7B384DDB5 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-pl1-x62e.google.com with SMTP id jl24so13490209plb.8 for ; Mon, 12 Dec 2022 13:44:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; 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=PmeKxMIeKtrOX+WSm/4uIME6BlytU3dy+ksJYPmplP0=; b=Vb7zpT8N7PKcbWNAtD4nwlxK+SPnyRA5qppOEVhsqLiZscch5oxDmiPCy+lfASq73a xOu9AacvTORKWFrHBW1umcKulkNwjWzPOdQUH0eAiqeXajHDqGJI8KyDI5nwPZtmVbEW dovbfhPacsQfQ7qOYJ1GQguNbSlzFmOQj/sdh0YTf37Jy7kWDziZDRo98wwvsbFKS2i0 csIEnrWJWyNyJMwDSZMjo5IDry1XKR6dOFcUD4/hhBwVmuBnKKY4bgH/ys5BKIrv6tnZ +iROhqu2yItYDHL5IwgxeI/VQVGRAcLqg3uZtspN0axccdnhnbanATsUHNwYIVrLXkbw DUtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=PmeKxMIeKtrOX+WSm/4uIME6BlytU3dy+ksJYPmplP0=; b=BmL/e97kPlZcd5CeBwCqgxF5Ql272QJ0RlAwgpJ5RVFxkaXHrnaJH5LFEiIIQsHsFy +4XLH9uvWQN+fNDOOIUBJEpl+g+eoc8pNRX1x137UbBHarQp5agmpVdIyUojc3E80y/i HyrvOe7HcoZ+SiNC6HsBzLjocgJr+DyRbRnvOLm2kJtk1fGCTMeR543tb5EVLnNs5psF wuWi7ietpm3Y+UVW8eBrIr91gk4lzpm8ZZTs8ARSOOHJcNqX9rsLZcHGJUOZK1NCkoNX 1QhrnaMk/PlwsBe+3+Ri96kfuvN34KDd2a/0hI9JNftg5L7sOH+zEasLCrr+0U8wBMMh YJSA== X-Gm-Message-State: ANoB5plmF8REsH/fXGJlgzjqdf/dWJa3RbHOfXhmpGu0VJR1rlpHuwMR ognEv7ZbllekV9oEptNSFO4Oqct9PUZX7A== X-Google-Smtp-Source: AA0mqf7vQ4TUBPUoGNFUWPnd1+f2NumtFZEJeuV0zgwpE+5YDVFrk2WrE/QwNQxGHwdZpWX5kw1T+Q== X-Received: by 2002:a17:902:be05:b0:186:59e9:a261 with SMTP id r5-20020a170902be0500b0018659e9a261mr17791474pls.43.1670881489833; Mon, 12 Dec 2022 13:44:49 -0800 (PST) Received: from [192.168.117.117] (sd237023.ching-de.ab.nthu.edu.tw. [140.114.237.23]) by smtp.gmail.com with ESMTPSA id a4-20020a170902ecc400b0017f8094a52asm6837664plh.29.2022.12.12.13.44.48 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 12 Dec 2022 13:44:49 -0800 (PST) Message-ID: <8cf0cf4f-9370-749c-13a3-665a5c703115@gmail.com> Date: Tue, 13 Dec 2022 05:44:46 +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^4] [PATCH v3] [PR python/29603] Disable out-of-scope watchpoints 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> <23ce74fe-1d98-8b22-85f9-9b825c81b66d@gmail.com> Content-Language: en-US In-Reply-To: <23ce74fe-1d98-8b22-85f9-9b825c81b66d@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.0 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 12/5/2022 12:45 AM, Johnson Sun wrote: > 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") >>>