public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [RFAv3 2/3] Test 'set print frame-info|frame-arguments presence'.
  2019-06-19 16:06 [RFAv3 0/3] Implement 'set print frame-info|frame-arguments Philippe Waroquiers
  2019-06-19 16:06 ` [RFAv3 1/3] Implement 'set print frame-info|frame-arguments presence' Philippe Waroquiers
@ 2019-06-19 16:06 ` Philippe Waroquiers
  2019-07-25 18:58   ` Tom Tromey
  2019-06-19 16:06 ` [RFAv3 3/3] Document " Philippe Waroquiers
  2019-07-05 20:06 ` PING Re: [RFAv3 0/3] Implement 'set print frame-info|frame-arguments Philippe Waroquiers
  3 siblings, 1 reply; 9+ messages in thread
From: Philippe Waroquiers @ 2019-06-19 16:06 UTC (permalink / raw)
  To: gdb-patches; +Cc: Philippe Waroquiers

Updated tests to test the new options and new values.
Test the default for print_what in python frame filtering.
Updated the tests impacted by the default in python frame filtering
which is now consistent with the backtrace command.

gdb/testsuite/ChangeLog
2019-06-19  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

	* gdb.base/options.exp: Update backtrace - completion to
	new option -frame-info.
	* gdb.base/frame-args.exp: Test new 'frame-arguments presence'.
	Test new 'set print frame-info'.  Test backtrace -frame-info
	overriding 'set print frame-info'.
	* gdb.python/py-framefilter.exp: Test new 'frame-arguments presence'.
	Test new 'set print frame-info'.
	Verify consistency of backtrace with and without filters, with and
	without -no-filters.
	* gdb.python/py-framefilter-invalidarg.exp: Update to new print_what
	default.
---
 gdb/testsuite/gdb.base/frame-args.exp         | 60 ++++++++++++++++
 gdb/testsuite/gdb.base/options.exp            |  1 +
 .../gdb.python/py-framefilter-invalidarg.exp  |  2 +-
 gdb/testsuite/gdb.python/py-framefilter.exp   | 72 +++++++++++++++++--
 4 files changed, 130 insertions(+), 5 deletions(-)

diff --git a/gdb/testsuite/gdb.base/frame-args.exp b/gdb/testsuite/gdb.base/frame-args.exp
index 77f136c064..71115a020a 100644
--- a/gdb/testsuite/gdb.base/frame-args.exp
+++ b/gdb/testsuite/gdb.base/frame-args.exp
@@ -50,4 +50,64 @@ gdb_test "frame 1" \
          ".*in call_me \\(i=\\.\\.\\., f=\\.\\.\\., s=\\.\\.\\., ss=\\.\\.\\., u=\\.\\.\\., e=\\.\\.\\.\\) at .*frame-args\\.c:.*" \
          "frame 1 with print frame-arguments set to none"
 
+# Test with "print frame-arguments" set to "presence"
 
+gdb_test_no_output "set print frame-arguments presence" \
+         "set print frame-arguments presence"
+gdb_test "frame 1" \
+         ".*in call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*" \
+         "frame 1 with print frame-arguments set to presence"
+gdb_test "frame 2" \
+         ".*in main \\(\\) at .*frame-args\\.c:.*" \
+         "frame 2 (no args) with print frame-arguments set to presence"
+
+
+# Test with "print frame-info" set to "location-and-address"
+gdb_test_no_output "set print frame-info location-and-address" \
+    "set print frame-info location-and-address"
+gdb_test "frame 1" \
+    ".*0x.* in call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*" \
+    "frame 1 with print frame-info set to location-and-address"
+
+# Test with "print address" set to "off" ...
+gdb_test_no_output "set print address off" \
+    "set print address off"
+
+# ... and "location-and-address" (previously set)
+gdb_test "frame 1" \
+    "#1  call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*" \
+    "frame 1 with print frame-info set to location-and-address and address off"
+
+# ... and "location"
+gdb_test_no_output "set print frame-info location" \
+    "set print frame-info location"
+gdb_test "frame 1" \
+    "#1  call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*" \
+    "frame 1 with print frame-info set to location and address off"
+
+# ... and "short-location"
+gdb_test_no_output "set print frame-info short-location" \
+    "set print frame-info short-location"
+gdb_test "frame 1" \
+    "#1  call_me \\(\\.\\.\\.\\)" \
+    "frame 1 with print frame-info set to short-location and address off"
+
+# ... and "source-and-location"
+gdb_test_no_output "set print frame-info source-and-location" \
+    "set print frame-info source-and-location"
+gdb_test "frame 1" \
+    "#1  call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*\r\n\[1-9\]\[0-9\]*\[ \t\]*break_me \\(\\);" \
+    "frame 1 with print frame-info set to source-and-location and address off"
+
+# ... and "source-line".
+gdb_test_no_output "set print frame-info source-line" \
+    "set print frame-info source-line"
+gdb_test "frame 1" \
+    "\[1-9\]\[0-9\]*\[ \t\]*break_me \\(\\);" \
+    "frame 1 with print frame-info set to source-line and address off"
+
+
+# Verify overriding of the global setting by the backtrace -frame-info option.
+gdb_test "backtrace -frame-info source-and-location 2" \
+    ".*\r\n.*\r\n#1  call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*\r\n\[1-9\]\[0-9\]*\[ \t\]*break_me \\(\\);.*" \
+    "backtrace -frame-info source-and-location 2 overriding print frame-info set to source-line"
diff --git a/gdb/testsuite/gdb.base/options.exp b/gdb/testsuite/gdb.base/options.exp
index 4570c2a93d..17efa2a651 100644
--- a/gdb/testsuite/gdb.base/options.exp
+++ b/gdb/testsuite/gdb.base/options.exp
@@ -253,6 +253,7 @@ proc_with_prefix test-backtrace {} {
     test_gdb_complete_multiple "backtrace " "-" "" {
 	"-entry-values"
 	"-frame-arguments"
+	"-frame-info"
 	"-full"
 	"-hide"
 	"-no-filters"
diff --git a/gdb/testsuite/gdb.python/py-framefilter-invalidarg.exp b/gdb/testsuite/gdb.python/py-framefilter-invalidarg.exp
index 8d5fb72f2a..2213bcffb2 100644
--- a/gdb/testsuite/gdb.python/py-framefilter-invalidarg.exp
+++ b/gdb/testsuite/gdb.python/py-framefilter-invalidarg.exp
@@ -63,4 +63,4 @@ set remote_python_file [gdb_remote_download host \
 			    ${srcdir}/${subdir}/${testfile}.py]
 gdb_test_no_output "source ${remote_python_file}" "load python file"
 
-gdb_test "bt" " in niam \\(argc=<error reading variable: dwarf expression stack underflow>, argv=0x\[0-9a-f\]+\\) at py-framefilter-invalidarg.c:\[0-9\]+" "bt full with filters"
+gdb_test "bt" "niam \\(argc=<error reading variable: dwarf expression stack underflow>, argv=0x\[0-9a-f\]+\\) at py-framefilter-invalidarg.c:\[0-9\]+" "bt full with filters"
diff --git a/gdb/testsuite/gdb.python/py-framefilter.exp b/gdb/testsuite/gdb.python/py-framefilter.exp
index a88e37f8c2..e3aed24c16 100644
--- a/gdb/testsuite/gdb.python/py-framefilter.exp
+++ b/gdb/testsuite/gdb.python/py-framefilter.exp
@@ -60,11 +60,26 @@ if ![runto_main] then {
 gdb_test_no_output "set python print-stack full" \
     "set python print-stack to full"
 
+# Verify that 'bt', 'bt -no-filters' print the same info
+# when there are no filters, no matching filters, or matching filters.
+# In particular, no address should be printed, as the default for
+# backtrace -frame-info is 'location', and the breakpoint we just hit
+# is at the beginning of a line.
+# Same tests done again after having loaded the filters.
+gdb_test "bt 1" "#0  main .*" "bt 1, no filter loaded"
+gdb_test "bt -no-filters 1" "#0  main .*" "bt -no-filters 1, no filter loaded"
+
+
 # Load global frame-filters
 set remote_python_file [gdb_remote_download host \
 			    ${srcdir}/${subdir}/${testfile}.py]
 gdb_test_no_output "source ${remote_python_file}" "load python file"
 
+# Re-verify the frame-info printed once filters are loaded.
+# For the first check, the Reverse filter is matching.
+gdb_test "bt 1" "#0  niam .*" "bt 1, filters loaded"
+gdb_test "bt -no-filters 1" "#0  main .*" "bt -no-filters 1, filters loaded"
+
 gdb_breakpoint [gdb_get_line_number "Backtrace end breakpoint"]
 gdb_breakpoint [gdb_get_line_number "Inner test breakpoint"]
 gdb_continue_to_breakpoint "Inner test breakpoint"
@@ -161,6 +176,10 @@ gdb_test "bt full hide" \
     ".*#0.*end_func.*str = $hex \"The End\".*st2 = $hex \"Is Near\".*b = 12.*c = 5.*#1.*in funca \\(\\).*#2.*in funcb \\(j=10\\).*bar = \{a = 42, b = 84\}.*#22.*in func1 \\(\\)\[^#\]*#24.*in func3 \\(i=3\\).*" \
     "bt full hide with Reverse disabled"
 
+# Re-enable Reverse
+gdb_test_no_output "enable frame-filter global Reverse" \
+    "re-enable frame-filter global Reverse"
+
 # Test set print frame-arguments
 # none
 gdb_test_no_output "set print frame-arguments none" \
@@ -169,7 +188,7 @@ gdb_test "bt no-filter 1" \
     "#0.*end_func \\(foo=\.\.\., bar=\.\.\., fb=\.\.\., bf=\.\.\.\\) at .*py-framefilter.c.*" \
     "bt no-filter 1 no args"
 gdb_test "bt 1" \
-    "#0.*end_func \\(foo=\.\.\., bar=\.\.\., fb=\.\.\., bf=\.\.\.\\) at .*py-framefilter.c.*" \
+    "#0.*cnuf_dneThe End \\(foo=\.\.\., bar=\.\.\., fb=\.\.\., bf=\.\.\.\\) at .*py-framefilter.c.*" \
     "bt 1 no args"
 
 # scalars
@@ -179,9 +198,54 @@ gdb_test "bt no-filter 1" \
     "#0.*end_func \\(foo=21, bar=$hex \"Param\", fb=$hex, bf=\.\.\.\\) at .*py-framefilter.c.*" \
     "bt no-filter 1 scalars"
 gdb_test "bt 1" \
-    "#0.*end_func \\(foo=21, bar=$hex \"Param\", fb=$hex, bf=\.\.\.\\) at .*py-framefilter.c.*" \
+    "#0.*cnuf_dneThe End \\(foo=21, bar=$hex \"Param\", fb=$hex, bf=\.\.\.\\) at .*py-framefilter.c.*" \
     "bt 1 scalars"
 
+# presence
+gdb_test_no_output "set print frame-arguments presence" \
+    "turn frame arguments to presence only"
+gdb_test "bt no-filter 1" \
+    "#0.*end_func \\(\.\.\.\\) at .*py-framefilter.c.*" \
+    "bt no-filter 1 presence"
+gdb_test "bt 1" \
+    "#0.*cnuf_dneThe End \\(\.\.\.\\) at .*py-framefilter.c.*" \
+    "bt 1 presence"
+
+# Test set print frame-info, with only presence for args.
+# short-location
+gdb_test_no_output "set print frame-info short-location" \
+    "frame-info short-location"
+gdb_test "bt no-filter 1" \
+     "#0.*end_func \\(\.\.\.\\)\r\n.*" \
+    "bt no-filter 1 short-location"
+gdb_test "bt 1" \
+    "#0.*cnuf_dneThe End \\(\.\.\.\\)\r\n.*" \
+    "bt 1 short-location"
+
+# source-and-location
+gdb_test_no_output "set print frame-info source-and-location" \
+    "frame-info source-and-location"
+gdb_test "bt no-filter 1" \
+    "#0.*end_func \\(\.\.\.\\) at .*py-framefilter.c.*\r\n.*\[1-9\]\[0-9\]*.*" \
+    "bt no-filter 1 source-and-location"
+gdb_test "bt 1" \
+    "#0.*cnuf_dneThe End \\(\.\.\.\\) at .*py-framefilter.c.*\r\n.*\[1-9\]\[0-9\]*.*" \
+    "bt 1 source-and-location"
+
+# source-line
+gdb_test_no_output "set print frame-info source-line" \
+    "frame-info source-line"
+gdb_test "bt no-filter 1" \
+    "\[1-9\]\[0-9\]*\[ \t\]*return; /\\* Backtrace end breakpoint \\*/.*" \
+    "bt no-filter 1 source-line"
+gdb_test "bt 1" \
+    "\[1-9\]\[0-9\]*\[ \t\]*return; /\\* Backtrace end breakpoint \\*/.*" \
+    "bt 1 source-line"
+
+# set print frame-info back to auto.
+gdb_test_no_output "set print frame-info auto" \
+    "frame-info auto"
+
 # all
 gdb_test_no_output "set print frame-arguments all" \
     "turn on frame arguments"
@@ -189,7 +253,7 @@ gdb_test "bt no-filter 1" \
     "#0.*end_func \\(foo=21, bar=$hex \"Param\", fb=$hex, bf=\{nothing = $hex \"Foo Bar\", f = 42, s = 19\}\\) at .*py-framefilter.c.*" \
     "bt no-filter 1 all args"
 gdb_test "bt 1" \
-    "#0.*end_func \\(foo=21, bar=$hex \"Param\", fb=$hex, bf=\{nothing = $hex \"Foo Bar\", f = 42, s = 19\}\\) at .*py-framefilter.c.*" \
+    "#0.*cnuf_dneThe End \\(foo=21, bar=$hex \"Param\", fb=$hex, bf=\{nothing = $hex \"Foo Bar\", f = 42, s = 19\}\\) at .*py-framefilter.c.*" \
     "bt 1 all args"
 
 # set print address off
@@ -199,7 +263,7 @@ gdb_test "bt no-filter 1" \
     "#0  end_func \\(foo=21, bar=\"Param\", fb=, bf=\{nothing = \"Foo Bar\", f = 42, s = 19\}\\) at .*py-framefilter.c.*" \
     "bt no-filter 1 no address"
 gdb_test "bt 1" \
-    "#0  end_func \\(foo=21, bar=\"Param\", fb=, bf=\{nothing = \"Foo Bar\", f = 42, s = 19\}\\) at .*py-framefilter.c.*" \
+    "#0  cnuf_dneThe End \\(foo=21, bar=\"Param\", fb=, bf=\{nothing = \"Foo Bar\", f = 42, s = 19\}\\) at .*py-framefilter.c.*" \
     "bt 1 no addresss"
 
 gdb_test_no_output "set python print-stack message" \
-- 
2.20.1

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

* [RFAv3 1/3] Implement 'set print frame-info|frame-arguments presence'.
  2019-06-19 16:06 [RFAv3 0/3] Implement 'set print frame-info|frame-arguments Philippe Waroquiers
@ 2019-06-19 16:06 ` Philippe Waroquiers
  2019-07-25 18:12   ` Tom Tromey
  2019-06-19 16:06 ` [RFAv3 2/3] Test " Philippe Waroquiers
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Philippe Waroquiers @ 2019-06-19 16:06 UTC (permalink / raw)
  To: gdb-patches; +Cc: Philippe Waroquiers

New settings allow to better control what frame information is printed.

'set print frame-info' allows to override the default frame information
printed when a GDB command prints a frame.
The backtrace command has a new option -frame-info to override
this global setting.

It is now possible to have very short frame information by using the
new 'set print frame-arguments presence' and
'set print frame-info short-location'.

Combined with 'set print address off', a backtrace will only show
the essential information to see the function call chain, e.g.:
  (gdb) set print address off
  (gdb) set print frame-arguments presence
  (gdb) set print frame-info short-location
  (gdb) bt
  #0  break_me ()
  #1  call_me (...)
  #2  main ()
  (gdb)

This is handy in particular for big backtraces with functions having
many arguments.

Python frame filter printing logic has been updated to respect the new
setting in non MI mode.

Also, the default frame information printed was inconsistent when
backtrace was printing the frame information itself, or when the python
frame filtering code was printing the frame information.
This patch changes the default of python frame filtering to have a
consistent behaviour regarding printed frame-information, whatever
the presence/activity/matches of python filters.

2019-06-19  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

	* frame.h (enum print_what): New value 'SHORT_LOCATION', update
	comments.
	(print_frame_info_auto, print_frame_info_source_line,
	print_frame_info_location, print_frame_info_source_and_location,
	print_frame_info_location_and_address, print_frame_info_short_location):
	New declarations.
	(struct frame_print_options): New member print_frame_info.
	* extension.h (enum ext_lang_frame_args): New value CLI_PRESENCE.
	* stack.h (get_user_print_what_frame_info): New declaration.
	(frame_show_address): New declaration.
	* stack.c (print_frame_arguments_choices): New value 'presence'.
	(print_frame_info_auto, print_frame_info_source_line,
	print_frame_info_location, print_frame_info_source_and_location,
	print_frame_info_location_and_address, print_frame_info_short_location,
	print_frame_info_choices, print_frame_info_print_what): New definitions.
	(print_frame_args): Only print dots for args if print frame-arguments
	is 'presence'.
	(frame_print_option_defs): New element for "frame-info".
	(get_user_print_what_frame_info): New function.
	(frame_show_address): Make non static.  Move comment to stack.h.
	(print_frame_info_to_print_what): New function.
	(print_frame_info): Update comment.  Use fp_opts.print_frame_info
	to decide what to print.
	(backtrace_command_1): Handle the new print_frame_arguments_presence
	value.
	(_initialize_stack): Call add_setshow_enum_cmd for frame-info.
	* python/py-framefilter.c (py_print_args): Handle CLI_PRESENCE.
	(py_print_frame): In non-mi mode, use LOCATION as default for
	print_what, similarly to frame information printed directly by
	backtrace command. Handle frame-info user option in non MI mode.
---
 gdb/extension.h             |   5 +-
 gdb/frame.h                 |  37 ++++++++---
 gdb/python/py-framefilter.c |  90 ++++++++++++++++++++++----
 gdb/stack.c                 | 123 ++++++++++++++++++++++++++++++------
 gdb/stack.h                 |  12 ++++
 5 files changed, 226 insertions(+), 41 deletions(-)

diff --git a/gdb/extension.h b/gdb/extension.h
index 2f1b71851c..405346ff6a 100644
--- a/gdb/extension.h
+++ b/gdb/extension.h
@@ -125,7 +125,10 @@ enum ext_lang_frame_args
     CLI_SCALAR_VALUES,
 
     /* Print all values for arguments when invoked from the CLI. */
-    CLI_ALL_VALUES
+    CLI_ALL_VALUES,
+
+    /* Only indicate the presence of arguments when invoked from the CLI.  */
+    CLI_PRESENCE
   };
 
 /* The possible results of
diff --git a/gdb/frame.h b/gdb/frame.h
index a79eeeeab1..ccc285005a 100644
--- a/gdb/frame.h
+++ b/gdb/frame.h
@@ -677,18 +677,28 @@ extern struct gdbarch *frame_unwind_arch (frame_info *next_frame);
 extern struct gdbarch *frame_unwind_caller_arch (struct frame_info *frame);
 
 
-/* Values for the source flag to be used in print_frame_info_base().  */
+/* Values for the source flag to be used in print_frame_info ().
+   For all the cases below, the address is never printed if
+   'set print address' is off.  When 'set print address' is on,
+   the address is printed if the program counter is not at the
+   beginning of the source line of the frame
+   and PRINT_WHAT is != LOC_AND_ADDRESS.  */
 enum print_what
-  { 
-    /* Print only the source line, like in stepi.  */
-    SRC_LINE = -1, 
-    /* Print only the location, i.e. level, address (sometimes)
-       function, args, file, line, line num.  */
+  {
+    /* Print only the address, source line, like in stepi.  */
+    SRC_LINE = -1,
+    /* Print only the location, i.e. level, address,
+       function, args (as controlled by 'set print frame-arguments'),
+       file, line, line num.  */
     LOCATION,
     /* Print both of the above.  */
-    SRC_AND_LOC, 
-    /* Print location only, but always include the address.  */
-    LOC_AND_ADDRESS 
+    SRC_AND_LOC,
+    /* Print location only, print the address even if the program counter
+       is at the beginning of the source line.  */
+    LOC_AND_ADDRESS,
+    /* Print only level and function,
+       i.e. location only, without address, file, line, line num.  */
+    SHORT_LOCATION
   };
 
 /* Allocate zero initialized memory from the frame cache obstack.
@@ -772,6 +782,14 @@ extern const char print_frame_arguments_all[];
 extern const char print_frame_arguments_scalars[];
 extern const char print_frame_arguments_none[];
 
+/* The possible choices of "set print frame-info".  */
+extern const char print_frame_info_auto[];
+extern const char print_frame_info_source_line[];
+extern const char print_frame_info_location[];
+extern const char print_frame_info_source_and_location[];
+extern const char print_frame_info_location_and_address[];
+extern const char print_frame_info_short_location[];
+
 /* The possible choices of "set print entry-values".  */
 extern const char print_entry_values_no[];
 extern const char print_entry_values_only[];
@@ -787,6 +805,7 @@ extern const char print_entry_values_default[];
 struct frame_print_options
 {
   const char *print_frame_arguments = print_frame_arguments_scalars;
+  const char *print_frame_info = print_frame_info_auto;
   const char *print_entry_values = print_entry_values_default;
 
   /* If non-zero, don't invoke pretty-printers for frame
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index 95ad410f23..f1282597a5 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -25,6 +25,8 @@
 #include "python.h"
 #include "ui-out.h"
 #include "valprint.h"
+#include "stack.h"
+#include "source.h"
 #include "annotate.h"
 #include "hashtab.h"
 #include "demangle.h"
@@ -713,9 +715,21 @@ py_print_args (PyObject *filter,
   annotate_frame_args ();
   out->text (" (");
 
-  if (args_iter != Py_None
-      && (enumerate_args (args_iter.get (), out, args_type, 0, frame)
-	  == EXT_LANG_BT_ERROR))
+  if (args_type == CLI_PRESENCE)
+    {
+      if (args_iter != Py_None)
+	{
+	  gdbpy_ref<> item (PyIter_Next (args_iter.get ()));
+
+	  if (item != NULL)
+	    out->text ("...");
+	  else if (PyErr_Occurred ())
+	    return EXT_LANG_BT_ERROR;
+	}
+    }
+  else if (args_iter != Py_None
+	   && (enumerate_args (args_iter.get (), out, args_type, 0, frame)
+	       == EXT_LANG_BT_ERROR))
     return EXT_LANG_BT_ERROR;
 
   out->text (")");
@@ -748,7 +762,16 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
   struct gdbarch *gdbarch = NULL;
   struct frame_info *frame = NULL;
   struct value_print_options opts;
+
   int print_level, print_frame_info, print_args, print_locals;
+  /* Note that the below default in non-mi mode is the same as the
+     default value for the backtrace command (see the call to print_frame_info
+     in backtrace_command_1).
+     Having the same default ensures that 'bt' and 'bt no-filters'
+     have the same behaviour when some filters exist but do not apply
+     to a frame.  */
+  enum print_what print_what
+    = out->is_mi_like_p () ? LOC_AND_ADDRESS : LOCATION;
   gdb::unique_xmalloc_ptr<char> function_to_free;
 
   /* Extract print settings from FLAGS.  */
@@ -758,6 +781,17 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
   print_locals = (flags & PRINT_LOCALS) ? 1 : 0;
 
   get_user_print_options (&opts);
+  if (print_frame_info)
+  {
+    gdb::optional<enum print_what> user_frame_info_print_what;
+
+    get_user_print_what_frame_info (&user_frame_info_print_what);
+    if (!out->is_mi_like_p () && user_frame_info_print_what.has_value ())
+      {
+	/* Use the specific frame information desired by the user.  */
+	print_what = *user_frame_info_print_what;
+      }
+  }
 
   /* Get the underlying frame.  This is needed to determine GDB
   architecture, and also, in the cases of frame variables/arguments to
@@ -771,6 +805,8 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
   if (frame == NULL)
     return EXT_LANG_BT_ERROR;
 
+  symtab_and_line sal = find_frame_sal (frame);
+
   gdbarch = get_frame_arch (frame);
 
   /* stack-list-variables.  */
@@ -815,9 +851,19 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
 	}
     }
 
+  /* For MI, each piece is controlled individually.  */
+  bool location_print = (print_frame_info
+			 && !out->is_mi_like_p ()
+			 && (print_what == LOCATION
+			     || print_what == SRC_AND_LOC
+			     || print_what == LOC_AND_ADDRESS
+			     || print_what == SHORT_LOCATION));
+
   /* Print frame level.  MI does not require the level if
      locals/variables only are being printed.  */
-  if ((print_frame_info || print_args) && print_level)
+  if (print_level
+      && (location_print
+	  || (out->is_mi_like_p () && (print_frame_info || print_args))))
     {
       struct frame_info **slot;
       int level;
@@ -844,16 +890,21 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
 	}
     }
 
-  if (print_frame_info)
+  if (location_print || (out->is_mi_like_p () && print_frame_info))
     {
       /* Print address to the address field.  If an address is not provided,
 	 print nothing.  */
       if (opts.addressprint && has_addr)
 	{
-	  annotate_frame_address ();
-	  out->field_core_addr ("addr", gdbarch, address);
-	  annotate_frame_address_end ();
-	  out->text (" in ");
+	  if (!sal.symtab
+	      || frame_show_address (frame, sal)
+	      || print_what == LOC_AND_ADDRESS)
+	    {
+	      annotate_frame_address ();
+	      out->field_core_addr ("addr", gdbarch, address);
+	      annotate_frame_address_end ();
+	      out->text (" in ");
+	    }
 	}
 
       /* Print frame function name.  */
@@ -905,14 +956,17 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
 
   /* Frame arguments.  Check the result, and error if something went
      wrong.  */
-  if (print_args)
+  if (print_args && (location_print || out->is_mi_like_p ()))
     {
       if (py_print_args (filter, out, args_type, frame) == EXT_LANG_BT_ERROR)
 	return EXT_LANG_BT_ERROR;
     }
 
   /* File name/source/line number information.  */
-  if (print_frame_info)
+  bool print_location_source
+    = ((location_print && print_what != SHORT_LOCATION)
+       || (out->is_mi_like_p () && print_frame_info));
+  if (print_location_source)
     {
       annotate_frame_source_begin ();
 
@@ -964,12 +1018,24 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
                            (gdbarch_bfd_arch_info (gdbarch))->printable_name);
     }
 
+  bool source_print
+    = (! out->is_mi_like_p ()
+       && (print_what == SRC_LINE || print_what == SRC_AND_LOC));
+  if (source_print)
+    {
+      if (print_location_source)
+	out->text ("\n"); /* Newline after the location source.  */
+      print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
+    }
+
   /* For MI we need to deal with the "children" list population of
      elided frames, so if MI output detected do not send newline.  */
   if (! out->is_mi_like_p ())
     {
       annotate_frame_end ();
-      out->text ("\n");
+      /* print_source_lines has already printed a newline.  */
+      if (!source_print)
+	out->text ("\n");
     }
 
   if (print_locals)
diff --git a/gdb/stack.c b/gdb/stack.c
index b3d113d3b4..de3eb27d0c 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -61,15 +61,42 @@
 const char print_frame_arguments_all[] = "all";
 const char print_frame_arguments_scalars[] = "scalars";
 const char print_frame_arguments_none[] = "none";
+const char print_frame_arguments_presence[] = "presence";
 
 static const char *const print_frame_arguments_choices[] =
 {
   print_frame_arguments_all,
   print_frame_arguments_scalars,
   print_frame_arguments_none,
+  print_frame_arguments_presence,
   NULL
 };
 
+/* The possible choices of "set print frame-info", and the value
+   of this setting.  */
+
+const char print_frame_info_auto[] = "auto";
+const char print_frame_info_source_line[] = "source-line";
+const char print_frame_info_location[] = "location";
+const char print_frame_info_source_and_location[] = "source-and-location";
+const char print_frame_info_location_and_address[] = "location-and-address";
+const char print_frame_info_short_location[] = "short-location";
+
+static const char *const print_frame_info_choices[] =
+  {print_frame_info_auto,
+   print_frame_info_source_line,
+   print_frame_info_location,
+   print_frame_info_source_and_location,
+   print_frame_info_location_and_address,
+   print_frame_info_short_location,
+   NULL};
+
+/* print_frame_info_print_what[i] maps a choice to the corresponding
+   print_what enum.  */
+static const gdb::optional<enum print_what> print_frame_info_print_what[] =
+  {{}, /* Empty value for "auto".  */
+   SRC_LINE, LOCATION, SRC_AND_LOC, LOC_AND_ADDRESS, SHORT_LOCATION};
+
 /* The possible choices of "set print entry-values", and the value
    of this setting.  */
 
@@ -137,6 +164,17 @@ or both.  Note that one or both of these values may be <optimized out>."),
     N_("If set, frame arguments are printed in raw form, bypassing any\n\
 pretty-printers for that value.")
   },
+
+  enum_option_def {
+    "frame-info",
+    print_frame_info_choices,
+    [] (frame_print_options *opt) { return &opt->print_frame_info; },
+    NULL, /* show_cmd_cb */
+    N_("Set printing of frame information."),
+    N_("Show printing of frame information."),
+    NULL /* help_doc */
+  }
+
 };
 
 /* Options for the "backtrace" command.  */
@@ -209,10 +247,9 @@ static struct symtab *last_displayed_symtab = 0;
 static int last_displayed_line = 0;
 \f
 
-/* Return 1 if we should display the address in addition to the location,
-   because we are in the middle of a statement.  */
+/* See stack.h.  */
 
-static int
+int
 frame_show_address (struct frame_info *frame,
 		    struct symtab_and_line sal)
 {
@@ -631,9 +668,13 @@ print_frame_args (const frame_print_options &fp_opts,
   long highest_offset = -1;
   /* Number of ints of arguments that we have printed so far.  */
   int args_printed = 0;
+  /* True if we should print arg names.  If false, we only indicate
+     the presence of arguments by printing ellipsis.  */
+  bool print_names
+    = fp_opts.print_frame_arguments != print_frame_arguments_presence;
   /* True if we should print arguments, false otherwise.  */
-  bool print_args
-    = fp_opts.print_frame_arguments != print_frame_arguments_none;
+  bool print_args = print_names
+    && fp_opts.print_frame_arguments != print_frame_arguments_none;
 
   if (func)
     {
@@ -653,6 +694,13 @@ print_frame_args (const frame_print_options &fp_opts,
 	  if (!SYMBOL_IS_ARGUMENT (sym))
 	    continue;
 
+	  if (!print_names)
+	    {
+	      uiout->text ("...");
+	      first = 0;
+	      break;
+	    }
+
 	  switch (SYMBOL_CLASS (sym))
 	    {
 	    case LOC_ARG:
@@ -801,8 +849,11 @@ print_frame_args (const frame_print_options &fp_opts,
       else
 	start = highest_offset;
 
-      print_frame_nameless_args (frame, start, num - args_printed,
-				 first, stream);
+      if (!print_names && !first && num > 0)
+	uiout->text ("...");
+      else
+	print_frame_nameless_args (frame, start, num - args_printed,
+				   first, stream);
     }
 }
 
@@ -859,13 +910,35 @@ do_gdb_disassembly (struct gdbarch *gdbarch,
     }
 }
 
+/* Converts the PRINT_FRAME_INFO choice to an optional enum print_what.
+   Value not present indicates to the caller to use default values
+   specific to the command being executed.  */
+
+static gdb::optional<enum print_what>
+print_frame_info_to_print_what (const char *print_frame_info)
+{
+
+  for (int i = 0; print_frame_info_choices[i] != NULL; i++)
+    if (print_frame_info == print_frame_info_choices[i])
+      return print_frame_info_print_what[i];
+
+  internal_error (__FILE__, __LINE__,
+		  "Unexpected print frame-info value `%s'.",
+		  print_frame_info);
+}
+
+void
+get_user_print_what_frame_info (gdb::optional<enum print_what> *what)
+{
+  *what = print_frame_info_to_print_what
+    (user_frame_print_options.print_frame_info);
+}
+
 /* Print information about frame FRAME.  The output is format according
-   to PRINT_LEVEL and PRINT_WHAT and PRINT_ARGS.  The meaning of
-   PRINT_WHAT is:
-   
-   SRC_LINE: Print only source line.
-   LOCATION: Print only location.
-   SRC_AND_LOC: Print location and source line.
+   to PRINT_LEVEL and PRINT_WHAT and PRINT_ARGS.  For the meaning of
+   PRINT_WHAT, see enum print_what comments in frame.h.
+   Note that PRINT_WHAT is overriden if FP_OPTS.print_frame_info
+   != print_frame_info_auto.
 
    Used in "where" output, and to emit breakpoint or step
    messages.  */
@@ -881,6 +954,13 @@ print_frame_info (const frame_print_options &fp_opts,
   int location_print;
   struct ui_out *uiout = current_uiout;
 
+  if (!current_uiout->is_mi_like_p ()
+      && fp_opts.print_frame_info != print_frame_info_auto)
+    {
+      /* Use the specific frame information desired by the user.  */
+      print_what = *print_frame_info_to_print_what (fp_opts.print_frame_info);
+    }
+
   if (get_frame_type (frame) == DUMMY_FRAME
       || get_frame_type (frame) == SIGTRAMP_FRAME
       || get_frame_type (frame) == ARCH_FRAME)
@@ -944,10 +1024,10 @@ print_frame_info (const frame_print_options &fp_opts,
      to get the line containing FRAME->pc.  */
   symtab_and_line sal = find_frame_sal (frame);
 
-  location_print = (print_what == LOCATION 
+  location_print = (print_what == LOCATION
+		    || print_what == SRC_AND_LOC
 		    || print_what == LOC_AND_ADDRESS
-		    || print_what == SRC_AND_LOC);
-
+		    || print_what == SHORT_LOCATION);
   if (location_print || !sal.symtab)
     print_frame (fp_opts, frame, print_level, print_what, print_args, sal);
 
@@ -1299,7 +1379,7 @@ print_frame (const frame_print_options &fp_opts,
 	QUIT;
       }
     uiout->text (")");
-    if (sal.symtab)
+    if (print_what != SHORT_LOCATION && sal.symtab)
       {
 	const char *filename_display;
       
@@ -1322,7 +1402,8 @@ print_frame (const frame_print_options &fp_opts,
 	annotate_frame_source_end ();
       }
 
-    if (pc_p && (funname == NULL || sal.symtab == NULL))
+    if (print_what != SHORT_LOCATION
+	&& pc_p && (funname == NULL || sal.symtab == NULL))
       {
 	char *lib = solib_name_from_address (get_frame_program_space (frame),
 					     get_frame_pc (frame));
@@ -1932,8 +2013,12 @@ backtrace_command_1 (const frame_print_options &fp_opts,
 	arg_type = CLI_SCALAR_VALUES;
       else if (fp_opts.print_frame_arguments == print_frame_arguments_all)
 	arg_type = CLI_ALL_VALUES;
-      else
+      else if (fp_opts.print_frame_arguments == print_frame_arguments_presence)
+	arg_type = CLI_PRESENCE;
+      else if (fp_opts.print_frame_arguments == print_frame_arguments_none)
 	arg_type = NO_VALUES;
+      else
+	gdb_assert (0);
 
       result = apply_ext_lang_frame_filter (get_current_frame (), flags,
 					    arg_type, current_uiout,
diff --git a/gdb/stack.h b/gdb/stack.h
index 9ac77c0617..dda4fc9f66 100644
--- a/gdb/stack.h
+++ b/gdb/stack.h
@@ -42,6 +42,18 @@ void iterate_over_block_local_vars (const struct block *block,
 				    iterate_over_block_arg_local_vars_cb cb,
 				    void *cb_data);
 
+/* Initialize *WHAT to be a copy of the user desired print what frame info.
+   If !WHAT.has_value (), the printing function chooses a default set of
+   information to print, otherwise the printing function should print
+   the relevant information.  */
+
+void get_user_print_what_frame_info (gdb::optional<enum print_what> *what);
+
+/* Return 1 if we should display the address in addition to the location,
+   because we are in the middle of a statement.  */
+
+int frame_show_address (struct frame_info *frame, struct symtab_and_line sal);
+
 /* Get or set the last displayed symtab and line, which is, e.g. where we set a
  * breakpoint when `break' is supplied with no arguments.  */
 void clear_last_displayed_sal (void);
-- 
2.20.1

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

* [RFAv3 3/3] Document 'set print frame-info|frame-arguments presence'.
  2019-06-19 16:06 [RFAv3 0/3] Implement 'set print frame-info|frame-arguments Philippe Waroquiers
  2019-06-19 16:06 ` [RFAv3 1/3] Implement 'set print frame-info|frame-arguments presence' Philippe Waroquiers
  2019-06-19 16:06 ` [RFAv3 2/3] Test " Philippe Waroquiers
@ 2019-06-19 16:06 ` Philippe Waroquiers
  2019-06-19 16:58   ` Eli Zaretskii
  2019-07-05 20:06 ` PING Re: [RFAv3 0/3] Implement 'set print frame-info|frame-arguments Philippe Waroquiers
  3 siblings, 1 reply; 9+ messages in thread
From: Philippe Waroquiers @ 2019-06-19 16:06 UTC (permalink / raw)
  To: gdb-patches; +Cc: Philippe Waroquiers

gdb/ChangeLog
2019-06-19  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

	* NEWS: Mention 'set|show print frame-info'.  Mention new
	'presence' value for 'frame-arguments'.  Mention new '-frame-info'
	backtrace argument.  Mention that python frame filtering code
	is now consistent with what 'backtrace' command prints.

gdb/doc/ChangeLog
2019-06-19  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

	* gdb.texinfo (Backtrace): Document the new '-frame-info'
	backtrace option.  Reference 'set print frame-info'.
	(Print Settings): Document 'set|show print frame-info'.
	Document new 'presence' value for 'set print frame-arguments.
---
 gdb/NEWS            | 19 ++++++++++++++
 gdb/doc/gdb.texinfo | 63 ++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 79 insertions(+), 3 deletions(-)

diff --git a/gdb/NEWS b/gdb/NEWS
index 2cc82e8656..7579c73090 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -36,6 +36,11 @@
   ** gdb.Type has a new property 'objfile' which returns the objfile the
      type was defined in.
 
+  ** The frame information printed by the python frame filtering code
+     is now consistent with what the 'backtrace' command prints when
+     there are no filters, or when the 'backtrace' '-no-filters' option
+     is given.
+
 * New commands
 
 | [COMMAND] | SHELL_COMMAND
@@ -88,6 +93,14 @@ maint test-settings KIND
   A set of commands used by the testsuite for exercising the settings
   infrastructure.
 
+set print frame-info [short-location|location|location-and-address
+                        |source-and-location|source-line|auto]
+show print frame-info
+  This controls what frame information is printed by the commands printing
+  a frame.  This setting will e.g. influence the behaviour of 'backtrace',
+  'frame', 'stepi'.  The python frame filtering also respect this setting.
+  The 'backtrace' '-frame-info' option can override this global setting.
+
 * Changed commands
 
 help
@@ -107,6 +120,10 @@ show style
   a style name in their output using its own style, to help
   the user visualize the different styles.
 
+set print frame-arguments
+  The new value 'presence' indicates to only indicate the presence of
+  arguments using ..., instead of printing argument names and values.
+
 set print raw-frame-arguments
 show print raw-frame-arguments
 
@@ -161,6 +178,8 @@ maint show test-options-completion-result
       -entry-values no|only|preferred|if-needed|both|compact|default
       -frame-arguments all|scalars|none
       -raw-frame-arguments [on|off]
+      -frame-info auto|source-line|location|source-and-location
+           |location-and-address|short-location
       -past-main [on|off]
       -past-entry [on|off]
 
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 55be2ef692..deac4e4460 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -7713,6 +7713,10 @@ Related setting: @ref{set print frame-arguments}.
 @item -raw-frame-arguments [@code{on}|@code{off}]
 Set whether to print frame arguments in raw form.
 Related setting: @ref{set print raw-frame-arguments}.
+
+@item -frame-info @code{auto}|@code{source-line}|@code{location}|@code{source-and-location}|@code{location-and-address}|@code{short-location}
+Set printing of frame information.
+Related setting: @ref{set print frame-info}.
 @end table
 
 The optional @var{qualifier} is maintained for backward compatibility.
@@ -7777,6 +7781,8 @@ The value of parameter @code{data} in frame 1 has been replaced by
 only if it is a scalar (integer, pointer, enumeration, etc).  See command
 @kbd{set print frame-arguments} in @ref{Print Settings} for more details
 on how to configure the way function parameter values are printed.
+The command @kbd{set print frame-info} (@pxref{Print Settings}) controls
+what frame information is printed.
 
 @cindex optimized out, in backtrace
 @cindex function call arguments, optimized out
@@ -10723,7 +10729,7 @@ If the number is 0, then the printing is unlimited.
 @cindex printing frame argument values
 @cindex print all frame argument values
 @cindex print frame argument values for scalars only
-@cindex do not print frame argument values
+@cindex do not print frame arguments
 This command allows to control how the values of arguments are printed
 when the debugger prints a frame (@pxref{Frames}).  The possible
 values are:
@@ -10751,6 +10757,17 @@ is replaced by @code{@dots{}}.  In this case, the example above now becomes:
 #1  0x08048361 in call_me (i=@dots{}, s=@dots{}, ss=@dots{}, u=@dots{}, e=@dots{})
   at frame-args.c:23
 @end smallexample
+
+@item presence
+Only the presence of arguments is indicated by @code{@dots{}}.
+The @code{@dots{}} are not printed for function without any arguments.
+None of the argument names and values are printed.
+In this case, the example above now becomes:
+
+@smallexample
+#1  0x08048361 in call_me (@dots{}) at frame-args.c:23
+@end smallexample
+
 @end table
 
 By default, only scalar arguments are printed.  This command can be used
@@ -10761,8 +10778,8 @@ information printed in each frame, making the backtrace more readable.
 Also, it improves performance when displaying Ada frames, because
 the computation of large arguments can sometimes be CPU-intensive,
 especially in large applications.  Setting @code{print frame-arguments}
-to @code{scalars} (the default) or @code{none} avoids this computation,
-thus speeding up the display of each Ada frame.
+to @code{scalars} (the default), @code{none} or @code{presence} avoids
+this computation, thus speeding up the display of each Ada frame.
 
 @item show print frame-arguments
 Show how the value of arguments should be displayed when printing a frame.
@@ -10895,6 +10912,46 @@ entry resolution see @ref{set debug entry-values}.
 Show the method being used for printing of frame argument values at function
 entry.
 
+@anchor{set print frame-info}
+@item set print frame-info @var{value}
+@kindex set print frame-info
+@cindex printing frame information
+@cindex frame information, printing
+This command allows to control the information printed when
+the debugger prints a frame.  See @ref{Frames}, @ref{Backtrace},
+for a general explanation about frames and frame information.
+Note that some other settings (such as @code{set print frame-arguments}
+and @code{set print address}) are also influencing if and how some frame
+information is displayed.  In particular, the frame program counter is never
+printed if @code{set print address} is off.
+
+The possible values for @code{set print frame-info} are:
+@table @code
+@item short-location
+Print the frame level, the program counter (if not at the
+beginning of the location source line), the function, the function
+arguments.
+@item location
+Same as @code{short-location} but also print the source file and source line
+number.
+@item location-and-address
+Same as @code{location} but print the program counter even if located at the
+beginning of the location source line.
+@item source-line
+Print the program counter (if not at the beginning of the location
+source line), the line number and the source line.
+@item source-and-location
+Print what @code{location} and @code{source-line} are printing.
+@item auto
+The information printed for a frame is decided automatically
+by the @value{GDBN} command that prints a frame.
+For example, @code{frame} prints the information printed by
+@code{source-and-location} while @code{stepi} will switch between
+@code{source-line} and @code{source-and-location} depending on the program
+counter.
+The default value is @code{auto}.
+@end table
+
 @anchor{set print repeats}
 @item set print repeats @var{number-of-repeats}
 @itemx set print repeats unlimited
-- 
2.20.1

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

* [RFAv3 0/3] Implement 'set print frame-info|frame-arguments
@ 2019-06-19 16:06 Philippe Waroquiers
  2019-06-19 16:06 ` [RFAv3 1/3] Implement 'set print frame-info|frame-arguments presence' Philippe Waroquiers
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Philippe Waroquiers @ 2019-06-19 16:06 UTC (permalink / raw)
  To: gdb-patches

When printing big stacktraces having a lot of functions with a lot of
arguments, it can be handy to see a lot less information in the
printed frames.

With the new settings, it is possible to have backtraces such as:
  (gdb) bt
  #0  break_me ()
  #1  call_me (...)
  #2  main ()
  (gdb)

that are only showing the level, the function name and the presence of
arguments.

This is the version V3 of the patch series.

Compared to V2, the changes are:
* Handles the comments of Tom:
   * Avoid leak in the py-framefilter.c code.
   * Ensure backtrace frame information printed does not depend on
     the presence of filters and/or of the -no-filters option.
* Reworked 'set print frame-info' to use the new -OPT option framework.
  A.o., it means that backtrace has a new option -frame-info to
  override the 'set print frame-info' settings.
* Updated the tests accordingly.
* The documentation and NEWS are also updated accordingly.

Compared to V1, the changes are:
* Handled the comment of Andreas Schwab : do not abbreviate words
  in 'set print fram-info' values, and use dash instead of underscore.
* Handled the comment of Tom about updating py-framefilter.c
  + updated py-framefilter.exp to test the new setting with python
  frame filter.
* Handled the comments of Eli about the documentation and NEWS.


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

* Re: [RFAv3 3/3] Document 'set print frame-info|frame-arguments presence'.
  2019-06-19 16:06 ` [RFAv3 3/3] Document " Philippe Waroquiers
@ 2019-06-19 16:58   ` Eli Zaretskii
  0 siblings, 0 replies; 9+ messages in thread
From: Eli Zaretskii @ 2019-06-19 16:58 UTC (permalink / raw)
  To: Philippe Waroquiers; +Cc: gdb-patches

> From: Philippe Waroquiers <philippe.waroquiers@skynet.be>
> Cc: Philippe Waroquiers <philippe.waroquiers@skynet.be>
> Date: Wed, 19 Jun 2019 18:06:27 +0200
> 
> gdb/ChangeLog
> 2019-06-19  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
> 
> 	* NEWS: Mention 'set|show print frame-info'.  Mention new
> 	'presence' value for 'frame-arguments'.  Mention new '-frame-info'
> 	backtrace argument.  Mention that python frame filtering code
> 	is now consistent with what 'backtrace' command prints.
> 
> gdb/doc/ChangeLog
> 2019-06-19  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
> 
> 	* gdb.texinfo (Backtrace): Document the new '-frame-info'
> 	backtrace option.  Reference 'set print frame-info'.
> 	(Print Settings): Document 'set|show print frame-info'.
> 	Document new 'presence' value for 'set print frame-arguments.

This is OK, thanks.

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

* PING Re: [RFAv3 0/3] Implement 'set print frame-info|frame-arguments
  2019-06-19 16:06 [RFAv3 0/3] Implement 'set print frame-info|frame-arguments Philippe Waroquiers
                   ` (2 preceding siblings ...)
  2019-06-19 16:06 ` [RFAv3 3/3] Document " Philippe Waroquiers
@ 2019-07-05 20:06 ` Philippe Waroquiers
  3 siblings, 0 replies; 9+ messages in thread
From: Philippe Waroquiers @ 2019-07-05 20:06 UTC (permalink / raw)
  To: gdb-patches

Ping ?

Thanks

Philippe

On Wed, 2019-06-19 at 18:06 +0200, Philippe Waroquiers wrote:
> When printing big stacktraces having a lot of functions with a lot of
> arguments, it can be handy to see a lot less information in the
> printed frames.
> 
> With the new settings, it is possible to have backtraces such as:
>   (gdb) bt
>   #0  break_me ()
>   #1  call_me (...)
>   #2  main ()
>   (gdb)
> 
> that are only showing the level, the function name and the presence of
> arguments.
> 
> This is the version V3 of the patch series.
> 
> Compared to V2, the changes are:
> * Handles the comments of Tom:
>    * Avoid leak in the py-framefilter.c code.
>    * Ensure backtrace frame information printed does not depend on
>      the presence of filters and/or of the -no-filters option.
> * Reworked 'set print frame-info' to use the new -OPT option framework.
>   A.o., it means that backtrace has a new option -frame-info to
>   override the 'set print frame-info' settings.
> * Updated the tests accordingly.
> * The documentation and NEWS are also updated accordingly.
> 
> Compared to V1, the changes are:
> * Handled the comment of Andreas Schwab : do not abbreviate words
>   in 'set print fram-info' values, and use dash instead of underscore.
> * Handled the comment of Tom about updating py-framefilter.c
>   + updated py-framefilter.exp to test the new setting with python
>   frame filter.
> * Handled the comments of Eli about the documentation and NEWS.
> 
> 

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

* Re: [RFAv3 1/3] Implement 'set print frame-info|frame-arguments presence'.
  2019-06-19 16:06 ` [RFAv3 1/3] Implement 'set print frame-info|frame-arguments presence' Philippe Waroquiers
@ 2019-07-25 18:12   ` Tom Tromey
  2019-07-29 20:12     ` Philippe Waroquiers
  0 siblings, 1 reply; 9+ messages in thread
From: Tom Tromey @ 2019-07-25 18:12 UTC (permalink / raw)
  To: Philippe Waroquiers; +Cc: gdb-patches

>>>>> "Philippe" == Philippe Waroquiers <philippe.waroquiers@skynet.be> writes:

Philippe> New settings allow to better control what frame information is printed.
Philippe> 'set print frame-info' allows to override the default frame information
Philippe> printed when a GDB command prints a frame.
Philippe> The backtrace command has a new option -frame-info to override
Philippe> this global setting.

Thanks for the patch.

It is essentially ok, there are just a few nits.
You can check it in with those fixed.

Philippe> +static const char *const print_frame_info_choices[] =
Philippe> +  {print_frame_info_auto,

The text here should be on a new line, not next to the brace.

Philippe> +   print_frame_info_source_line,
Philippe> +   print_frame_info_location,
Philippe> +   print_frame_info_source_and_location,
Philippe> +   print_frame_info_location_and_address,
Philippe> +   print_frame_info_short_location,
Philippe> +   NULL};

Likewise.

Philippe> +  bool print_args = print_names
Philippe> +    && fp_opts.print_frame_arguments != print_frame_arguments_none;
 
This looks incorrectly formatted.  It needs parens around the RHS.

Philippe> +static gdb::optional<enum print_what>
Philippe> +print_frame_info_to_print_what (const char *print_frame_info)
Philippe> +{
Philippe> +
Philippe> +  for (int i = 0; print_frame_info_choices[i] != NULL; i++)

Extra newline.

Philippe> +
Philippe> +void
Philippe> +get_user_print_what_frame_info (gdb::optional<enum print_what> *what)
Philippe> +{

Need some intro comment.

Philippe> +  *what = print_frame_info_to_print_what
Philippe> +    (user_frame_print_options.print_frame_info);

This also looks incorrectly formatted.  Needs parens perhaps.

Tom

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

* Re: [RFAv3 2/3] Test 'set print frame-info|frame-arguments presence'.
  2019-06-19 16:06 ` [RFAv3 2/3] Test " Philippe Waroquiers
@ 2019-07-25 18:58   ` Tom Tromey
  0 siblings, 0 replies; 9+ messages in thread
From: Tom Tromey @ 2019-07-25 18:58 UTC (permalink / raw)
  To: Philippe Waroquiers; +Cc: gdb-patches

>>>>> "Philippe" == Philippe Waroquiers <philippe.waroquiers@skynet.be> writes:

Philippe> Updated tests to test the new options and new values.
Philippe> Test the default for print_what in python frame filtering.
Philippe> Updated the tests impacted by the default in python frame filtering
Philippe> which is now consistent with the backtrace command.

Thanks.  I think this looks good.

Tom

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

* Re: [RFAv3 1/3] Implement 'set print frame-info|frame-arguments presence'.
  2019-07-25 18:12   ` Tom Tromey
@ 2019-07-29 20:12     ` Philippe Waroquiers
  0 siblings, 0 replies; 9+ messages in thread
From: Philippe Waroquiers @ 2019-07-29 20:12 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

On Thu, 2019-07-25 at 12:11 -0600, Tom Tromey wrote:
> > > > > > "Philippe" == Philippe Waroquiers <philippe.waroquiers@skynet.be> writes:
> 
> Philippe> New settings allow to better control what frame information is printed.
> Philippe> 'set print frame-info' allows to override the default frame information
> Philippe> printed when a GDB command prints a frame.
> Philippe> The backtrace command has a new option -frame-info to override
> Philippe> this global setting.
> 
> Thanks for the patch.
> 
> It is essentially ok, there are just a few nits.
> You can check it in with those fixed.
Thanks for the reviews.
I have pushed after handling the comments.

Philippe

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

end of thread, other threads:[~2019-07-29 20:12 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-19 16:06 [RFAv3 0/3] Implement 'set print frame-info|frame-arguments Philippe Waroquiers
2019-06-19 16:06 ` [RFAv3 1/3] Implement 'set print frame-info|frame-arguments presence' Philippe Waroquiers
2019-07-25 18:12   ` Tom Tromey
2019-07-29 20:12     ` Philippe Waroquiers
2019-06-19 16:06 ` [RFAv3 2/3] Test " Philippe Waroquiers
2019-07-25 18:58   ` Tom Tromey
2019-06-19 16:06 ` [RFAv3 3/3] Document " Philippe Waroquiers
2019-06-19 16:58   ` Eli Zaretskii
2019-07-05 20:06 ` PING Re: [RFAv3 0/3] Implement 'set print frame-info|frame-arguments Philippe Waroquiers

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).