From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x1032.google.com (mail-pj1-x1032.google.com [IPv6:2607:f8b0:4864:20::1032]) by sourceware.org (Postfix) with ESMTPS id C69E73858D35 for ; Tue, 27 Dec 2022 16:40:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C69E73858D35 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-x1032.google.com with SMTP id gv5-20020a17090b11c500b00223f01c73c3so14633659pjb.0 for ; Tue, 27 Dec 2022 08:40:45 -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=tA0+9w56LfRpZDZ6B5O4GHSmWSJavp91ob0Zzap7rKc=; b=ngDL96AqYdMJjMX8NK2MT3j+McbKP2RO8nFhnhfc9ZntTEnLC9gb5uPz8vdsmmoGX4 R4cpEeL6fcahTLllkppjZ92eFFC+V7U2nSa12wwW7EpwPHbBQzglChHX10eOMlaEs5Pt /aVIyTrqARj6cjM1GTZhTL41tW10jDNQE6TAj+83RNtZbrEqrzQ7BvPT4DDW0MsWIs6L izuoKQk+r95I5sCRKAH5w0cizgBVku2OWssjgz9+vfF+dB/ohtXvN1TTO83XT8Qn3wTX AR81tAtkk8o5p8lfe2iwSJkk2UuF46pUeZkHXZg7F02qaEki2RJaeh8/wZwk49huctAi Tk9A== 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=tA0+9w56LfRpZDZ6B5O4GHSmWSJavp91ob0Zzap7rKc=; b=kmjBZGACdvvFisxNoE8aqr5h928IhS+tJQT/tdbL5Z+lqLxbRvdN7+fNKzCtlqIMlR sZ4wmi0Nwv0cM/jR2hBBE9nphJZ1q6V9OAsQhVOT7RhekZBXAM12buswSVaA4Jh0tLJT C2j1vJVnH+34Bh7lBUx4kOv+LrHzQD5+37T4Sz4p10M1BJW4sIacwRON9GITz+HadpHd U0hFudJOmsBkRqn6Wx0IOpy34piWmPnoFfL9pwz0J2dHdGgcWNJdXJWSHF4SDh8J3aNg MhXU0gT5nHBKcFot2Y9olT/ct3ntfO68HWngbea56YwzUBapSRYmNzEJHB7k+3TiHiAn skfA== X-Gm-Message-State: AFqh2kokglLboztyq9ZDiyLhA0HK3IZfhrIqzsKTXMUY7yiTuJvW/ZJ8 mLibkyh+dg+vjK0HtPYffQyu1N/cODaa+A== X-Google-Smtp-Source: AMrXdXtEHH2GE0obB4iRVUAmgaHfMWUjA/OFKK2PbOXTArO3eszz/GrLJucqkJ5omwASsIQpC+lqTA== X-Received: by 2002:a17:90a:e648:b0:223:3642:f74d with SMTP id ep8-20020a17090ae64800b002233642f74dmr38169471pjb.37.1672159244560; Tue, 27 Dec 2022 08:40:44 -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 y15-20020a17090ad70f00b00218daa55e5fsm8390325pju.12.2022.12.27.08.40.43 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 27 Dec 2022 08:40:44 -0800 (PST) Message-ID: <9099d833-147a-d9ae-e969-579af15a6003@gmail.com> Date: Wed, 28 Dec 2022 00:40:42 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: Re: [PING^6] [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> <8cf0cf4f-9370-749c-13a3-665a5c703115@gmail.com> <262532fd-3e7b-7936-070a-2b56ccd6495a@gmail.com> Content-Language: en-US In-Reply-To: <262532fd-3e7b-7936-070a-2b56ccd6495a@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.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,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/21/2022 6:08 AM, Johnson Sun wrote: > Ping for: > . > > Johnson > > On 12/13/2022 5:44 AM, Johnson Sun wrote: >> 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") >>>>>