old-cross-binutils/gdb/testsuite/gdb.mi
Pedro Alves 251bde03ba PR15693 - Fix spurious *running events, thread state, dprintf-style call
If one sets a breakpoint with a condition that involves calling a
function in the inferior, and then the condition evaluates false, GDB
outputs one *running event for each time the program hits the
breakpoint.  E.g.,

  $ gdb return-false -i=mi

  (gdb)
  start
  ...
  (gdb)
  b 14 if return_false ()
  &"b 14 if return_false ()\n"
  ~"Breakpoint 2 at 0x4004eb: file return-false.c, line 14.\n"
  ...
  ^done
  (gdb)
  c
  &"c\n"
  ~"Continuing.\n"
  ^running
  *running,thread-id=(...)
  (gdb)
  *running,thread-id=(...)
  *running,thread-id=(...)
  *running,thread-id=(...)
  *running,thread-id=(...)
  *running,thread-id=(...)
  ... repeat forever ...

An easy way a user can trip on this is with a dprintf with "set
dprintf-style call".  In that case, a dprintf is just a breakpoint
that when hit GDB calls the printf function in the inferior, and then
resumes it, just like the case above.

If the breakpoint/dprintf is set in a loop, then these spurious events
can potentially slow down a frontend much, if it decides to refresh
its GUI whenever it sees this event (Eclipse is one such case).

When we run an infcall, we pretend we don't actually run the inferior.
This is already handled for the usual case of calling a function
directly from the CLI:

 (gdb)
 p return_false ()
 &"p return_false ()\n"
 ~"$1 = 0"
 ~"\n"
 ^done
 (gdb)

Note no *running, nor *stopped events.  That's handled by:

 static void
 mi_on_resume (ptid_t ptid)
 {
...
   /* Suppress output while calling an inferior function.  */
   if (tp->control.in_infcall)
     return;

and equivalent code on normal_stop.

However, in the cases of the PR, after finishing the infcall there's
one more resume, and mi_on_resume doesn't know that it should suppress
output then too, somehow.

The "running/stopped" state is a high level user/frontend state.
Internal stops are invisible to the frontend.  If follows from that
that we should be setting the thread to running at a higher level
where we still know the set of threads the user _intends_ to resume.

Currently we mark a thread as running from within target_resume, a low
level target operation.  As consequence, today, if we resume a
multi-threaded program while stopped at a breakpoint, we see this:

 -exec-continue
 ^running
 *running,thread-id="1"
 (gdb)
 *running,thread-id="all"

The first *running was GDB stepping over the breakpoint, and the
second is GDB finally resuming everything.

Between those two *running's, threads other than "1" still have their
state set to stopped.  That's bogus -- in async mode, this opens a
tiny window between both resumes where the user might try to run
another execution command to threads other than thread 1, and very
much confuse GDB.

That is, the "step" below should fail the "step", complaining that the
thread is running:

  (gdb) c -a &
  (gdb) thread 2
  (gdb) step

IOW, threads that GDB happens to not resume immediately (say, because
it needs to step over a breakpoint) shall still be marked as running.

Then, if we move marking threads as running to a higher layer,
decoupled from target_resume, plus skip marking threads as running
when running an infcall, the spurious *running events disappear,
because there will be no state transitions at all.

I think we might end up adding a new thread state -- THREAD_INFCALL or
some such, however since infcalls are always synchronous today, I
didn't find a need.  There's no way to execute a CLI/MI command
directly from the prompt if some thread is running an infcall.

Tested on x86_64 Fedora 20.

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

	PR PR15693
	* infrun.c (resume): Determine how much to resume depending on
	whether the caller wanted a step, not whether we can hardware step
	the target.  Mark all threads that we intend to run as running,
	unless we're calling an inferior function.
	(normal_stop): If the thread is running an infcall, don't finish
	thread state.
	* target.c (target_resume): Don't mark threads as running here.

gdb/testsuite/
2014-05-29  Pedro Alves  <palves@redhat.com>
	    Hui Zhu  <hui@codesourcery.com>

	PR PR15693
	* gdb.mi/mi-condbreak-call-thr-state-mt.c: New file.
	* gdb.mi/mi-condbreak-call-thr-state-st.c: New file.
	* gdb.mi/mi-condbreak-call-thr-state.c: New file.
	* gdb.mi/mi-condbreak-call-thr-state.exp: New file.
2014-05-29 12:27:01 +01:00
..
array.f Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
basics.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
ChangeLog-1999-2003
dw2-ref-missing-frame-func.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
dw2-ref-missing-frame-main.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
dw2-ref-missing-frame.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
dw2-ref-missing-frame.S Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
gdb669.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
gdb680.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
gdb701.c
gdb701.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
gdb792.cc
gdb792.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
gdb2549.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
Makefile.in
mi-async.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-basics.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-break.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-breakpoint-changed.exp Test no =breakpoint-modified is emitted for modifications from MI commands 2014-02-08 09:41:01 +08:00
mi-catch-load-so.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-catch-load.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-catch-load.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-cli.exp PR gdb/13860: don't lose '-interpreter-exec console EXECUTION_COMMAND''s output in async mode. 2014-05-21 23:17:23 +01:00
mi-cmd-param-changed.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-condbreak-call-thr-state-mt.c PR15693 - Fix spurious *running events, thread state, dprintf-style call 2014-05-29 12:27:01 +01:00
mi-condbreak-call-thr-state-st.c PR15693 - Fix spurious *running events, thread state, dprintf-style call 2014-05-29 12:27:01 +01:00
mi-condbreak-call-thr-state.c PR15693 - Fix spurious *running events, thread state, dprintf-style call 2014-05-29 12:27:01 +01:00
mi-condbreak-call-thr-state.exp PR15693 - Fix spurious *running events, thread state, dprintf-style call 2014-05-29 12:27:01 +01:00
mi-console.c
mi-console.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-disassemble.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-dprintf.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-dprintf.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-eval.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-file-transfer.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-file.exp Fix mi-file.exp fails on remote host 2014-05-14 20:11:53 +08:00
mi-fill-memory.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-fullname-deleted.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-hack-cli.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-i-cmd.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-info-os.exp gdb.mi/mi-info-os.exp: Fix cross-debugger testing 2014-01-09 19:57:13 +00:00
mi-inheritance-syntax-error.cc
mi-inheritance-syntax-error.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-language.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-logging.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-memory-changed.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-nonstop-exit.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-nonstop.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-ns-stale-regcache.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-nsintrall.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-nsmoribund.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-nsthrexec.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-pending.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-pending.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-pendshr.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-pthreads.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-read-memory.c
mi-read-memory.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-record-changed.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-reg-undefined.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-reg-undefined.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-reg-undefined.S Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-regs.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-return.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-reverse.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-simplerun.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-solib.exp PR gdb/13860: don't lose '-interpreter-exec console EXECUTION_COMMAND''s output in async mode. 2014-05-21 23:17:23 +01:00
mi-stack.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-stack.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-start.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-start.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-stepi.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-stepn.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-stepn.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-syn-frame.c
mi-syn-frame.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-undefined-cmd.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-until.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-var-block.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-var-child-f.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-var-child.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-var-child.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-var-cmd.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-var-cp.cc Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-var-cp.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-var-create-rtti.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-var-create-rtti.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-var-display.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-var-invalidate.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-var-rtti.cc Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-var-rtti.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-vla-c99.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi-watch-nonstop.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi-watch.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi2-amd64-entry-value.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi2-amd64-entry-value.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
mi2-amd64-entry-value.s Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi2-prompt.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
mi2-var-child.exp Introduce some new MI test suite cleanups for breakpoint and 2014-04-23 12:17:31 -07:00
non-stop-exit.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
non-stop.c Add return value for non-void function return statements to fix error in clang build. 2014-04-14 08:34:51 -07:00
ns-stale-regcache.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
nsintrall.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
nsmoribund.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
nsthrexec.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
pending.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
pendshr1.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
pendshr2.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
pr11022.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
pr11022.exp Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
pthreads.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
solib-lib.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
solib-main.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
testcmds
until.c
var-cmd.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00
vla.c test: add mi vla test 2014-04-14 09:52:11 -07:00
watch-nonstop.c Update Copyright year range in all files maintained by GDB. 2014-01-01 07:54:24 +04:00