target_require_runnable.
* target.c (target_require_runnable): New.
* target.h (target_require_runnable): Declare.
* gdb.texinfo (Starting): Mention always-running targets.
(Target Commands): Add an anchor for load.
(Connecting): Explain continue instead of run.
+2008-02-28 Daniel Jacobowitz <dan@codesourcery.com>
+
+ * infcmd.c (kill_if_already_running): Make static. Use
+ target_require_runnable.
+ * target.c (target_require_runnable): New.
+ * target.h (target_require_runnable): Declare.
+
2008-02-28 Daniel Jacobowitz <dan@codesourcery.com>
* frame.c (reinit_frame_cache): Only annotate if frames were
+2008-02-28 Daniel Jacobowitz <dan@codesourcery.com>
+
+ * gdb.texinfo (Starting): Mention always-running targets.
+ (Target Commands): Add an anchor for load.
+ (Connecting): Explain continue instead of run.
+
2008-02-27 Daniel Jacobowitz <dan@codesourcery.com>
* gdb.texinfo (Debugging Output): Document "set debug timestamp".
If you are running your program in an execution environment that
supports processes, @code{run} creates an inferior process and makes
-that process run your program. (In environments without processes,
-@code{run} jumps to the start of your program.)
+that process run your program. In some environments without processes,
+@code{run} jumps to the start of your program. Other targets,
+like @samp{remote}, are always running. If you get an error
+message like this one:
+
+@smallexample
+The "remote" target does not support "run".
+Try "help target" or "continue".
+@end smallexample
+
+@noindent
+then use @code{continue} to run your program. You may need @code{load}
+first (@pxref{load}).
The execution of a program is affected by certain information it
receives from its superior. @value{GDBN} provides ways to specify this
@kindex load @var{filename}
@item load @var{filename}
+@anchor{load}
Depending on what remote debugging facilities are configured into
@value{GDBN}, the @code{load} command may be available. Where it exists, it
is meant to make @var{filename} (an executable) available for debugging
@end table
Once the connection has been established, you can use all the usual
-commands to examine and change data and to step and continue the
-remote program.
+commands to examine and change data. The remote program is already
+running; you can use @kbd{step} and @kbd{continue}, and you do not
+need to use @kbd{run}.
@cindex interrupting remote programs
@cindex remote programs, interrupting
from the beginning. Ask the user to confirm that he wants to restart
the program being debugged when FROM_TTY is non-null. */
-void
+static void
kill_if_already_running (int from_tty)
{
if (! ptid_equal (inferior_ptid, null_ptid) && target_has_execution)
{
+ /* Bail out before killing the program if we will not be able to
+ restart it. */
+ target_require_runnable ();
+
if (from_tty
&& !query ("The program being debugged has been started already.\n\
Start it from the beginning? "))
return NULL;
}
+/* Look through the currently pushed targets. If none of them will
+ be able to restart the currently running process, issue an error
+ message. */
+
+void
+target_require_runnable (void)
+{
+ struct target_ops *t;
+
+ for (t = target_stack; t != NULL; t = t->beneath)
+ {
+ /* If this target knows how to create a new program, then
+ assume we will still be able to after killing the current
+ one. Either killing and mourning will not pop T, or else
+ find_default_run_target will find it again. */
+ if (t->to_create_inferior != NULL)
+ return;
+
+ /* Do not worry about thread_stratum targets that can not
+ create inferiors. Assume they will be pushed again if
+ necessary, and continue to the process_stratum. */
+ if (t->to_stratum == thread_stratum)
+ continue;
+
+ error (_("\
+The \"%s\" target does not support \"run\". Try \"help target\" or \"continue\"."),
+ t->to_shortname);
+ }
+
+ /* This function is only called if the target is running. In that
+ case there should have been a process_stratum target and it
+ should either know how to create inferiors, or not... */
+ internal_error (__FILE__, __LINE__, "No targets found");
+}
+
/* Look through the list of possible targets for a target that can
execute a run or attach command without any other data. This is
used to locate the default process stratum.
extern void noprocess (void);
+extern void target_require_runnable (void);
+
extern void find_default_attach (char *, int);
extern void find_default_create_inferior (char *, char *, char **, int);