From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by sourceware.org (Postfix) with ESMTPS id 60319395C82E for ; Wed, 2 Jun 2021 13:16:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 60319395C82E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-wr1-x434.google.com with SMTP id l2so2284382wrw.6 for ; Wed, 02 Jun 2021 06:16:51 -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:content-transfer-encoding:in-reply-to; bh=aw+rb0rJXWcUHEeVIkdsbNvBBXPV3RKDER5L6eAy3ck=; b=fzK+bRMP+oUHCvHdqRwHVRZXtERKV0oDYSMvY1M3Q5pfsEXApzj+rjuFZ1ZV6fRKoq oOtRaF+bzQmQUaSGrDImYfUW/847CQqPzKL5eY0lLzIwEBLiVHKeISN/KR41ZOamrJq9 zae1Q3u67bC9k0g2HKQHLRPAqlk42HE03X43VM97gi4b8+1/Hx360njxd5qeleBbp05A 6I5vQPPxiqYPPxVty/8HDyWO1NQ6q0zAIV89AyJtrIfI9GKURRFWUwwChLCePtVqxWwI BGXY+hqaYF4980DBkXlDDiv3f3ax8G3BUq1SqyA3auVz+Qu6dDypEx8n+tLi8VBXLnot 4GfA== 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:content-transfer-encoding :in-reply-to; bh=aw+rb0rJXWcUHEeVIkdsbNvBBXPV3RKDER5L6eAy3ck=; b=q2Ar45kE8URAYQvf9UHGuLo6EBvdC0xAlamxAlMXDsCX4VLjsi/pwEoPD3zoAfhJGd b8o9kFQ1ndQSMJmzErZLi3ToSCnHPxrokJ4fQ/DEBMOkkyUjNn6YK75hODjFI6/tODmG 19uHhqsUAPCf+FI/G/5ffMTm5TSmfpplzEZMeFQM03DvSAhYA9TnwRmX2hGOaHTyRnyf 0XC5onBsTNlL738O2HvZdNLduJC2V4sIdxnXJX97Jaz0E43fHW6uGoWYoo1taYopN6kp ympky+Ic9+KMPBrRkdQib6Zn8LFHQKqyLEwC3nihVc/uS0eB2L0XbQrfXc4fZbvG6YHu a+1g== X-Gm-Message-State: AOAM532epYnHEPelXAPwSNi7gngm2H8G57AYIR+Rj79gFrl/GUy0qte4 +wCemCN+10ojEhIoCDJNEu4bbw== X-Google-Smtp-Source: ABdhPJxNVHB1npzpSFYWzKJGgPaixgmM0TAI8wAA+RdfYI3xaWbQmxOcKSmVxqyw5x0Y0JS0cD+s/w== X-Received: by 2002:a5d:50ca:: with SMTP id f10mr11548767wrt.411.1622639810503; Wed, 02 Jun 2021 06:16:50 -0700 (PDT) Received: from localhost (host109-151-46-70.range109-151.btcentralplus.com. [109.151.46.70]) by smtp.gmail.com with ESMTPSA id u17sm6681357wrt.61.2021.06.02.06.16.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Jun 2021 06:16:49 -0700 (PDT) Date: Wed, 2 Jun 2021 14:16:48 +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: <20210602131648.GL2672@embecosm.com> References: <20210131134611.3255-1-ssbssa.ref@yahoo.de> <20210131134611.3255-1-ssbssa@yahoo.de> <20210517094824.GM3067949@embecosm.com> <981574547.1965792.1621248848432@mail.yahoo.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable In-Reply-To: <981574547.1965792.1621248848432@mail.yahoo.com> X-Operating-System: Linux/5.8.18-100.fc31.x86_64 (x86_64) X-Uptime: 13:35:59 up 14 days, 2:20, X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] X-Spam-Status: No, score=-12.1 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: Wed, 02 Jun 2021 13:17:02 -0000 * Hannes Domani [2021-05-17 10:54:08 +0000]: > Am Montag, 17. Mai 2021, 11:48:27 MESZ hat Andrew Burgess Folgendes geschrieben: >=20 > > * Hannes Domani via Gdb-patches [2021-01-3= 1 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 f= or > > > frame arguments in a backtrace. > > > > > > In this example, "super struct" is the output of the pretty-printer: > > > > > >=A0=A0=A0 (gdb) disable frame-filter global BasicFrameFilter > > >=A0=A0=A0 (gdb) bt > > >=A0=A0=A0 #0=A0 foo (x=3D42, ss=3Dsuper struct =3D {...}) at C:/src/re= pos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > > >=A0=A0=A0 #1=A0 0x004016aa in main () at C:/src/repos/gdb-testsuite/gd= b/testsuite/gdb.python/py-frame-args.c:57 > > > > > > If no frame-filter is active, then the raw-values print option does n= ot > > > affect the backtrace output: > > > > > >=A0=A0=A0 (gdb) set print raw-values on > > >=A0=A0=A0 (gdb) bt > > >=A0=A0=A0 #0=A0 foo (x=3D42, ss=3Dsuper struct =3D {...}) at C:/src/re= pos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > > >=A0=A0=A0 #1=A0 0x004016aa in main () at C:/src/repos/gdb-testsuite/gd= b/testsuite/gdb.python/py-frame-args.c:57 > > >=A0=A0=A0 (gdb) set print raw-values off > > > > > > Instead, the raw-frame-arguments option disables the pretty-printer i= n the > > > backtrace: > > > > > >=A0=A0=A0 (gdb) bt -raw-frame-arguments on > > >=A0=A0=A0 #0=A0 foo (x=3D42, ss=3D...) at C:/src/repos/gdb-testsuite/g= db/testsuite/gdb.python/py-frame-args.c:47 > > >=A0=A0=A0 #1=A0 0x004016aa in main () at C:/src/repos/gdb-testsuite/gd= b/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: > > > > > >=A0=A0=A0 (gdb) enable frame-filter global BasicFrameFilter > > >=A0=A0=A0 (gdb) bt > > >=A0=A0=A0 #0=A0 foo (x=3D42, ss=3Dsuper struct =3D {...}) at C:/src/re= pos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > > >=A0=A0=A0 #1=A0 0x004016aa in main () at C:/src/repos/gdb-testsuite/gd= b/testsuite/gdb.python/py-frame-args.c:57 > > >=A0=A0=A0 (gdb) set print raw-values on > > >=A0=A0=A0 (gdb) bt > > >=A0=A0=A0 #0=A0 foo (x=3D42, ss=3D...) at C:/src/repos/gdb-testsuite/g= db/testsuite/gdb.python/py-frame-args.c:47 > > >=A0=A0=A0 #1=A0 0x004016aa in main () at C:/src/repos/gdb-testsuite/gd= b/testsuite/gdb.python/py-frame-args.c:57 > > >=A0=A0=A0 (gdb) set print raw-values off > > >=A0=A0=A0 (gdb) bt -raw-frame-arguments on > > >=A0=A0=A0 #0=A0 foo (x=3D42, ss=3Dsuper struct =3D {...}) at C:/src/re= pos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > > >=A0=A0=A0 #1=A0 0x004016aa in main () at C:/src/repos/gdb-testsuite/gd= b/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 enumerat= e_args. > > > > > > Then the output is the same if a frame-filter is active, the pretty-p= rinter > > > for backtraces is only disabled with the raw-frame-arguments option: > > > > > >=A0=A0=A0 (gdb) enable frame-filter global BasicFrameFilter > > >=A0=A0=A0 (gdb) bt > > >=A0=A0=A0 #0=A0 foo (x=3D42, ss=3Dsuper struct =3D {...}) at C:/src/re= pos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > > >=A0=A0=A0 #1=A0 0x004016aa in main () at C:/src/repos/gdb-testsuite/gd= b/testsuite/gdb.python/py-frame-args.c:57 > > >=A0=A0=A0 (gdb) set print raw-values on > > >=A0=A0=A0 (gdb) bt > > >=A0=A0=A0 #0=A0 foo (x=3D42, ss=3Dsuper struct =3D {...}) at C:/src/re= pos/gdb-testsuite/gdb/testsuite/gdb.python/py-frame-args.c:47 > > >=A0=A0=A0 #1=A0 0x004016aa in main () at C:/src/repos/gdb-testsuite/gd= b/testsuite/gdb.python/py-frame-args.c:57 > > >=A0=A0=A0 (gdb) set print raw-values off > > >=A0=A0=A0 (gdb) bt -raw-frame-arguments on > > >=A0=A0=A0 #0=A0 foo (x=3D42, ss=3D...) at C:/src/repos/gdb-testsuite/g= db/testsuite/gdb.python/py-frame-args.c:47 > > >=A0=A0=A0 #1=A0 0x004016aa in main () at C:/src/repos/gdb-testsuite/gd= b/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: > > > >=A0=A0 (gdb) set print raw-frame-arguments off > >=A0=A0 (gdb) set print raw-values off > >=A0=A0 (gdb) interpreter-exec mi "-stack-list-variables 1" > >=A0=A0 ^done,variables=3D[{name=3D"x",arg=3D"1",value=3D"42"},{name=3D"s= s",arg=3D"1",value=3D"super struct =3D {\n=A0 a =3D m=3D<1>,\n=A0 b =3D m= =3D<2>\n}"}] > >=A0=A0 (gdb) interpreter-exec mi "-stack-list-arguments 1" > >=A0=A0 ^done,stack-args=3D[frame=3D{level=3D"0",args=3D[{name=3D"x",valu= e=3D"42"},{name=3D"ss",value=3D"super struct =3D {\n=A0 a =3D m=3D<1>,\n=A0= b =3D m=3D<2>\n}"}]},frame=3D{level=3D"1",args=3D[]}] > > > >=A0=A0 (gdb) set print raw-frame-arguments on > >=A0=A0 (gdb) interpreter-exec mi "-stack-list-arguments 1" > >=A0=A0 ^done,stack-args=3D[frame=3D{level=3D"0",args=3D[{name=3D"x",valu= e=3D"42"},{name=3D"ss",value=3D"super struct =3D {\n=A0 a =3D m=3D<1>,\n=A0= b =3D m=3D<2>\n}"}]},frame=3D{level=3D"1",args=3D[]}] > >=A0=A0 (gdb) interpreter-exec mi "-stack-list-variables 1" > >=A0=A0 ^done,variables=3D[{name=3D"x",arg=3D"1",value=3D"42"},{name=3D"s= s",arg=3D"1",value=3D"super struct =3D {\n=A0 a =3D m=3D<1>,\n=A0 b =3D m= =3D<2>\n}"}] > > > >=A0=A0 (gdb) set print raw-values on > >=A0=A0 (gdb) interpreter-exec mi "-stack-list-arguments 1" > >=A0=A0 ^done,stack-args=3D[frame=3D{level=3D"0",args=3D[{name=3D"x",valu= e=3D"42"},{name=3D"ss",value=3D"super struct =3D {\n=A0 a =3D m=3D<1>,\n=A0= b =3D m=3D<2>\n}"}]},frame=3D{level=3D"1",args=3D[]}] > >=A0=A0 (gdb) interpreter-exec mi "-stack-list-variables 1" > >=A0=A0 ^done,variables=3D[{name=3D"x",arg=3D"1",value=3D"42"},{name=3D"s= s",arg=3D"1",value=3D"{\n=A0 a =3D {\n=A0=A0=A0 m =3D 1\n=A0 },\n=A0 b =3D = {\n=A0=A0=A0 m =3D 2\n=A0 }\n}"}] > >=A0=A0 (gdb) > > > > The summary is: > > > >=A0=A0 - when just doing '-stack-list-arguments' neither 'set print > >=A0=A0=A0=A0 raw-values' or 'set print raw-frame-arguments' seem to effe= ct what > >=A0=A0=A0=A0 is printed, and > > > >=A0=A0 - when doing '-stack-list-variables', 'set print raw-values' seems > >=A0=A0=A0=A0 to effect how arguments are printed, but 'set print > >=A0=A0=A0=A0 raw-frame-arguments' does not. > > > > I guess I would expect 'set print raw-frame-arguments' to be the > > controlling option in both these cases. >=20 > I'm not completely sure now, is that something this patch breaks? > Or do you mean this should be fixed as well, since it's a very similar pr= oblem? All of the above :) There is I believe at least one regression with this patch, the following session is using GDB without your patch, break in your test program at line 47 then: (gdb) interpreter-exec mi "-enable-frame-filters" ^done (gdb) set print raw-values off (gdb) set print raw-frame-arguments off (gdb) interpreter-exec mi "-stack-list-arguments 1" ^done,stack-args=3D[frame=3D{level=3D"0",args=3D[{name=3D"x",value=3D"42"= },{name=3D"ss",value=3D"super struct =3D {\n a =3D m=3D<1>,\n b =3D m=3D<= 2>\n}"}]},frame=3D{level=3D"1",args=3D[]}] (gdb) set print raw-values on (gdb) interpreter-exec mi "-stack-list-arguments 1" ^done,stack-args=3D[frame=3D{level=3D"0",args=3D[{name=3D"x",value=3D"42"= },{name=3D"ss",value=3D"{\n a =3D {\n m =3D 1\n },\n b =3D {\n m = =3D 2\n }\n}"}]},frame=3D{level=3D"1",args=3D[]}] (gdb) set print raw-values off (gdb) set print raw-frame-arguments on (gdb) interpreter-exec mi "-stack-list-arguments 1" ^done,stack-args=3D[frame=3D{level=3D"0",args=3D[{name=3D"x",value=3D"42"= },{name=3D"ss",value=3D"super struct =3D {\n a =3D m=3D<1>,\n b =3D m=3D<= 2>\n}"}]},frame=3D{level=3D"1",args=3D[]}] Notice that 'set print raw-values' controls whether 'ss' is printed raw or not. This is an existing bug, but it would be neat if this got fixed in this commit as it is so close to what you're already fixing. BUT.... With your patch applied the above behaviour changes, I now see this: (gdb) interpreter-exec mi "-enable-frame-filters" ^done (gdb) set print raw-values off (gdb) set print raw-frame-arguments off (gdb) interpreter-exec mi "-stack-list-arguments 1" ^done,stack-args=3D[frame=3D{level=3D"0",args=3D[{name=3D"x",value=3D"42"= },{name=3D"ss",value=3D"super struct =3D {\n a =3D m=3D<1>,\n b =3D m=3D<= 2>\n}"}]},frame=3D{level=3D"1",args=3D[]}] (gdb) set print raw-values on (gdb) interpreter-exec mi "-stack-list-arguments 1" ^done,stack-args=3D[frame=3D{level=3D"0",args=3D[{name=3D"x",value=3D"42"= },{name=3D"ss",value=3D"super struct =3D {\n a =3D m=3D<1>,\n b =3D m=3D<= 2>\n}"}]},frame=3D{level=3D"1",args=3D[]}] (gdb) set print raw-values off (gdb) set print raw-frame-arguments on (gdb) interpreter-exec mi "-stack-list-arguments 1" ^done,stack-args=3D[frame=3D{level=3D"0",args=3D[{name=3D"x",value=3D"42"= },{name=3D"ss",value=3D"super struct =3D {\n a =3D m=3D<1>,\n b =3D m=3D<= 2>\n}"}]},frame=3D{level=3D"1",args=3D[]}] Notice now that even 'set print raw-values on|off' doesn't change how 'ss' is printed, it's always pretty-printed. I think as a minimum you need to fix this regression, and ideally add a test for this case, as clearly it's not covered in the existing tests. However, while trying to figure out how reasonable it was to ask you to fix the above, I think I probably fixed it (see the patch below, which applies on top of yours), the only thing missing would be some tests, which would still need to be written. I'll take a look when I have time, but if you wanted to write some then this would be great. Let me know how you'd feel about including this fix with yours, Thanks, Andrew --- commit 16d6aca4fbba6965d8c90b433e811f46b9f95dc3 Author: Andrew Burgess Date: Wed Jun 2 14:11:19 2021 +0100 [wip] fixes for mi behaviour of 'set print raw-frame-arguments on' =20 ... diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c index 9bc9010239f..5d266a96240 100644 --- a/gdb/mi/mi-cmd-stack.c +++ b/gdb/mi/mi-cmd-stack.c @@ -366,6 +366,8 @@ mi_cmd_stack_list_args (const char *command, char **arg= v, int argc) if (! raw_arg && frame_filters) { frame_filter_flags flags =3D PRINT_LEVEL | PRINT_ARGS; + if (user_frame_print_options.print_raw_frame_arguments) + flags |=3D PRINT_RAW_FRAME_ARGUMENTS; int py_frame_low =3D frame_low; =20 /* We cannot pass -1 to frame_low, as that would signify a @@ -459,6 +461,8 @@ mi_cmd_stack_list_variables (const char *command, char = **argv, int argc) if (! raw_arg && frame_filters) { frame_filter_flags flags =3D PRINT_LEVEL | PRINT_ARGS | PRINT_LOCAL= S; + if (user_frame_print_options.print_raw_frame_arguments) + flags |=3D PRINT_RAW_FRAME_ARGUMENTS; =20 result =3D mi_apply_ext_lang_frame_filter (frame, flags, print_value, diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index b2ce97b233c..738de6bd1c3 100644 --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c @@ -644,7 +644,8 @@ static enum ext_lang_bt_status py_mi_print_variables (PyObject *filter, struct ui_out *out, struct value_print_options *opts, enum ext_lang_frame_args args_type, - struct frame_info *frame) + struct frame_info *frame, + bool raw_frame_args_p) { gdbpy_ref<> args_iter (get_py_iter_from_func (filter, "frame_args")); if (args_iter =3D=3D NULL) @@ -656,10 +657,14 @@ py_mi_print_variables (PyObject *filter, struct ui_ou= t *out, =20 ui_out_emit_list list_emitter (out, "variables"); =20 - if (args_iter !=3D Py_None - && (enumerate_args (args_iter.get (), out, args_type, opts->raw, 1, - frame) =3D=3D EXT_LANG_BT_ERROR)) - return EXT_LANG_BT_ERROR; + if (args_iter !=3D Py_None) + { + scoped_restore save_raw =3D make_scoped_restore (&opts->raw, + raw_frame_args_p); + if (enumerate_args (args_iter.get (), out, args_type, opts->raw, 1, + frame) =3D=3D EXT_LANG_BT_ERROR) + return EXT_LANG_BT_ERROR; + } =20 if (locals_iter !=3D Py_None && (enumerate_locals (locals_iter.get (), out, 1, args_type, 1, fram= e) @@ -814,8 +819,9 @@ py_print_frame (PyObject *filter, frame_filter_flags fl= ags, /* stack-list-variables. */ if (print_locals && print_args && ! print_frame_info) { - if (py_mi_print_variables (filter, out, &opts, - args_type, frame) =3D=3D EXT_LANG_BT_ERROR) + bool raw_frame_args =3D (flags & PRINT_RAW_FRAME_ARGUMENTS) !=3D 0; + if (py_mi_print_variables (filter, out, &opts, args_type, frame, + raw_frame_args) =3D=3D EXT_LANG_BT_ERROR) return EXT_LANG_BT_ERROR; return EXT_LANG_BT_OK; }