2015-01-01 09:32:14 +00:00
# Copyright 2002-2015 Free Software Foundation, Inc.
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
2007-08-23 18:14:19 +00:00
# the Free Software Foundation; either version 3 of the License, or
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
# (at your option) any later version.
2007-08-23 18:14:19 +00:00
#
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
2007-08-23 18:14:19 +00:00
#
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
# You should have received a copy of the GNU General Public License
2007-08-23 18:14:19 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
# This file tests that GDB's console can be accessed via the MI.
# Specifically, we are testing the "interpreter-exec" command and that
# the commands that are executed via this command are properly executed.
# Console commands executed via MI should use MI output wrappers, MI event
# handlers, etc.
load_lib mi-support.exp
2012-10-14 12:24:08 +00:00
set MIFLAGS "-i=mi"
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
gdb_exit
if [mi_gdb_start] {
continue
}
2012-07-10 15:32:52 +00:00
standard_testfile basics.c
gdb/testsuite:
* gdb.mi/gdb2549.exp: Remove -DFAKEARGV from compilation flags.
* gdb.mi/mi-async.exp, gdb.mi/mi-basics.exp: Likewise.
* gdb.mi/mi-break.exp, gdb.mi/mi-cli.exp: Likewise.
* gdb.mi/mi-console.exp, gdb.mi/mi-disassemble.exp: Likewise.
* gdb.mi/mi-eval.exp, gdb.mi/mi-file.exp: Likewise.
* gdb.mi/mi-read-memory.exp, gdb.mi/mi-regs.exp: Likewise.
* gdb.mi/mi-return.exp, gdb.mi/mi-reverse.exp: Likewise.
* gdb.mi/mi-simplerun.exp, gdb.mi/mi-stack.exp: Likewise.
* gdb.mi/mi-stepi.exp, gdb.mi/mi-syn-frame.exp: Likewise.
* gdb.mi/mi-until.exp, gdb.mi/mi-var-block.exp: Likewise.
* gdb.mi/mi-var-child.exp, gdb.mi/mi-var-cmd.exp: Likewise.
* gdb.mi/mi-var-display.exp: Likewise.
* gdb.mi/mi-var-invalidate.exp: Likewise.
* gdb.mi/mi-watch.exp, gdb.mi/mi2-basics.exp: Likewise.
* gdb.mi/mi2-break.exp, gdb.mi/mi2-cli.exp: Likewise.
* gdb.mi/mi2-console.exp: Likewise.
* gdb.mi/mi2-disassemble.exp: Likewise.
* gdb.mi/mi2-eval.exp, gdb.mi/mi2-file.exp: Likewise.
* gdb.mi/mi2-read-memory.exp: Likewise.
* gdb.mi/mi2-regs.exp, gdb.mi/mi2-return.exp: Likewise.
* gdb.mi/mi2-simplerun.exp: Likewise.
* gdb.mi/mi2-stack.exp, gdb.mi/mi2-stepi.exp: Likewise.
* gdb.mi/mi2-syn-frame.exp: Likewise.
* gdb.mi/mi2-until.exp, gdb.mi/mi2-var-block.exp: Likewise.
* gdb.mi/mi2-var-child.exp, gdb.mi/mi2-var-cmd.exp: Likewise.
* gdb.mi/mi2-var-display.exp, gdb.mi/mi2-watch.exp: Likewise.
2012-07-09 18:28:17 +00:00
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
2012-10-14 12:24:08 +00:00
untested mi-cli.exp
2006-08-10 05:27:22 +00:00
return -1
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
}
mi_gdb_test "-interpreter-exec" \
2011-01-12 21:09:39 +00:00
{\^error,msg="-interpreter-exec: Usage: -interpreter-exec interp command"} \
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
"-interpreter-exec with no arguments"
mi_gdb_test "-interpreter-exec console" \
2011-01-12 21:09:39 +00:00
{\^error,msg="-interpreter-exec: Usage: -interpreter-exec interp command"} \
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
"-interpreter-exec with one argument"
mi_gdb_test "-interpreter-exec bogus command" \
2011-01-12 21:09:39 +00:00
{\^error,msg="-interpreter-exec: could not find interpreter \\\"bogus\\\""} \
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
"-interpreter-exec with bogus interpreter"
set msg {Undefined command: \\\"bogus\\\"\. Try \\\"help\\\"\.}
mi_gdb_test "-interpreter-exec console bogus" \
"&\\\"$msg\\\\n\\\".*\\^error,msg=\\\"$msg\\\".*" \
"-interpreter-exec console bogus"
# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "-interpreter-exec console \"file $binfile\"" \
# {(=.*)+\^done} \
# "-interpreter-exec console \"file \$binfile\""
mi_gdb_test "-interpreter-exec console \"file $binfile\"" \
2012-10-14 12:24:08 +00:00
{~"Reading symbols from .*mi-cli...".*\^done} \
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
"-interpreter-exec console \"file \$binfile\""
mi_run_to_main
2010-01-19 08:00:39 +00:00
set line_main_head [gdb_get_line_number "main ("]
set line_main_body [expr $line_main_head + 2]
set line_main_hello [gdb_get_line_number "Hello, World!"]
set line_main_return [expr $line_main_hello + 2]
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 22:15:27 +00:00
set line_main_callme_2 [expr $line_main_return + 1]
2010-01-19 08:00:39 +00:00
set line_callee4_head [gdb_get_line_number "callee4 ("]
set line_callee4_body [expr $line_callee4_head + 2]
2012-09-21 08:39:08 +00:00
set line_callee4_next [expr $line_callee4_body + 1]
PR gdb/13860: don't lose '-interpreter-exec console EXECUTION_COMMAND''s output in async mode.
The other part of PR gdb/13860 is about console execution commands in
MI getting their output half lost. E.g., take the finish command,
executed on a frontend's GDB console:
sync:
finish
&"finish\n"
~"Run till exit from #0 usleep (useconds=10) at ../sysdeps/unix/sysv/linux/usleep.c:27\n"
^running
*running,thread-id="1"
(gdb)
~"0x00000000004004d7 in foo () at stepinf.c:6\n"
~"6\t usleep (10);\n"
~"Value returned is $1 = 0\n"
*stopped,reason="function-finished",frame={addr="0x00000000004004d7",func="foo",args=[],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="6"},thread-id="1",stopped-threads="all",core="1"
async:
finish
&"finish\n"
~"Run till exit from #0 usleep (useconds=10) at ../sysdeps/unix/sysv/linux/usleep.c:27\n"
^running
*running,thread-id="1"
(gdb)
*stopped,reason="function-finished",frame={addr="0x00000000004004d7",func="foo",args=[],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="6"},gdb-result-var="$1",return-value="0",thread-id="1",stopped-threads="all",core="0"
Note how all the "Value returned" etc. output is missing in async mode.
The same happens with e.g., catchpoints:
=breakpoint-modified,bkpt={number="1",type="catchpoint",disp="keep",enabled="y",what="22016",times="1"}
~"\nCatchpoint "
~"1 (forked process 22016), 0x0000003791cbd8a6 in __libc_fork () at ../nptl/sysdeps/unix/sysv/linux/fork.c:131\n"
~"131\t pid = ARCH_FORK ();\n"
*stopped,reason="fork",disp="keep",bkptno="1",newpid="22016",frame={addr="0x0000003791cbd8a6",func="__libc_fork",args=[],file="../nptl/sysdeps/unix/sysv/linux/fork.c",fullname="/usr/src/debug/glibc-2.14-394-g8f3b1ff/nptl/sysdeps/unix/sysv/linux/fork.c",line="131"},thread-id="1",stopped-threads="all",core="0"
where all those ~ lines are missing in async mode, or just the "step"
current line indication:
s
&"s\n"
^running
*running,thread-id="all"
(gdb)
~"13\t foo ();\n"
*stopped,frame={addr="0x00000000004004ef",func="main",args=[{name="argc",value="1"},{name="argv",value="0x7fffffffdd78"}],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="13"},thread-id="1",stopped-threads="all",core="3"
(gdb)
Or in the case of the PRs example, the "Stopped due to shared library
event" note:
start
&"start\n"
~"Temporary breakpoint 1 at 0x400608: file ../../../src/gdb/testsuite/gdb.mi/solib-main.c, line 21.\n"
=breakpoint-created,bkpt={number="1",type="breakpoint",disp="del",enabled="y",addr="0x0000000000400608",func="main",file="../../../src/gdb/testsuite/gdb.mi/solib-main.c",fullname="/home/pedro/gdb/mygit/src/gdb/testsuite/gdb.mi/solib-main.c",line="21",times="0",original-location="main"}
~"Starting program: /home/pedro/gdb/mygit/build/gdb/testsuite/gdb.mi/solib-main \n"
=thread-group-started,id="i1",pid="21990"
=thread-created,id="1",group-id="i1"
^running
*running,thread-id="all"
(gdb)
=library-loaded,id="/lib64/ld-linux-x86-64.so.2",target-name="/lib64/ld-linux-x86-64.so.2",host-name="/lib64/ld-linux-x86-64.so.2",symbols-loaded="0",thread-group="i1"
~"Stopped due to shared library event (no libraries added or removed)\n"
*stopped,reason="solib-event",thread-id="1",stopped-threads="all",core="3"
(gdb)
IMO, if you're typing execution commands in a frontend's console, you
expect to see their output. Indeed it's what you get in sync mode. I
think async mode should do the same. Deciding what to mirror to the
console wrt to breakpoints and random stops gets messy real fast.
E.g., say "s" trips on a breakpoint. We'd clearly want to mirror the
event to the console in this case. But what about more complicated
cases like "s&; thread n; s&", and one of those steps spawning a new
thread, and that thread hitting a breakpoint? It's impossible in
general to track whether the thread had any relation to the commands
that had been executed. So I think we should just simplify and always
mirror breakpoints and random events to the console.
Notes:
- mi->out is the same as gdb_stdout when MI is the current
interpreter. I think that referring to that directly is cleaner.
An earlier revision of this patch made the changes that are now
done in mi_on_normal_stop directly in infrun.c:normal_stop, and so
not having an obvious place to put the new uiout by then, and not
wanting to abuse CLI's uiout, I made a temporary uiout when
necessary.
- Hopefuly the rest of the patch is more or less obvious given the
comments added.
Tested on x86_64 Fedora 20, no regressions.
2014-05-21 Pedro Alves <palves@redhat.com>
PR gdb/13860
* gdbthread.h (struct thread_control_state): New field
`command_interp'.
* infrun.c (follow_fork): Copy the new thread control field to the
child fork thread.
(clear_proceed_status_thread): Clear the new thread control field.
(proceed): Set the new thread control field.
* interps.h (command_interp): Declare.
* interps.c (command_interpreter): New global.
(command_interp): New function.
(interp_exec): Set `command_interpreter' while here.
* cli-out.c (cli_uiout_dtor): New function.
(cli_ui_out_impl): Install it.
* mi/mi-interp.c: Include cli-out.h.
(mi_cmd_interpreter_exec): Add comment.
(restore_current_uiout_cleanup): New function.
(ui_out_free_cleanup): New function.
(mi_on_normal_stop): If finishing an execution command started by
a CLI command, or any kind of breakpoint-like event triggered,
print the stop event to the output (CLI) stream.
* mi/mi-out.c (mi_ui_out_impl): Install NULL `dtor' handler.
2014-05-21 Pedro Alves <palves@redhat.com>
PR gdb/13860
* gdb.mi/mi-cli.exp (line_callee4_next_step): New global.
(top level): Test that output related to execution commands is
sent to the console with CLI commands, but not with MI commands.
Test that breakpoint events are always mirrored to the console.
Also expect the new source line to be output after a "next" in
async mode too. Make it a pass/fail test.
* gdb.mi/mi-solib.exp: Test that the CLI solib event note is
output.
* lib/mi-support.exp (mi_gdb_expect_cli_output): New procedure.
2014-03-11 20:31:36 +00:00
set line_callee4_next_step [expr $line_callee4_next + 3]
2004-08-15 10:15:58 +00:00
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
mi_gdb_test "-interpreter-exec console \"set args foobar\"" \
2012-08-09 12:53:46 +00:00
".*=cmd-param-changed,param=\"args\",value=\"foobar\".*\\^done" \
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
"-interpreter-exec console \"set args foobar\""
mi_gdb_test "-interpreter-exec console \"show args\"" \
{\~"Argument list to give program being debugged when it is started is \\\"foobar\\\"\.\\n".*\^done} \
"-interpreter-exec console \"show args\""
mi_gdb_test "-interpreter-exec console \"break callee4\"" \
2012-09-25 00:55:15 +00:00
{(&.*)*.*~"Breakpoint 2 at.*\\n".*=breakpoint-created,bkpt=\{number="2",type="breakpoint".*\}.*\n\^done} \
"-interpreter-exec console \"break callee4\""
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
mi_gdb_test "-interpreter-exec console \"info break\"" \
{\~"Num[ \t]*Type[ \t]*Disp[ \t]*Enb[ \t]*Address[ \t]*What\\n".*~"2[ \t]*breakpoint[ \t]*keep[ \t]*y[ \t]*0x[0-9A-Fa-f]+[ \t]*in callee4 at .*basics.c:[0-9]+\\n".*\^done} \
"-interpreter-exec console \"info break\""
mi_gdb_test "-interpreter-exec console \"set listsize 1\"" \
2012-08-09 12:53:46 +00:00
".*=cmd-param-changed,param=\"listsize\",value=\"1\".*\\^done" \
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
"-interpreter-exec console \"set listsize 1\""
2004-08-15 10:15:58 +00:00
# {.*\~"32[ \t(\\t)]*callee1.*\\n".*\^done }
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
mi_gdb_test "-interpreter-exec console \"list\"" \
2004-08-15 10:15:58 +00:00
".*\~\"$line_main_body\[\\\\t \]*callee1.*;\\\\n\".*\\^done" \
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
"-interpreter-exec console \"list\""
2010-01-19 08:00:39 +00:00
mi_execute_to "exec-continue" "breakpoint-hit" "callee4" "" ".*basics.c" $line_callee4_body \
2008-04-15 14:33:55 +00:00
{ "" "disp=\"keep\"" } \
2008-04-05 17:12:46 +00:00
"continue to callee4"
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
mi_gdb_test "100-interpreter-exec console \"delete 2\"" \
2012-09-25 00:55:15 +00:00
{.*=breakpoint-deleted,id=\"2\".*\^done} \
"-interpreter-exec console \"delete 2\""
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "200-interpreter-exec console \"up\"" \
# {.*=selected-frame-level-changed,level="1".*\^done} \
# "-interpreter-exec console \"up\""
mi_gdb_test "200-interpreter-exec console \"up\"" \
2005-09-27 Bob Rossi <bob@brasko.net>
* gdb.mi/mi-disassemble.exp, gdb.mi/mi2-disassemble.exp: Remove .*
from test. Escape the | in mi_gdb_test call.
* gdb.mi/mi-basics.exp, gdb.mi/mi-cli.exp, gdb.mi/mi-disassemble.exp,
gdb.mi/mi-pthreads.exp, gdb.mi/mi-stack.exp, gdb.mi/mi2-basics.exp,
gdb.mi/mi2-cli.exp, gdb.mi/mi2-disassemble.exp,
gdb.mi/mi2-pthreads.exp, gdb.mi/mi2-stack.exp: Add extra details to
expected regex's in mi_gdb_test calls.
* lib/mi-support.exp: Remove arbitrary .* from tests.
(mi_gdb_test): Add string_regex variable. Add anchor to main -re.
Fully anchor GDB/MI expected results in mi_gdb_test.
* lib/gdb.exp (string_to_regexp): Escape the ] character.
* gdb.base/sizeof.exp: Remove escape character. Correct test.
2005-09-27 22:39:04 +00:00
{~"#.*".*200\^done} \
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
"-interpreter-exec console \"up\""
# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "300-interpreter-exec console \"down\"" \
# {.*=selected-frame-level-changed,level="0".*\^done} \
# "-interpreter-exec console \"down\""
mi_gdb_test "300-interpreter-exec console \"down\"" \
2005-09-27 Bob Rossi <bob@brasko.net>
* gdb.mi/mi-disassemble.exp, gdb.mi/mi2-disassemble.exp: Remove .*
from test. Escape the | in mi_gdb_test call.
* gdb.mi/mi-basics.exp, gdb.mi/mi-cli.exp, gdb.mi/mi-disassemble.exp,
gdb.mi/mi-pthreads.exp, gdb.mi/mi-stack.exp, gdb.mi/mi2-basics.exp,
gdb.mi/mi2-cli.exp, gdb.mi/mi2-disassemble.exp,
gdb.mi/mi2-pthreads.exp, gdb.mi/mi2-stack.exp: Add extra details to
expected regex's in mi_gdb_test calls.
* lib/mi-support.exp: Remove arbitrary .* from tests.
(mi_gdb_test): Add string_regex variable. Add anchor to main -re.
Fully anchor GDB/MI expected results in mi_gdb_test.
* lib/gdb.exp (string_to_regexp): Escape the ] character.
* gdb.base/sizeof.exp: Remove escape character. Correct test.
2005-09-27 22:39:04 +00:00
{~"#.*".*300\^done} \
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
"-interpreter-exec console \"down\""
# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "-interpreter-exec console \"frame 2\"" \
# {.*=selected-frame-level-changed,level="2".*\^done} \
# "-interpreter-exec console \"frame 2\""
mi_gdb_test "400-interpreter-exec console \"frame 2\"" \
2005-09-27 Bob Rossi <bob@brasko.net>
* gdb.mi/mi-disassemble.exp, gdb.mi/mi2-disassemble.exp: Remove .*
from test. Escape the | in mi_gdb_test call.
* gdb.mi/mi-basics.exp, gdb.mi/mi-cli.exp, gdb.mi/mi-disassemble.exp,
gdb.mi/mi-pthreads.exp, gdb.mi/mi-stack.exp, gdb.mi/mi2-basics.exp,
gdb.mi/mi2-cli.exp, gdb.mi/mi2-disassemble.exp,
gdb.mi/mi2-pthreads.exp, gdb.mi/mi2-stack.exp: Add extra details to
expected regex's in mi_gdb_test calls.
* lib/mi-support.exp: Remove arbitrary .* from tests.
(mi_gdb_test): Add string_regex variable. Add anchor to main -re.
Fully anchor GDB/MI expected results in mi_gdb_test.
* lib/gdb.exp (string_to_regexp): Escape the ] character.
* gdb.base/sizeof.exp: Remove escape character. Correct test.
2005-09-27 22:39:04 +00:00
{~"#.*".*400\^done} \
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
"-interpreter-exec console \"frame 2\""
# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "-stack-select-frame 0" \
# {.*=selected-frame-level-changed,level="0".*\^done} \
# "-stack-select-frame 0"
mi_gdb_test "500-stack-select-frame 0" \
{500\^done} \
"-stack-select-frame 0"
PR gdb/13860 - Make MI sync vs async output (closer to) the same.
Ignoring expected and desired differences like whether the prompt is
output after *stoppped records, GDB MI output is still different in
sync and async modes.
In sync mode, when a CLI execution command is entered, the "reason"
field is missing in the *stopped async record. And in async mode, for
some events, like program exits, the corresponding CLI output is
missing in the CLI channel.
Vis, diff between sync vs async modes:
run
^running
*running,thread-id="1"
(gdb)
...
- ~"[Inferior 1 (process 15882) exited normally]\n"
=thread-exited,id="1",group-id="i1"
=thread-group-exited,id="i1",exit-code="0"
- *stopped
+ *stopped,reason="exited-normally"
si
...
(gdb)
~"0x000000000045e033\t29\t memset (&args, 0, sizeof args);\n"
- *stopped,frame=...,thread-id="1",stopped-threads="all",core="0"
+ *stopped,reason="end-stepping-range",frame=...,thread-id="1",stopped-threads="all",core="0"
(gdb)
In addition, in both cases, when a MI execution command is entered,
and a breakpoint triggers, the event is sent to the console too. But
some events like program exits have the CLI output missing in the CLI
channel:
-exec-run
^running
*running,thread-id="1"
(gdb)
...
=thread-exited,id="1",group-id="i1"
=thread-group-exited,id="i1",exit-code="0"
- *stopped
+ *stopped,reason="exited-normally"
We'll want to make background commands always possible by default.
IOW, make target-async be the default. But, in order to do that,
we'll need to emulate MI sync on top of an async target. That means
we'll have yet another combination to care for in the testsuite.
Rather than making the testsuite cope with all these differences, I
thought it better to just fix GDB to always have the complete output,
no matter whether it's in sync or async mode.
This is all related to interpreter-exec, and the corresponding uiout
switching. (Typing a CLI command directly in MI is shorthand for
running it through -interpreter-exec console.)
In sync mode, when a CLI command is active, normal_stop is called when
the current interpreter and uiout are CLI's. So print_XXX_reason
prints the stop reason to CLI uiout (only), and we don't show it in
MI.
In async mode the stop event is processed when we're back in the MI
interpreter, so the stop reason is printed directly to the MI uiout.
Fix this by making run control event printing roughly independent of
whatever is the current interpreter or uiout. That is, move these
prints to interpreter observers, that know whether to print or be
quiet, and if printing, which uiout to print to. In the case of the
console/tui interpreters, only print if the top interpreter. For MI,
always print.
Breakpoint hits / normal stops are already handled similarly -- MI has
a normal_stop observer that prints the event to both MI and the CLI,
though that could be cleaned up further in the direction of this
patch.
This also makes all of:
(gdb) foo
and
(gdb) interpreter-exec MI "-exec-foo"
and
(gdb)
-exec-foo
and
(gdb)
-interpreter-exec console "foo"
print as expected.
Tested on x86_64 Fedora 20, sync and async modes.
gdb/
2014-05-29 Pedro Alves <palves@redhat.com>
PR gdb/13860
* cli/cli-interp.c: Include infrun.h and observer.h.
(cli_uiout, cli_interp): New globals.
(cli_on_signal_received, cli_on_end_stepping_range)
(cli_on_signal_exited, cli_on_exited, cli_on_no_history): New
functions.
(cli_interpreter_init): Install them as 'end_stepping_range',
'signal_received' 'signal_exited', 'exited' and 'no_history'
observers.
(_initialize_cli_interp): Remove cli_interp local.
* infrun.c (handle_inferior_event): Call the several stop reason
observers instead of printing the stop reason directly.
(end_stepping_range): New function.
(print_end_stepping_range_reason, print_signal_exited_reason)
(print_exited_reason, print_signal_received_reason)
(print_no_history_reason): Make static, and add an uiout
parameter. Print to that instead of to CURRENT_UIOUT.
* infrun.h (print_end_stepping_range_reason)
(print_signal_exited_reason, print_exited_reason)
(print_signal_received_reason print_no_history_reason): New
declarations.
* mi/mi-common.h (struct mi_interp): Rename 'uiout' field to
'mi_uiout'.
<cli_uiout>: New field.
* mi/mi-interp.c (mi_interpreter_init): Adjust. Create the new
uiout for CLI output. Install 'signal_received',
'end_stepping_range', 'signal_exited', 'exited' and 'no_history'
observers.
(find_mi_interpreter, mi_interp_data, mi_on_signal_received)
(mi_on_end_stepping_range, mi_on_signal_exited, mi_on_exited)
(mi_on_no_history): New functions.
(ui_out_free_cleanup): Delete function.
(mi_on_normal_stop): Don't allocate a new uiout for CLI output,
instead use the one already stored in the MI interpreter data.
(mi_ui_out): Adjust.
* tui/tui-interp.c: Include infrun.h and observer.h.
(tui_interp): New global.
(tui_on_signal_received, tui_on_end_stepping_range)
(tui_on_signal_exited, tui_on_exited)
(tui_on_no_history): New functions.
(tui_init): Install them as 'end_stepping_range',
'signal_received' 'signal_exited', 'exited' and 'no_history'
observers.
(_initialize_tui_interp): Delete tui_interp local.
gdb/doc/
2014-05-29 Pedro Alves <palves@redhat.com>
PR gdb/13860
* observer.texi (signal_received, end_stepping_range)
(signal_exited, exited, no_history): New observer subjects.
gdb/testsuite/
2014-05-29 Pedro Alves <palves@redhat.com>
PR gdb/13860
* gdb.mi/mi-cli.exp: Always expect "end-stepping-range" stop
reason, even in sync mode.
2014-05-29 12:09:45 +00:00
mi_execute_to "interpreter-exec console step" "end-stepping-range" "callee4" "" ".*basics.c" $line_callee4_next \
2012-09-21 08:39:08 +00:00
"" "check *stopped from CLI command"
PR gdb/13860: don't lose '-interpreter-exec console EXECUTION_COMMAND''s output in async mode.
The other part of PR gdb/13860 is about console execution commands in
MI getting their output half lost. E.g., take the finish command,
executed on a frontend's GDB console:
sync:
finish
&"finish\n"
~"Run till exit from #0 usleep (useconds=10) at ../sysdeps/unix/sysv/linux/usleep.c:27\n"
^running
*running,thread-id="1"
(gdb)
~"0x00000000004004d7 in foo () at stepinf.c:6\n"
~"6\t usleep (10);\n"
~"Value returned is $1 = 0\n"
*stopped,reason="function-finished",frame={addr="0x00000000004004d7",func="foo",args=[],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="6"},thread-id="1",stopped-threads="all",core="1"
async:
finish
&"finish\n"
~"Run till exit from #0 usleep (useconds=10) at ../sysdeps/unix/sysv/linux/usleep.c:27\n"
^running
*running,thread-id="1"
(gdb)
*stopped,reason="function-finished",frame={addr="0x00000000004004d7",func="foo",args=[],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="6"},gdb-result-var="$1",return-value="0",thread-id="1",stopped-threads="all",core="0"
Note how all the "Value returned" etc. output is missing in async mode.
The same happens with e.g., catchpoints:
=breakpoint-modified,bkpt={number="1",type="catchpoint",disp="keep",enabled="y",what="22016",times="1"}
~"\nCatchpoint "
~"1 (forked process 22016), 0x0000003791cbd8a6 in __libc_fork () at ../nptl/sysdeps/unix/sysv/linux/fork.c:131\n"
~"131\t pid = ARCH_FORK ();\n"
*stopped,reason="fork",disp="keep",bkptno="1",newpid="22016",frame={addr="0x0000003791cbd8a6",func="__libc_fork",args=[],file="../nptl/sysdeps/unix/sysv/linux/fork.c",fullname="/usr/src/debug/glibc-2.14-394-g8f3b1ff/nptl/sysdeps/unix/sysv/linux/fork.c",line="131"},thread-id="1",stopped-threads="all",core="0"
where all those ~ lines are missing in async mode, or just the "step"
current line indication:
s
&"s\n"
^running
*running,thread-id="all"
(gdb)
~"13\t foo ();\n"
*stopped,frame={addr="0x00000000004004ef",func="main",args=[{name="argc",value="1"},{name="argv",value="0x7fffffffdd78"}],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="13"},thread-id="1",stopped-threads="all",core="3"
(gdb)
Or in the case of the PRs example, the "Stopped due to shared library
event" note:
start
&"start\n"
~"Temporary breakpoint 1 at 0x400608: file ../../../src/gdb/testsuite/gdb.mi/solib-main.c, line 21.\n"
=breakpoint-created,bkpt={number="1",type="breakpoint",disp="del",enabled="y",addr="0x0000000000400608",func="main",file="../../../src/gdb/testsuite/gdb.mi/solib-main.c",fullname="/home/pedro/gdb/mygit/src/gdb/testsuite/gdb.mi/solib-main.c",line="21",times="0",original-location="main"}
~"Starting program: /home/pedro/gdb/mygit/build/gdb/testsuite/gdb.mi/solib-main \n"
=thread-group-started,id="i1",pid="21990"
=thread-created,id="1",group-id="i1"
^running
*running,thread-id="all"
(gdb)
=library-loaded,id="/lib64/ld-linux-x86-64.so.2",target-name="/lib64/ld-linux-x86-64.so.2",host-name="/lib64/ld-linux-x86-64.so.2",symbols-loaded="0",thread-group="i1"
~"Stopped due to shared library event (no libraries added or removed)\n"
*stopped,reason="solib-event",thread-id="1",stopped-threads="all",core="3"
(gdb)
IMO, if you're typing execution commands in a frontend's console, you
expect to see their output. Indeed it's what you get in sync mode. I
think async mode should do the same. Deciding what to mirror to the
console wrt to breakpoints and random stops gets messy real fast.
E.g., say "s" trips on a breakpoint. We'd clearly want to mirror the
event to the console in this case. But what about more complicated
cases like "s&; thread n; s&", and one of those steps spawning a new
thread, and that thread hitting a breakpoint? It's impossible in
general to track whether the thread had any relation to the commands
that had been executed. So I think we should just simplify and always
mirror breakpoints and random events to the console.
Notes:
- mi->out is the same as gdb_stdout when MI is the current
interpreter. I think that referring to that directly is cleaner.
An earlier revision of this patch made the changes that are now
done in mi_on_normal_stop directly in infrun.c:normal_stop, and so
not having an obvious place to put the new uiout by then, and not
wanting to abuse CLI's uiout, I made a temporary uiout when
necessary.
- Hopefuly the rest of the patch is more or less obvious given the
comments added.
Tested on x86_64 Fedora 20, no regressions.
2014-05-21 Pedro Alves <palves@redhat.com>
PR gdb/13860
* gdbthread.h (struct thread_control_state): New field
`command_interp'.
* infrun.c (follow_fork): Copy the new thread control field to the
child fork thread.
(clear_proceed_status_thread): Clear the new thread control field.
(proceed): Set the new thread control field.
* interps.h (command_interp): Declare.
* interps.c (command_interpreter): New global.
(command_interp): New function.
(interp_exec): Set `command_interpreter' while here.
* cli-out.c (cli_uiout_dtor): New function.
(cli_ui_out_impl): Install it.
* mi/mi-interp.c: Include cli-out.h.
(mi_cmd_interpreter_exec): Add comment.
(restore_current_uiout_cleanup): New function.
(ui_out_free_cleanup): New function.
(mi_on_normal_stop): If finishing an execution command started by
a CLI command, or any kind of breakpoint-like event triggered,
print the stop event to the output (CLI) stream.
* mi/mi-out.c (mi_ui_out_impl): Install NULL `dtor' handler.
2014-05-21 Pedro Alves <palves@redhat.com>
PR gdb/13860
* gdb.mi/mi-cli.exp (line_callee4_next_step): New global.
(top level): Test that output related to execution commands is
sent to the console with CLI commands, but not with MI commands.
Test that breakpoint events are always mirrored to the console.
Also expect the new source line to be output after a "next" in
async mode too. Make it a pass/fail test.
* gdb.mi/mi-solib.exp: Test that the CLI solib event note is
output.
* lib/mi-support.exp (mi_gdb_expect_cli_output): New procedure.
2014-03-11 20:31:36 +00:00
mi_send_resuming_command "exec-step" "-exec-step to line \$line_callee4_next_step"
# Test that the new current source line is _not_ output, given we
# executed MI's -exec-next, not CLI's 'next' command.
set output [mi_gdb_expect_cli_output "\\*stopped" "collect CLI output for -exec-step"]
set test "-exec-step does not produce CLI step output"
if {[regexp "A + B" "$output"]} {
fail $test
} else {
pass $test
}
mi_expect_stop "end-stepping-range" "callee4" "" ".*basics.c" $line_callee4_next_step \
"" "check *stopped from CLI command 2"
2004-08-15 10:15:58 +00:00
mi_gdb_test "600-break-insert -t basics.c:$line_main_hello" \
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
{600\^done,bkpt=.number="3",type="breakpoint".*\}} \
2012-09-26 06:53:46 +00:00
"-break-insert -t basics.c:\$line_main_hello"
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
PR gdb/13860: don't lose '-interpreter-exec console EXECUTION_COMMAND''s output in async mode.
The other part of PR gdb/13860 is about console execution commands in
MI getting their output half lost. E.g., take the finish command,
executed on a frontend's GDB console:
sync:
finish
&"finish\n"
~"Run till exit from #0 usleep (useconds=10) at ../sysdeps/unix/sysv/linux/usleep.c:27\n"
^running
*running,thread-id="1"
(gdb)
~"0x00000000004004d7 in foo () at stepinf.c:6\n"
~"6\t usleep (10);\n"
~"Value returned is $1 = 0\n"
*stopped,reason="function-finished",frame={addr="0x00000000004004d7",func="foo",args=[],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="6"},thread-id="1",stopped-threads="all",core="1"
async:
finish
&"finish\n"
~"Run till exit from #0 usleep (useconds=10) at ../sysdeps/unix/sysv/linux/usleep.c:27\n"
^running
*running,thread-id="1"
(gdb)
*stopped,reason="function-finished",frame={addr="0x00000000004004d7",func="foo",args=[],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="6"},gdb-result-var="$1",return-value="0",thread-id="1",stopped-threads="all",core="0"
Note how all the "Value returned" etc. output is missing in async mode.
The same happens with e.g., catchpoints:
=breakpoint-modified,bkpt={number="1",type="catchpoint",disp="keep",enabled="y",what="22016",times="1"}
~"\nCatchpoint "
~"1 (forked process 22016), 0x0000003791cbd8a6 in __libc_fork () at ../nptl/sysdeps/unix/sysv/linux/fork.c:131\n"
~"131\t pid = ARCH_FORK ();\n"
*stopped,reason="fork",disp="keep",bkptno="1",newpid="22016",frame={addr="0x0000003791cbd8a6",func="__libc_fork",args=[],file="../nptl/sysdeps/unix/sysv/linux/fork.c",fullname="/usr/src/debug/glibc-2.14-394-g8f3b1ff/nptl/sysdeps/unix/sysv/linux/fork.c",line="131"},thread-id="1",stopped-threads="all",core="0"
where all those ~ lines are missing in async mode, or just the "step"
current line indication:
s
&"s\n"
^running
*running,thread-id="all"
(gdb)
~"13\t foo ();\n"
*stopped,frame={addr="0x00000000004004ef",func="main",args=[{name="argc",value="1"},{name="argv",value="0x7fffffffdd78"}],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="13"},thread-id="1",stopped-threads="all",core="3"
(gdb)
Or in the case of the PRs example, the "Stopped due to shared library
event" note:
start
&"start\n"
~"Temporary breakpoint 1 at 0x400608: file ../../../src/gdb/testsuite/gdb.mi/solib-main.c, line 21.\n"
=breakpoint-created,bkpt={number="1",type="breakpoint",disp="del",enabled="y",addr="0x0000000000400608",func="main",file="../../../src/gdb/testsuite/gdb.mi/solib-main.c",fullname="/home/pedro/gdb/mygit/src/gdb/testsuite/gdb.mi/solib-main.c",line="21",times="0",original-location="main"}
~"Starting program: /home/pedro/gdb/mygit/build/gdb/testsuite/gdb.mi/solib-main \n"
=thread-group-started,id="i1",pid="21990"
=thread-created,id="1",group-id="i1"
^running
*running,thread-id="all"
(gdb)
=library-loaded,id="/lib64/ld-linux-x86-64.so.2",target-name="/lib64/ld-linux-x86-64.so.2",host-name="/lib64/ld-linux-x86-64.so.2",symbols-loaded="0",thread-group="i1"
~"Stopped due to shared library event (no libraries added or removed)\n"
*stopped,reason="solib-event",thread-id="1",stopped-threads="all",core="3"
(gdb)
IMO, if you're typing execution commands in a frontend's console, you
expect to see their output. Indeed it's what you get in sync mode. I
think async mode should do the same. Deciding what to mirror to the
console wrt to breakpoints and random stops gets messy real fast.
E.g., say "s" trips on a breakpoint. We'd clearly want to mirror the
event to the console in this case. But what about more complicated
cases like "s&; thread n; s&", and one of those steps spawning a new
thread, and that thread hitting a breakpoint? It's impossible in
general to track whether the thread had any relation to the commands
that had been executed. So I think we should just simplify and always
mirror breakpoints and random events to the console.
Notes:
- mi->out is the same as gdb_stdout when MI is the current
interpreter. I think that referring to that directly is cleaner.
An earlier revision of this patch made the changes that are now
done in mi_on_normal_stop directly in infrun.c:normal_stop, and so
not having an obvious place to put the new uiout by then, and not
wanting to abuse CLI's uiout, I made a temporary uiout when
necessary.
- Hopefuly the rest of the patch is more or less obvious given the
comments added.
Tested on x86_64 Fedora 20, no regressions.
2014-05-21 Pedro Alves <palves@redhat.com>
PR gdb/13860
* gdbthread.h (struct thread_control_state): New field
`command_interp'.
* infrun.c (follow_fork): Copy the new thread control field to the
child fork thread.
(clear_proceed_status_thread): Clear the new thread control field.
(proceed): Set the new thread control field.
* interps.h (command_interp): Declare.
* interps.c (command_interpreter): New global.
(command_interp): New function.
(interp_exec): Set `command_interpreter' while here.
* cli-out.c (cli_uiout_dtor): New function.
(cli_ui_out_impl): Install it.
* mi/mi-interp.c: Include cli-out.h.
(mi_cmd_interpreter_exec): Add comment.
(restore_current_uiout_cleanup): New function.
(ui_out_free_cleanup): New function.
(mi_on_normal_stop): If finishing an execution command started by
a CLI command, or any kind of breakpoint-like event triggered,
print the stop event to the output (CLI) stream.
* mi/mi-out.c (mi_ui_out_impl): Install NULL `dtor' handler.
2014-05-21 Pedro Alves <palves@redhat.com>
PR gdb/13860
* gdb.mi/mi-cli.exp (line_callee4_next_step): New global.
(top level): Test that output related to execution commands is
sent to the console with CLI commands, but not with MI commands.
Test that breakpoint events are always mirrored to the console.
Also expect the new source line to be output after a "next" in
async mode too. Make it a pass/fail test.
* gdb.mi/mi-solib.exp: Test that the CLI solib event note is
output.
* lib/mi-support.exp (mi_gdb_expect_cli_output): New procedure.
2014-03-11 20:31:36 +00:00
# Test that breakpoint events are always mirrored to the CLI output
# stream (both sync and async modes).
mi_send_resuming_command "exec-continue" "-exec-continue to line \$line_main_hello"
set output [mi_gdb_expect_cli_output "\\*stopped" "collect CLI output for breakpoint hit"]
set test "breakpoint hit produces CLI output"
set pattern "\\\\nTemporary breakpoint 3, main \\(\\) at \[^\n\]+basics.c:$line_main_hello\\\\n\[^\n\]+Hello"
if {[regexp $pattern $output]} {
pass $test
} else {
fail $test
}
# Test the MI output.
mi_expect_stop "breakpoint-hit" "main" "" ".*basics.c" \
$line_main_hello { "" "disp=\"del\"" } "temporary breakpoint output hit in MI"
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
2012-09-21 08:39:08 +00:00
# Test that the token is output even for CLI commands
# Also test that *stopped includes frame information.
mi_gdb_test "34 next" \
".*34\\\^running.*\\*running,thread-id=\"all\"" \
"34 next: run"
PR gdb/13860: don't lose '-interpreter-exec console EXECUTION_COMMAND''s output in async mode.
The other part of PR gdb/13860 is about console execution commands in
MI getting their output half lost. E.g., take the finish command,
executed on a frontend's GDB console:
sync:
finish
&"finish\n"
~"Run till exit from #0 usleep (useconds=10) at ../sysdeps/unix/sysv/linux/usleep.c:27\n"
^running
*running,thread-id="1"
(gdb)
~"0x00000000004004d7 in foo () at stepinf.c:6\n"
~"6\t usleep (10);\n"
~"Value returned is $1 = 0\n"
*stopped,reason="function-finished",frame={addr="0x00000000004004d7",func="foo",args=[],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="6"},thread-id="1",stopped-threads="all",core="1"
async:
finish
&"finish\n"
~"Run till exit from #0 usleep (useconds=10) at ../sysdeps/unix/sysv/linux/usleep.c:27\n"
^running
*running,thread-id="1"
(gdb)
*stopped,reason="function-finished",frame={addr="0x00000000004004d7",func="foo",args=[],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="6"},gdb-result-var="$1",return-value="0",thread-id="1",stopped-threads="all",core="0"
Note how all the "Value returned" etc. output is missing in async mode.
The same happens with e.g., catchpoints:
=breakpoint-modified,bkpt={number="1",type="catchpoint",disp="keep",enabled="y",what="22016",times="1"}
~"\nCatchpoint "
~"1 (forked process 22016), 0x0000003791cbd8a6 in __libc_fork () at ../nptl/sysdeps/unix/sysv/linux/fork.c:131\n"
~"131\t pid = ARCH_FORK ();\n"
*stopped,reason="fork",disp="keep",bkptno="1",newpid="22016",frame={addr="0x0000003791cbd8a6",func="__libc_fork",args=[],file="../nptl/sysdeps/unix/sysv/linux/fork.c",fullname="/usr/src/debug/glibc-2.14-394-g8f3b1ff/nptl/sysdeps/unix/sysv/linux/fork.c",line="131"},thread-id="1",stopped-threads="all",core="0"
where all those ~ lines are missing in async mode, or just the "step"
current line indication:
s
&"s\n"
^running
*running,thread-id="all"
(gdb)
~"13\t foo ();\n"
*stopped,frame={addr="0x00000000004004ef",func="main",args=[{name="argc",value="1"},{name="argv",value="0x7fffffffdd78"}],file="stepinf.c",fullname="/home/pedro/gdb/tests/stepinf.c",line="13"},thread-id="1",stopped-threads="all",core="3"
(gdb)
Or in the case of the PRs example, the "Stopped due to shared library
event" note:
start
&"start\n"
~"Temporary breakpoint 1 at 0x400608: file ../../../src/gdb/testsuite/gdb.mi/solib-main.c, line 21.\n"
=breakpoint-created,bkpt={number="1",type="breakpoint",disp="del",enabled="y",addr="0x0000000000400608",func="main",file="../../../src/gdb/testsuite/gdb.mi/solib-main.c",fullname="/home/pedro/gdb/mygit/src/gdb/testsuite/gdb.mi/solib-main.c",line="21",times="0",original-location="main"}
~"Starting program: /home/pedro/gdb/mygit/build/gdb/testsuite/gdb.mi/solib-main \n"
=thread-group-started,id="i1",pid="21990"
=thread-created,id="1",group-id="i1"
^running
*running,thread-id="all"
(gdb)
=library-loaded,id="/lib64/ld-linux-x86-64.so.2",target-name="/lib64/ld-linux-x86-64.so.2",host-name="/lib64/ld-linux-x86-64.so.2",symbols-loaded="0",thread-group="i1"
~"Stopped due to shared library event (no libraries added or removed)\n"
*stopped,reason="solib-event",thread-id="1",stopped-threads="all",core="3"
(gdb)
IMO, if you're typing execution commands in a frontend's console, you
expect to see their output. Indeed it's what you get in sync mode. I
think async mode should do the same. Deciding what to mirror to the
console wrt to breakpoints and random stops gets messy real fast.
E.g., say "s" trips on a breakpoint. We'd clearly want to mirror the
event to the console in this case. But what about more complicated
cases like "s&; thread n; s&", and one of those steps spawning a new
thread, and that thread hitting a breakpoint? It's impossible in
general to track whether the thread had any relation to the commands
that had been executed. So I think we should just simplify and always
mirror breakpoints and random events to the console.
Notes:
- mi->out is the same as gdb_stdout when MI is the current
interpreter. I think that referring to that directly is cleaner.
An earlier revision of this patch made the changes that are now
done in mi_on_normal_stop directly in infrun.c:normal_stop, and so
not having an obvious place to put the new uiout by then, and not
wanting to abuse CLI's uiout, I made a temporary uiout when
necessary.
- Hopefuly the rest of the patch is more or less obvious given the
comments added.
Tested on x86_64 Fedora 20, no regressions.
2014-05-21 Pedro Alves <palves@redhat.com>
PR gdb/13860
* gdbthread.h (struct thread_control_state): New field
`command_interp'.
* infrun.c (follow_fork): Copy the new thread control field to the
child fork thread.
(clear_proceed_status_thread): Clear the new thread control field.
(proceed): Set the new thread control field.
* interps.h (command_interp): Declare.
* interps.c (command_interpreter): New global.
(command_interp): New function.
(interp_exec): Set `command_interpreter' while here.
* cli-out.c (cli_uiout_dtor): New function.
(cli_ui_out_impl): Install it.
* mi/mi-interp.c: Include cli-out.h.
(mi_cmd_interpreter_exec): Add comment.
(restore_current_uiout_cleanup): New function.
(ui_out_free_cleanup): New function.
(mi_on_normal_stop): If finishing an execution command started by
a CLI command, or any kind of breakpoint-like event triggered,
print the stop event to the output (CLI) stream.
* mi/mi-out.c (mi_ui_out_impl): Install NULL `dtor' handler.
2014-05-21 Pedro Alves <palves@redhat.com>
PR gdb/13860
* gdb.mi/mi-cli.exp (line_callee4_next_step): New global.
(top level): Test that output related to execution commands is
sent to the console with CLI commands, but not with MI commands.
Test that breakpoint events are always mirrored to the console.
Also expect the new source line to be output after a "next" in
async mode too. Make it a pass/fail test.
* gdb.mi/mi-solib.exp: Test that the CLI solib event note is
output.
* lib/mi-support.exp (mi_gdb_expect_cli_output): New procedure.
2014-03-11 20:31:36 +00:00
# Test that the new current source line is output to the console
# stream, given we executed the console 'next' command, not
# -exec-next.
set test "34 next: CLI output"
gdb_expect {
-re "~\"$line_main_return\[^\r\n\]+\r\n" {
pass $test
}
timeout {
fail "$test (timeout)"
2012-09-21 08:39:08 +00:00
}
}
PR gdb/13860 - Make MI sync vs async output (closer to) the same.
Ignoring expected and desired differences like whether the prompt is
output after *stoppped records, GDB MI output is still different in
sync and async modes.
In sync mode, when a CLI execution command is entered, the "reason"
field is missing in the *stopped async record. And in async mode, for
some events, like program exits, the corresponding CLI output is
missing in the CLI channel.
Vis, diff between sync vs async modes:
run
^running
*running,thread-id="1"
(gdb)
...
- ~"[Inferior 1 (process 15882) exited normally]\n"
=thread-exited,id="1",group-id="i1"
=thread-group-exited,id="i1",exit-code="0"
- *stopped
+ *stopped,reason="exited-normally"
si
...
(gdb)
~"0x000000000045e033\t29\t memset (&args, 0, sizeof args);\n"
- *stopped,frame=...,thread-id="1",stopped-threads="all",core="0"
+ *stopped,reason="end-stepping-range",frame=...,thread-id="1",stopped-threads="all",core="0"
(gdb)
In addition, in both cases, when a MI execution command is entered,
and a breakpoint triggers, the event is sent to the console too. But
some events like program exits have the CLI output missing in the CLI
channel:
-exec-run
^running
*running,thread-id="1"
(gdb)
...
=thread-exited,id="1",group-id="i1"
=thread-group-exited,id="i1",exit-code="0"
- *stopped
+ *stopped,reason="exited-normally"
We'll want to make background commands always possible by default.
IOW, make target-async be the default. But, in order to do that,
we'll need to emulate MI sync on top of an async target. That means
we'll have yet another combination to care for in the testsuite.
Rather than making the testsuite cope with all these differences, I
thought it better to just fix GDB to always have the complete output,
no matter whether it's in sync or async mode.
This is all related to interpreter-exec, and the corresponding uiout
switching. (Typing a CLI command directly in MI is shorthand for
running it through -interpreter-exec console.)
In sync mode, when a CLI command is active, normal_stop is called when
the current interpreter and uiout are CLI's. So print_XXX_reason
prints the stop reason to CLI uiout (only), and we don't show it in
MI.
In async mode the stop event is processed when we're back in the MI
interpreter, so the stop reason is printed directly to the MI uiout.
Fix this by making run control event printing roughly independent of
whatever is the current interpreter or uiout. That is, move these
prints to interpreter observers, that know whether to print or be
quiet, and if printing, which uiout to print to. In the case of the
console/tui interpreters, only print if the top interpreter. For MI,
always print.
Breakpoint hits / normal stops are already handled similarly -- MI has
a normal_stop observer that prints the event to both MI and the CLI,
though that could be cleaned up further in the direction of this
patch.
This also makes all of:
(gdb) foo
and
(gdb) interpreter-exec MI "-exec-foo"
and
(gdb)
-exec-foo
and
(gdb)
-interpreter-exec console "foo"
print as expected.
Tested on x86_64 Fedora 20, sync and async modes.
gdb/
2014-05-29 Pedro Alves <palves@redhat.com>
PR gdb/13860
* cli/cli-interp.c: Include infrun.h and observer.h.
(cli_uiout, cli_interp): New globals.
(cli_on_signal_received, cli_on_end_stepping_range)
(cli_on_signal_exited, cli_on_exited, cli_on_no_history): New
functions.
(cli_interpreter_init): Install them as 'end_stepping_range',
'signal_received' 'signal_exited', 'exited' and 'no_history'
observers.
(_initialize_cli_interp): Remove cli_interp local.
* infrun.c (handle_inferior_event): Call the several stop reason
observers instead of printing the stop reason directly.
(end_stepping_range): New function.
(print_end_stepping_range_reason, print_signal_exited_reason)
(print_exited_reason, print_signal_received_reason)
(print_no_history_reason): Make static, and add an uiout
parameter. Print to that instead of to CURRENT_UIOUT.
* infrun.h (print_end_stepping_range_reason)
(print_signal_exited_reason, print_exited_reason)
(print_signal_received_reason print_no_history_reason): New
declarations.
* mi/mi-common.h (struct mi_interp): Rename 'uiout' field to
'mi_uiout'.
<cli_uiout>: New field.
* mi/mi-interp.c (mi_interpreter_init): Adjust. Create the new
uiout for CLI output. Install 'signal_received',
'end_stepping_range', 'signal_exited', 'exited' and 'no_history'
observers.
(find_mi_interpreter, mi_interp_data, mi_on_signal_received)
(mi_on_end_stepping_range, mi_on_signal_exited, mi_on_exited)
(mi_on_no_history): New functions.
(ui_out_free_cleanup): Delete function.
(mi_on_normal_stop): Don't allocate a new uiout for CLI output,
instead use the one already stored in the MI interpreter data.
(mi_ui_out): Adjust.
* tui/tui-interp.c: Include infrun.h and observer.h.
(tui_interp): New global.
(tui_on_signal_received, tui_on_end_stepping_range)
(tui_on_signal_exited, tui_on_exited)
(tui_on_no_history): New functions.
(tui_init): Install them as 'end_stepping_range',
'signal_received' 'signal_exited', 'exited' and 'no_history'
observers.
(_initialize_tui_interp): Delete tui_interp local.
gdb/doc/
2014-05-29 Pedro Alves <palves@redhat.com>
PR gdb/13860
* observer.texi (signal_received, end_stepping_range)
(signal_exited, exited, no_history): New observer subjects.
gdb/testsuite/
2014-05-29 Pedro Alves <palves@redhat.com>
PR gdb/13860
* gdb.mi/mi-cli.exp: Always expect "end-stepping-range" stop
reason, even in sync mode.
2014-05-29 12:09:45 +00:00
mi_expect_stop "end-stepping-range" "main" "" ".*basics.c" $line_main_return "" \
2012-09-21 08:39:08 +00:00
"34 next: stop"
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
mi_gdb_test "-interpreter-exec console \"list\"" \
2008-01-22 19:43:10 +00:00
"\~\"$line_main_return\[\\\\t ]*callme \\(1\\);\\\\n\".*\\^done" \
2004-08-15 10:15:58 +00:00
"-interpreter-exec console \"list\" at basics.c:\$line_main_return"
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
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 22:15:27 +00:00
mi_gdb_test "600-break-insert -t basics.c:$line_main_callme_2" \
{600\^done,bkpt=.number="4",type="breakpoint".*\}} \
"-break-insert -t basics.c:\$line_main_callme_2"
mi_execute_to "exec-continue" "breakpoint-hit" "main" "" ".*basics.c" \
$line_main_callme_2 { "" "disp=\"del\"" } \
"-exec-continue to line \$line_main_callme_2"
# Restore the listsize back to the default.
mi_gdb_test "-interpreter-exec console \"set listsize 10\"" \
".*=cmd-param-changed,param=\"listsize\",value=\"10\".*\\^done" \
"-interpreter-exec console \"set listsize 10\""
# "list" should show 10 lines centered on where the program stopped.
set first_list_line [expr $line_main_callme_2 - 5]
mi_gdb_test "-interpreter-exec console \"list\"" \
".*\~\"$first_list_line.*\\^done" \
"-interpreter-exec console \"list\" at basics.c:\$line_main_callme_2"
Index: ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* interps.h (INTERP_MI2, INTERP_MI3): Define.
Index: doc/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* gdb.texinfo (Mode Options): Mention that "mi2" was included in
GDB 6.0.
Index: mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi-interp.c (_initialize_mi_interp): Register "mi2" and "mi3".
Make "mi" select "mi2".
Index: testsuite/gdb.mi/ChangeLog
2003-08-07 Andrew Cagney <cagney@redhat.com>
* mi2-basics.exp: Copy base MI .exp file, set MIFLAGS to -i=mi2.
* mi2-break.exp, mi2-cli.exp, mi2-console.exp: Ditto.
* mi2-disassemble.exp, mi2-eval.exp, mi2-file.exp: Ditto.
* mi2-hack-cli.exp, mi2-pthreads.exp, mi2-read-memory.exp: Ditto.
* mi2-regs.exp, mi2-return.exp, mi2-simplerun.exp: Ditto.
* mi2-stack.exp, mi2-stepi.exp, mi2-syn-frame.exp: Ditto.
* mi2-until.exp, mi2-var-block.exp, mi2-var-child.exp: Ditto.
* mi2-var-cmd.exp, mi2-var-display.exp, mi2-watch.exp: Ditto.
2003-08-07 17:47:42 +00:00
mi_gdb_test "-interpreter-exec console \"help set args\"" \
{\~"Set argument list to give program being debugged when it is started\.\\nFollow this command with any number of args, to be passed to the program\.".*\^done} \
"-interpreter-exec console \"help set args\""
# NOTE: cagney/2003-02-03: Not yet.
# mi_gdb_test "-interpreter-exec console \"set \$pc=0x0\"" \
# {.*=target-changed.*\^done} \
# "-interpreter-exec console \"set \$pc=0x0\""
mi_gdb_test "888-interpreter-exec console \"set \$pc=0x0\"" \
{888\^done} \
"-interpreter-exec console \"set \$pc=0x0\""
#mi_gdb_test "-interpreter-exec console \"\"" \
{} \
"-interpreter-exec console \"\""
mi_gdb_exit
return 0