public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2] Fix raw-frame-arguments in combination with frame-filters
       [not found] <20210131134611.3255-1-ssbssa.ref@yahoo.de>
@ 2021-01-31 13:46 ` Hannes Domani
  2021-02-14 15:51   ` [PING] " Hannes Domani
  2021-05-17  9:48   ` Andrew Burgess
  0 siblings, 2 replies; 7+ messages in thread
From: Hannes Domani @ 2021-01-31 13:46 UTC (permalink / raw)
  To: gdb-patches

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

gdb/ChangeLog:

2021-01-31  Hannes Domani  <ssbssa@yahoo.de>

	* 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  <ssbssa@yahoo.de>

	* 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


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PING] [PATCH v2] Fix raw-frame-arguments in combination with frame-filters
  2021-01-31 13:46 ` [PATCH v2] Fix raw-frame-arguments in combination with frame-filters Hannes Domani
@ 2021-02-14 15:51   ` Hannes Domani
  2021-05-17  9:48   ` Andrew Burgess
  1 sibling, 0 replies; 7+ messages in thread
From: Hannes Domani @ 2021-02-14 15:51 UTC (permalink / raw)
  To: gdb-patches

Ping.

On 31.01.2021 14:46, Hannes Domani via Gdb-patches wrote:
> 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
>
> gdb/ChangeLog:
>
> 2021-01-31  Hannes Domani  <ssbssa@yahoo.de>
>
> 	* 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  <ssbssa@yahoo.de>
>
> 	* 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 ()

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] Fix raw-frame-arguments in combination with frame-filters
  2021-01-31 13:46 ` [PATCH v2] Fix raw-frame-arguments in combination with frame-filters Hannes Domani
  2021-02-14 15:51   ` [PING] " Hannes Domani
@ 2021-05-17  9:48   ` Andrew Burgess
  2021-05-17 10:54     ` Hannes Domani
  1 sibling, 1 reply; 7+ messages in thread
From: Andrew Burgess @ 2021-05-17  9:48 UTC (permalink / raw)
  To: Hannes Domani; +Cc: gdb-patches

* Hannes Domani via Gdb-patches <gdb-patches@sourceware.org> [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  <ssbssa@yahoo.de>
>
> 	* 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  <ssbssa@yahoo.de>
>
> 	* 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
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] Fix raw-frame-arguments in combination with frame-filters
  2021-05-17  9:48   ` Andrew Burgess
@ 2021-05-17 10:54     ` Hannes Domani
  2021-05-27 18:31       ` Hannes Domani
  2021-06-02 13:16       ` Andrew Burgess
  0 siblings, 2 replies; 7+ messages in thread
From: Hannes Domani @ 2021-05-17 10:54 UTC (permalink / raw)
  To: Andrew Burgess; +Cc: gdb-patches

 Am Montag, 17. Mai 2021, 11:48:27 MESZ hat Andrew Burgess <andrew.burgess@embecosm.com> Folgendes geschrieben:

> * Hannes Domani via Gdb-patches <gdb-patches@sourceware.org> [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.

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 problem?


Hannes

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] Fix raw-frame-arguments in combination with frame-filters
  2021-05-17 10:54     ` Hannes Domani
@ 2021-05-27 18:31       ` Hannes Domani
  2021-06-02 13:16       ` Andrew Burgess
  1 sibling, 0 replies; 7+ messages in thread
From: Hannes Domani @ 2021-05-27 18:31 UTC (permalink / raw)
  To: Andrew Burgess; +Cc: gdb-patches

 Ping.

I'm not sure how to continue here.


Am Montag, 17. Mai 2021, 12:54:19 MESZ hat Hannes Domani via Gdb-patches <gdb-patches@sourceware.org> Folgendes geschrieben:

> Am Montag, 17. Mai 2021, 11:48:27 MESZ hat Andrew Burgess <andrew.burgess@embecosm.com> Folgendes geschrieben:
>
> > * Hannes Domani via Gdb-patches <gdb-patches@sourceware.org> [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.
>
> 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 problem?

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] Fix raw-frame-arguments in combination with frame-filters
  2021-05-17 10:54     ` Hannes Domani
  2021-05-27 18:31       ` Hannes Domani
@ 2021-06-02 13:16       ` Andrew Burgess
  2021-06-04 14:03         ` Hannes Domani
  1 sibling, 1 reply; 7+ messages in thread
From: Andrew Burgess @ 2021-06-02 13:16 UTC (permalink / raw)
  To: Hannes Domani; +Cc: gdb-patches

* Hannes Domani <ssbssa@yahoo.de> [2021-05-17 10:54:08 +0000]:

>  Am Montag, 17. Mai 2021, 11:48:27 MESZ hat Andrew Burgess <andrew.burgess@embecosm.com> Folgendes geschrieben:
> 
> > * Hannes Domani via Gdb-patches <gdb-patches@sourceware.org> [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.
> 
> 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 problem?

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=[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-values on
  (gdb) interpreter-exec mi "-stack-list-arguments 1"
  ^done,stack-args=[frame={level="0",args=[{name="x",value="42"},{name="ss",value="{\n  a = {\n    m = 1\n  },\n  b = {\n    m = 2\n  }\n}"}]},frame={level="1",args=[]}]
  (gdb) set print raw-values off
  (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=[]}]

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=[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-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) set print raw-values off
  (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=[]}]

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 <andrew.burgess@embecosm.com>
Date:   Wed Jun 2 14:11:19 2021 +0100

    [wip] fixes for mi behaviour of 'set print raw-frame-arguments on'
    
    ...

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 **argv, int argc)
   if (! raw_arg && frame_filters)
     {
       frame_filter_flags flags = PRINT_LEVEL | PRINT_ARGS;
+      if (user_frame_print_options.print_raw_frame_arguments)
+	flags |= PRINT_RAW_FRAME_ARGUMENTS;
       int py_frame_low = frame_low;
 
       /* 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 = PRINT_LEVEL | PRINT_ARGS | PRINT_LOCALS;
+       if (user_frame_print_options.print_raw_frame_arguments)
+	 flags |= PRINT_RAW_FRAME_ARGUMENTS;
 
        result = 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 == NULL)
@@ -656,10 +657,14 @@ 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, opts->raw, 1,
-			  frame) == EXT_LANG_BT_ERROR))
-    return EXT_LANG_BT_ERROR;
+  if (args_iter != Py_None)
+    {
+      scoped_restore save_raw = make_scoped_restore (&opts->raw,
+						     raw_frame_args_p);
+      if (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
       && (enumerate_locals (locals_iter.get (), out, 1, args_type, 1, frame)
@@ -814,8 +819,9 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
   /* stack-list-variables.  */
   if (print_locals && print_args && ! print_frame_info)
     {
-      if (py_mi_print_variables (filter, out, &opts,
-				 args_type, frame) == EXT_LANG_BT_ERROR)
+      bool raw_frame_args = (flags & PRINT_RAW_FRAME_ARGUMENTS) != 0;
+      if (py_mi_print_variables (filter, out, &opts, args_type, frame,
+				 raw_frame_args) == EXT_LANG_BT_ERROR)
 	return EXT_LANG_BT_ERROR;
       return EXT_LANG_BT_OK;
     }

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2] Fix raw-frame-arguments in combination with frame-filters
  2021-06-02 13:16       ` Andrew Burgess
@ 2021-06-04 14:03         ` Hannes Domani
  0 siblings, 0 replies; 7+ messages in thread
From: Hannes Domani @ 2021-06-04 14:03 UTC (permalink / raw)
  To: Andrew Burgess; +Cc: gdb-patches

 Am Mittwoch, 2. Juni 2021, 15:17:51 MESZ hat Andrew Burgess <andrew.burgess@embecosm.com> Folgendes geschrieben:

> * Hannes Domani <ssbssa@yahoo.de> [2021-05-17 10:54:08 +0000]:
>
> >  Am Montag, 17. Mai 2021, 11:48:27 MESZ hat Andrew Burgess <andrew.burgess@embecosm.com> Folgendes geschrieben:
> >
> > > * Hannes Domani via Gdb-patches <gdb-patches@sourceware.org> [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.
> >
> > 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 problem?
>
> 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=[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-values on
>   (gdb) interpreter-exec mi "-stack-list-arguments 1"
>   ^done,stack-args=[frame={level="0",args=[{name="x",value="42"},{name="ss",value="{\n  a = {\n    m = 1\n  },\n  b = {\n    m = 2\n  }\n}"}]},frame={level="1",args=[]}]
>   (gdb) set print raw-values off
>   (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=[]}]
>
> 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=[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-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) set print raw-values off
>   (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=[]}]
>
> 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,

I'm fine with including this in my patch.

So with your changes I get the expected result:

  (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=[frame={level="0",args=[{name="x",value="42"},{name="ss",value="super struct = {a = m=<1>, b = m=<2>}"}]},frame={level="1",args=[]}]
  (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 = {a = m=<1>, b = m=<2>}"}]},frame={level="1",args=[]}]
  (gdb) set print raw-values off
  (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="{a = {m = 1}, b = {m = 2}}"}]},frame={level="1",args=[]}]

But if I disable the frame-filter, it's again 'set print raw-values' that
controls how 'ss' is printed:

  (gdb) disable frame-filter global BasicFrameFilter
  (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=[frame={level="0",args=[{name="x",value="42"},{name="ss",value="super struct = {a = m=<1>, b = m=<2>}"}]},frame={level="1",args=[]}]
  (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="{a = {m = 1}, b = {m = 2}}"}]},frame={level="1",args=[]}]
  (gdb) set print raw-values off
  (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 = {a = m=<1>, b = m=<2>}"}]},frame={level="1",args=[]}]

I didn't see an obvious fix for this, maybe you can take a look at this?

Regarding the tests, I would have just integrated it to py-frame-args.exp,
see patch below.


Hannes


diff --git a/gdb/testsuite/gdb.python/py-frame-args.exp b/gdb/testsuite/gdb.python/py-frame-args.exp
index dae0c0ac29e..3711e2f5c54 100644
--- a/gdb/testsuite/gdb.python/py-frame-args.exp
+++ b/gdb/testsuite/gdb.python/py-frame-args.exp
@@ -35,6 +35,8 @@ 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
+gdb_test "interpreter-exec mi \"-enable-frame-filters\"" \
+    "done"
 foreach_with_prefix filtered {enable disable} {
     gdb_test_no_output "$filtered frame-filter global BasicFrameFilter"
 
@@ -46,11 +48,24 @@ foreach_with_prefix filtered {enable disable} {
     ".*foo \\(x=42, ss=\[.\]{3}\\).*" \
     "bt raw"
 
+    gdb_test "interpreter-exec mi \"-stack-list-arguments 1\"" \
+    ".*name=\"ss\",value=\"super struct =.*" \
+    "mi bt pretty"
+
+    gdb_test_no_output "set print raw-frame-arguments on"
+    gdb_test "interpreter-exec mi \"-stack-list-arguments 1\"" \
+    ".*name=\"ss\",value=\".a =.*" \
+    "mi bt raw"
+    gdb_test_no_output "set print raw-frame-arguments off"
+
     # "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 "interpreter-exec mi \"-stack-list-arguments 1\"" \
+    ".*name=\"ss\",value=\"super struct =.*" \
+    "mi bt pretty,raw-values"
     gdb_test_no_output "set print raw-values off"
 }
 

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-06-04 14:03 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20210131134611.3255-1-ssbssa.ref@yahoo.de>
2021-01-31 13:46 ` [PATCH v2] Fix raw-frame-arguments in combination with frame-filters Hannes Domani
2021-02-14 15:51   ` [PING] " Hannes Domani
2021-05-17  9:48   ` Andrew Burgess
2021-05-17 10:54     ` Hannes Domani
2021-05-27 18:31       ` Hannes Domani
2021-06-02 13:16       ` Andrew Burgess
2021-06-04 14:03         ` Hannes Domani

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).