binutils-gdb/gdb/testsuite/gdb.python
Pedro Alves 5166082f5f PR gdb/13860: make -interpreter-exec console "list" behave more like "list".
I noticed that "list" behaves differently in CLI vs MI.  Particularly:

  $ ./gdb -nx -q ./testsuite/gdb.mi/mi-cli
  Reading symbols from /home/pedro/gdb/mygit/build/gdb/testsuite/gdb.mi/mi-cli...done.
  (gdb) start
  Temporary breakpoint 1 at 0x40054d: file ../../../src/gdb/testsuite/gdb.mi/basics.c, line 62.
  Starting program: /home/pedro/gdb/mygit/build/gdb/testsuite/gdb.mi/mi-cli

  Temporary breakpoint 1, main () at ../../../src/gdb/testsuite/gdb.mi/basics.c:62
  62        callee1 (2, "A string argument.", 3.5);
  (gdb) list
  57      {
  58      }
  59
  60      main ()
  61      {
  62        callee1 (2, "A string argument.", 3.5);
  63        callee1 (2, "A string argument.", 3.5);
  64
  65        do_nothing (); /* Hello, World! */
  66
  (gdb)

Note the list started at line 57.  IOW, the program stopped at line
62, and GDB centered the list on that.

compare with:

  $ ./gdb -nx -q ./testsuite/gdb.mi/mi-cli -i=mi
  =thread-group-added,id="i1"
  ~"Reading symbols from /home/pedro/gdb/mygit/build/gdb/testsuite/gdb.mi/mi-cli..."
  ~"done.\n"
  (gdb)
  start
  &"start\n"
...
 ~"\nTemporary breakpoint "
  ~"1, main () at ../../../src/gdb/testsuite/gdb.mi/basics.c:62\n"
  ~"62\t  callee1 (2, \"A string argument.\", 3.5);\n"
  *stopped,reason="breakpoint-hit",disp="del",bkptno="1",frame={addr="0x000000000040054d",func="main",args=[],file="../../../src/gdb/testsuite/gdb.mi/basics.c",fullname="/home/pedro/gdb/mygit/src/gdb/testsuite/gdb.mi/basics.c",line="62"},thread-id="1",stopped-threads="all",core="0"
  =breakpoint-deleted,id="1"
  (gdb)
  -interpreter-exec console list
  ~"62\t  callee1 (2, \"A string argument.\", 3.5);\n"
  ~"63\t  callee1 (2, \"A string argument.\", 3.5);\n"
  ~"64\t\n"
  ~"65\t  do_nothing (); /* Hello, World! */\n"
  ~"66\t\n"
  ~"67\t  callme (1);\n"
  ~"68\t  callme (2);\n"
  ~"69\t\n"
  ~"70\t  return 0;\n"
  ~"71\t}\n"
  ^done
  (gdb)

Here the list starts at line 62, where the program was stopped.

This happens because print_stack_frame, called from both normal_stop
and mi_on_normal_stop, is the function responsible for setting the
current sal from the selected frame, overrides the PRINT_WHAT
argument, and only after that does it decide whether to center the
current sal line or not, based on the overridden value, and it will
always decide false.

(The print_stack_frame call in mi_on_normal_stop is a little different
from the call in normal_stop, in that it is an unconditional
SRC_AND_LOC call.  A future patch will make those uniform.)

A previous version of this patch made MI uniform with CLI here, by
making print_stack_frame also center when MI is active.  That changed
the output of a "list" command in mi-cli.exp, to expect line 57
instead of 62, as per the example above.

However, looking deeper, that list in question is the first "list"
after the program stops, and right after the stop, before the "list",
the test did "set listsize 1".  Let's try the same thing with the CLI:

 (gdb) start
 62        callee1 (2, "A string argument.", 3.5);
 (gdb) set listsize 1
 (gdb) list
 57      {

Huh, that's unexpected.  Why the 57?  It's because print_stack_frame,
called in reaction to the breakpoint stop, expecting the next "list"
to show 10 lines (the listsize at the time) around line 62, sets the
lines listed range to 57-67 (62 +/- 5).  If the user changes the
listsize before "list", why would we still show that range?  Looks
bogus to me.

So the fix for this whole issue should be delay trying to center the
listing to until actually listing, so that the correct listsize can be
taken into account.  This makes MI and CLI uniform too, as it deletes
the center code from print_stack_frame.

A series of tests are added to list.exp to cover this.  mi-cli.exp was
after all correct all along, but it now gains an additional test that
lists lines with listsize 10, to ensure the centering is consistent
with CLI's.

One related Python test changed related output -- it's a test that
prints the line number after stopping for a breakpoint, similar to the
new list.exp tests.  Previously we'd print the stop line minus 5 (due
to the premature centering), now we print the stop line.  I think
that's a good change.

Tested on x86_64 Fedora 20.

gdb/
2014-05-21  Pedro Alves  <palves@redhat.com>

	* cli/cli-cmds.c (list_command): Handle the first "list" after the
	current source line having changed.
	* frame.h (set_current_sal_from_frame): Remove 'center' parameter.
	* infrun.c (normal_stop): Adjust call to
	set_current_sal_from_frame.
	* source.c (clear_lines_listed_range): New function.
	(set_current_source_symtab_and_line, identify_source_line): Clear
	the lines listed range.
	(line_info): Handle the first "info line" after the current source
	line having changed.
	* stack.c (print_stack_frame): Remove center handling.
	(set_current_sal_from_frame): Remove 'center' parameter.  Don't
	center sal.line.

gdb/testsuite/
2014-05-21  Pedro Alves  <palves@redhat.com>

	* gdb.base/list.exp (build_pattern, test_list): New procedures.
	Use them to test variations of "list" after reaching a breakpoint.
	* gdb.mi/mi-cli.exp (line_main_callme_2): New global.
	Test "list" with listsize 10 after reaching a breakpoint.
	* gdb.python/python.exp (decode_line current location line
	number): Adjust expected line number.
2014-05-21 23:15:27 +01:00
..
lib-types.cc Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
lib-types.exp Fix and XFAIL test due to GCC PR55641, passes with clang 2014-04-24 13:22:10 -07:00
Makefile.in Add a new method 'disassemble' to gdb.Architecture class. 2013-02-21 01:46:57 +00:00
py-arch.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-arch.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-block.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-block.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-breakpoint.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-breakpoint.exp Extension Language API 2014-02-05 19:27:58 -08:00
py-cmd.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-cmd.exp Skip tests on completion and readline when readline lib isn't used 2014-03-26 21:11:08 +08:00
py-error.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-error.py Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-events-shlib.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-events.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-events.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-events.py Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-evsignal.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-evthreads.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-evthreads.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-explore-cc.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-explore.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-explore.cc Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-explore.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-finish-breakpoint.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-finish-breakpoint.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-finish-breakpoint.py Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-finish-breakpoint2.cc Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-finish-breakpoint2.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-finish-breakpoint2.py Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-frame-args.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-frame-args.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-frame-args.py Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-frame-inline.c Fix PR backtrace/15558 2014-04-18 10:34:09 +01:00
py-frame-inline.exp Fix PR backtrace/15558 2014-04-18 10:34:09 +01:00
py-frame.c
py-frame.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-framefilter-gdb.py.in Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-framefilter-mi.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-framefilter-mi.exp fix crash in frame filters 2014-01-23 08:03:50 -07:00
py-framefilter.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-framefilter.exp Fix typo in test name 2014-02-08 10:44:11 +01:00
py-framefilter.py fix erroneous error-handling in frame filter code 2014-01-23 08:03:51 -07:00
py-function.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-inferior.c gdb/ 2012-07-26 19:09:35 +00:00
py-inferior.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-infthread.c
py-infthread.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-linetable.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-linetable.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-linetable.S Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-mi.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-objfile-script-gdb.py.in Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-objfile-script.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-objfile-script.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-objfile.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-objfile.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-parameter.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-pp-integral.c [python] Add gdb.Type.name attribute. 2014-01-07 07:11:17 +04:00
py-pp-integral.exp Remove path from gdb.python/py-pp-integral.exp "source" test. 2014-01-10 07:57:09 +04:00
py-pp-integral.py [python] Add gdb.Type.name attribute. 2014-01-07 07:11:17 +04:00
py-pp-maint.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-pp-maint.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-pp-maint.py Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-pp-re-notag.c [Python] Make regexp collection printers work with typedefs as well. 2014-02-26 11:04:12 -08:00
py-pp-re-notag.exp [Python] Make regexp collection printers work with typedefs as well. 2014-02-26 11:04:12 -08:00
py-pp-re-notag.py [Python] Make regexp collection printers work with typedefs as well. 2014-02-26 11:04:12 -08:00
py-prettyprint.c Ensure unreferenced static symbols aren't omitted by clang (either marking them __attribute__((used)) or making them non-static) 2014-04-24 22:33:46 -07:00
py-prettyprint.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-prettyprint.py Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-progspace.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-progspace.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-prompt.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-prompt.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-section-script.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-section-script.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-section-script.py Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-shared-sl.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-shared.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-shared.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-strfns.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-strfns.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-symbol.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-symbol.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-symtab.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-sync-interp.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-sync-interp.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-template.cc Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-template.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-type.c Use bitpos and type to lookup a gdb.Field object when its name is 'None'. 2014-01-13 17:35:56 -08:00
py-type.exp Use bitpos and type to lookup a gdb.Field object when its name is 'None'. 2014-01-13 17:35:56 -08:00
py-typeprint.cc Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-typeprint.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-typeprint.py Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
py-value-cc.cc Call overloaded operators to perform operations on gdb.Value objects. 2014-02-19 15:47:45 -08:00
py-value-cc.exp Call overloaded operators to perform operations on gdb.Value objects. 2014-02-19 15:47:45 -08:00
py-value.c [python] Fix gdb.Value.dynamic_type for reference values. 2014-04-07 14:18:44 -07:00
py-value.exp [python] Fix gdb.Value.dynamic_type for reference values. 2014-04-07 14:18:44 -07:00
python-1.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
python.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
python.exp PR gdb/13860: make -interpreter-exec console "list" behave more like "list". 2014-05-21 23:15:27 +01:00
source1 Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
source2.py Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00