From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by sourceware.org (Postfix) with ESMTPS id B3802383800A for ; Mon, 17 May 2021 09:48:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org B3802383800A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=andrew.burgess@embecosm.com Received: by mail-wm1-x32a.google.com with SMTP id z130so3206359wmg.2 for ; Mon, 17 May 2021 02:48:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=N4u/bZbuvIG6PVKvSS6dWViZCXNRMwDVnWAP7JeSE1k=; b=ErZUk+jm9VcFQ9Bk4eB+O/e52m8Pl+bsZQNw2smm3IyCSid1F0uTZFuG1WiuA5n9BR dCeo+De/ypeQOpEpItMcwcd92zMINQP7M4udji37u10T7BWGecHekEw93QJ0wwLMivQB cCAolKLFiCbLuvQOggVH7Gt+U21tZpSFD4vCX5gzIge5Oro7JmkuswjX3U3Mgylko402 E/XCnCaTF/2OcR8/nSmnh5bqXQ7rGzsFEqg6yRSD83f6xIzUTBclEhaIdSVBVdtwuzAA WMUL4bzPcMfUER8A7GbyZNGngkf0w8f58rk+KDEb7ttnCT2n06/YpqQiuNQTLSAQwOLt u/hA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=N4u/bZbuvIG6PVKvSS6dWViZCXNRMwDVnWAP7JeSE1k=; b=rI/Gvcc49d/dinb3F7Jm0uM5iG+EolEosU3liD3pfDcMunFG5iutkaakb7xL02Cjxa UwkOQayrTvxJ2FGUJsFtZ1v7DUq9tuzyAIcoQp3NW0/DkIydVnZphBi85hY16rPPv1Sf LumAvdOK3RnFrh+yNAbqzcjjp4M0qoXAyFyt4BtTJ4Uys3BzmCLvzTTqKUEECqWwjGHT RePatNfxnm39oSt+4+so2us+ZU6W/AcVb+1r9njydt0xWLJ6K8nbtJiV+sTbto7iStQ+ tQdutrxF6TI1w8v1SgTZZYvpWpXQyUlpU5QEh7WG7pwIt/sRi4m5UgbjB0L4yNQRQ6HW CP3Q== X-Gm-Message-State: AOAM5337F9viEUsm8GoLywDYXiYMi1eNHSmJaEIIC1/gGQJZYi2VIoYL aw5rHrK5CtVJlzQ4YwUaGPtJvZOHPqssKQ== X-Google-Smtp-Source: ABdhPJxRwJBp2Zb27Jz2n4uqE2vIpEJ2hvDtGsYpWJ5/qzbEu8iIpHg/P0aWifH5Bxtgsl8IDsmQQA== X-Received: by 2002:a7b:c14f:: with SMTP id z15mr11971058wmi.149.1621244906742; Mon, 17 May 2021 02:48:26 -0700 (PDT) Received: from localhost (host109-151-46-70.range109-151.btcentralplus.com. [109.151.46.70]) by smtp.gmail.com with ESMTPSA id p20sm15056854wmq.10.2021.05.17.02.48.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 May 2021 02:48:25 -0700 (PDT) Date: Mon, 17 May 2021 10:48:24 +0100 From: Andrew Burgess To: Hannes Domani Cc: gdb-patches@sourceware.org Subject: Re: [PATCH v2] Fix raw-frame-arguments in combination with frame-filters Message-ID: <20210517094824.GM3067949@embecosm.com> References: <20210131134611.3255-1-ssbssa.ref@yahoo.de> <20210131134611.3255-1-ssbssa@yahoo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210131134611.3255-1-ssbssa@yahoo.de> X-Operating-System: Linux/5.8.18-100.fc31.x86_64 (x86_64) X-Uptime: 10:39:14 up 13 days, 22:33, X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 May 2021 09:48:38 -0000 * Hannes Domani via Gdb-patches [2021-01-31 14:46:11 +0100]: > Currently, if frame-filters are active, raw-values is used instead of > raw-frame-arguments to decide if a pretty-printer should be invoked for > frame arguments in a backtrace. > > In this example, "super struct" is the output of the pretty-printer: > > (gdb) disable frame-filter global BasicFrameFilter > (gdb) bt > #0 foo (x=42, ss=super struct = {...}) at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > #1 0x004016aa in main () at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:57 > > If no frame-filter is active, then the raw-values print option does not > affect the backtrace output: > > (gdb) set print raw-values on > (gdb) bt > #0 foo (x=42, ss=super struct = {...}) at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > #1 0x004016aa in main () at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:57 > (gdb) set print raw-values off > > Instead, the raw-frame-arguments option disables the pretty-printer in the > backtrace: > > (gdb) bt -raw-frame-arguments on > #0 foo (x=42, ss=...) at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > #1 0x004016aa in main () at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:57 > > But if a frame-filter is active, the same rules don't apply. > The option raw-frame-arguments is ignored, but raw-values decides if the > pretty-printer is used: > > (gdb) enable frame-filter global BasicFrameFilter > (gdb) bt > #0 foo (x=42, ss=super struct = {...}) at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > #1 0x004016aa in main () at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:57 > (gdb) set print raw-values on > (gdb) bt > #0 foo (x=42, ss=...) at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > #1 0x004016aa in main () at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:57 > (gdb) set print raw-values off > (gdb) bt -raw-frame-arguments on > #0 foo (x=42, ss=super struct = {...}) at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > #1 0x004016aa in main () at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:57 > > So this adds the PRINT_RAW_FRAME_ARGUMENTS flag to frame_filter_flag, which > is then used in the frame-filter to override the raw flag in enumerate_args. > > Then the output is the same if a frame-filter is active, the pretty-printer > for backtraces is only disabled with the raw-frame-arguments option: > > (gdb) enable frame-filter global BasicFrameFilter > (gdb) bt > #0 foo (x=42, ss=super struct = {...}) at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > #1 0x004016aa in main () at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:57 > (gdb) set print raw-values on > (gdb) bt > #0 foo (x=42, ss=super struct = {...}) at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > #1 0x004016aa in main () at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:57 > (gdb) set print raw-values off > (gdb) bt -raw-frame-arguments on > #0 foo (x=42, ss=...) at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > #1 0x004016aa in main () at C:/src/repos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:57 Thanks for working on improving this behaviour. I think that there's something weird going on with the MI behaviour. I ran the py-frame-args.c test program, stopped at line 47, then I see this: (gdb) set print raw-frame-arguments off (gdb) set print raw-values off (gdb) interpreter-exec mi "-stack-list-variables 1" ^done,variables=[{name="x",arg="1",value="42"},{name="ss",arg="1",value="super struct = {\n a = m=<1>,\n b = m=<2>\n}"}] (gdb) interpreter-exec mi "-stack-list-arguments 1" ^done,stack-args=[frame={level="0",args=[{name="x",value="42"},{name="ss",value="super struct = {\n a = m=<1>,\n b = m=<2>\n}"}]},frame={level="1",args=[]}] (gdb) set print raw-frame-arguments on (gdb) interpreter-exec mi "-stack-list-arguments 1" ^done,stack-args=[frame={level="0",args=[{name="x",value="42"},{name="ss",value="super struct = {\n a = m=<1>,\n b = m=<2>\n}"}]},frame={level="1",args=[]}] (gdb) interpreter-exec mi "-stack-list-variables 1" ^done,variables=[{name="x",arg="1",value="42"},{name="ss",arg="1",value="super struct = {\n a = m=<1>,\n b = m=<2>\n}"}] (gdb) set print raw-values on (gdb) interpreter-exec mi "-stack-list-arguments 1" ^done,stack-args=[frame={level="0",args=[{name="x",value="42"},{name="ss",value="super struct = {\n a = m=<1>,\n b = m=<2>\n}"}]},frame={level="1",args=[]}] (gdb) interpreter-exec mi "-stack-list-variables 1" ^done,variables=[{name="x",arg="1",value="42"},{name="ss",arg="1",value="{\n a = {\n m = 1\n },\n b = {\n m = 2\n }\n}"}] (gdb) The summary is: - when just doing '-stack-list-arguments' neither 'set print raw-values' or 'set print raw-frame-arguments' seem to effect what is printed, and - when doing '-stack-list-variables', 'set print raw-values' seems to effect how arguments are printed, but 'set print raw-frame-arguments' does not. I guess I would expect 'set print raw-frame-arguments' to be the controlling option in both these cases. Thanks, Andrew > > gdb/ChangeLog: > > 2021-01-31 Hannes Domani > > * extension.h (enum frame_filter_flag): Add > PRINT_RAW_FRAME_ARGUMENTS. > * python/py-framefilter.c (enumerate_args): Override raw flag. > raw_frame_args argument. > (py_mi_print_variables): Forward raw flag. > (py_print_args): Forward raw_frame_args flag. > (py_print_frame): Handle PRINT_RAW_FRAME_ARGUMENTS. > * stack.c (backtrace_command_1): Set PRINT_RAW_FRAME_ARGUMENTS. > > gdb/testsuite/ChangeLog: > > 2021-01-31 Hannes Domani > > * gdb.python/py-frame-args.exp: Add bt raw-frame-arguments tests. > * gdb.python/py-frame-args.py: Add basic frame-filter. > --- > v2: > - More detailed commit message describing the problem. > --- > gdb/extension.h | 4 ++++ > gdb/python/py-framefilter.c | 14 ++++++++++---- > gdb/stack.c | 2 ++ > gdb/testsuite/gdb.python/py-frame-args.exp | 20 ++++++++++++++++++++ > gdb/testsuite/gdb.python/py-frame-args.py | 13 +++++++++++++ > 5 files changed, 49 insertions(+), 4 deletions(-) > > diff --git a/gdb/extension.h b/gdb/extension.h > index a505c68d25e..7067e232cd3 100644 > --- a/gdb/extension.h > +++ b/gdb/extension.h > @@ -103,6 +103,10 @@ enum frame_filter_flag > > /* Set this flag if elided frames should not be printed. */ > PRINT_HIDE = 1 << 5, > + > + /* Set this flag if pretty printers for frame arguments should not > + be invoked. */ > + PRINT_RAW_FRAME_ARGUMENTS = 1 << 6, > }; > > DEF_ENUM_FLAGS_TYPE (enum frame_filter_flag, frame_filter_flags); > diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c > index 6dd741ab704..e53e3409235 100644 > --- a/gdb/python/py-framefilter.c > +++ b/gdb/python/py-framefilter.c > @@ -422,12 +422,14 @@ static enum ext_lang_bt_status > enumerate_args (PyObject *iter, > struct ui_out *out, > enum ext_lang_frame_args args_type, > + bool raw_frame_args, > int print_args_field, > struct frame_info *frame) > { > struct value_print_options opts; > > get_user_print_options (&opts); > + opts.raw = raw_frame_args; > > if (args_type == CLI_SCALAR_VALUES) > { > @@ -655,8 +657,8 @@ py_mi_print_variables (PyObject *filter, struct ui_out *out, > ui_out_emit_list list_emitter (out, "variables"); > > if (args_iter != Py_None > - && (enumerate_args (args_iter.get (), out, args_type, 1, frame) > - == EXT_LANG_BT_ERROR)) > + && (enumerate_args (args_iter.get (), out, args_type, opts->raw, 1, > + frame) == EXT_LANG_BT_ERROR)) > return EXT_LANG_BT_ERROR; > > if (locals_iter != Py_None > @@ -701,6 +703,7 @@ static enum ext_lang_bt_status > py_print_args (PyObject *filter, > struct ui_out *out, > enum ext_lang_frame_args args_type, > + bool raw_frame_args, > struct frame_info *frame) > { > gdbpy_ref<> args_iter (get_py_iter_from_func (filter, "frame_args")); > @@ -726,7 +729,8 @@ py_print_args (PyObject *filter, > } > } > else if (args_iter != Py_None > - && (enumerate_args (args_iter.get (), out, args_type, 0, frame) > + && (enumerate_args (args_iter.get (), out, args_type, > + raw_frame_args, 0, frame) > == EXT_LANG_BT_ERROR)) > return EXT_LANG_BT_ERROR; > > @@ -957,7 +961,9 @@ py_print_frame (PyObject *filter, frame_filter_flags flags, > wrong. */ > if (print_args && (location_print || out->is_mi_like_p ())) > { > - if (py_print_args (filter, out, args_type, frame) == EXT_LANG_BT_ERROR) > + bool raw_frame_args = (flags & PRINT_RAW_FRAME_ARGUMENTS) != 0; > + if (py_print_args (filter, out, args_type, raw_frame_args, frame) > + == EXT_LANG_BT_ERROR) > return EXT_LANG_BT_ERROR; > } > > diff --git a/gdb/stack.c b/gdb/stack.c > index bce6a2f42f8..dbca5ade1c2 100644 > --- a/gdb/stack.c > +++ b/gdb/stack.c > @@ -2028,6 +2028,8 @@ backtrace_command_1 (const frame_print_options &fp_opts, > flags |= PRINT_LOCALS; > if (bt_opts.hide) > flags |= PRINT_HIDE; > + if (fp_opts.print_raw_frame_arguments) > + flags |= PRINT_RAW_FRAME_ARGUMENTS; > > if (!bt_opts.no_filters) > { > diff --git a/gdb/testsuite/gdb.python/py-frame-args.exp b/gdb/testsuite/gdb.python/py-frame-args.exp > index 5d35323c0e6..dae0c0ac29e 100644 > --- a/gdb/testsuite/gdb.python/py-frame-args.exp > +++ b/gdb/testsuite/gdb.python/py-frame-args.exp > @@ -34,6 +34,26 @@ gdb_test_no_output "source ${remote_python_file}" "load python file" > gdb_breakpoint [gdb_get_line_number "break-here"] > gdb_continue_to_breakpoint "break-here" ".* break-here .*" > > +# Test raw-frame-arguments on backtrace with and without frame-filter > +foreach_with_prefix filtered {enable disable} { > + gdb_test_no_output "$filtered frame-filter global BasicFrameFilter" > + > + gdb_test "bt 1" \ > + ".*foo \\(x=42, ss=super struct = {\[.\]{3}}\\).*" \ > + "bt pretty" > + > + gdb_test "bt -raw-frame-arguments on 1" \ > + ".*foo \\(x=42, ss=\[.\]{3}\\).*" \ > + "bt raw" > + > + # "set print raw-values" should not affect frame arguments > + gdb_test_no_output "set print raw-values on" > + gdb_test "bt 1" \ > + ".*foo \\(x=42, ss=super struct = {\[.\]{3}}\\).*" \ > + "bt pretty,raw-values" > + gdb_test_no_output "set print raw-values off" > +} > + > # Test all combinations with raw off. > > gdb_test_no_output "set print raw-frame-arguments off" > diff --git a/gdb/testsuite/gdb.python/py-frame-args.py b/gdb/testsuite/gdb.python/py-frame-args.py > index d80d761b995..3b65eed0dad 100644 > --- a/gdb/testsuite/gdb.python/py-frame-args.py > +++ b/gdb/testsuite/gdb.python/py-frame-args.py > @@ -73,3 +73,16 @@ pretty_printers_dict = {} > > register_pretty_printers () > gdb.pretty_printers.append (lookup_function) > + > + > +class BasicFrameFilter (object): > + def __init__ (self): > + self.name = "BasicFrameFilter" > + self.priority = 100 > + self.enabled = True > + gdb.frame_filters[self.name] = self > + > + def filter (self, frame_iter): > + return frame_iter > + > +BasicFrameFilter () > -- > 2.30.0 >