* infcmd.c (kill_if_already_running): Make static. Use

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.
This commit is contained in:
Daniel Jacobowitz
2008-02-28 16:26:18 +00:00
parent 0d6ba1b16e
commit 8edfe26932
6 changed files with 72 additions and 5 deletions

View File

@@ -1,3 +1,10 @@
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

View File

@@ -1,3 +1,9 @@
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".

View File

@@ -1818,8 +1818,19 @@ argument to @value{GDBN} (@pxref{Invocation, ,Getting In and Out of
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
@@ -12669,6 +12680,7 @@ Show the current status of displaying communications between
@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
@@ -12847,8 +12859,9 @@ program has already exited, this will have no effect.)
@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

View File

@@ -444,11 +444,15 @@ post_create_inferior (struct target_ops *target, int from_tty)
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? "))

View File

@@ -1723,6 +1723,41 @@ target_read_description (struct target_ops *target)
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.

View File

@@ -1188,6 +1188,8 @@ extern void initialize_targets (void);
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);