From 8edfe2693228f91b78661dc04e8c91095ab19487 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Thu, 28 Feb 2008 16:26:18 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 7 +++++++ gdb/doc/ChangeLog | 6 ++++++ gdb/doc/gdb.texinfo | 21 +++++++++++++++++---- gdb/infcmd.c | 6 +++++- gdb/target.c | 35 +++++++++++++++++++++++++++++++++++ gdb/target.h | 2 ++ 6 files changed, 72 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 50481cecd7f..18a4641e27c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2008-02-28 Daniel Jacobowitz + + * 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 * frame.c (reinit_frame_cache): Only annotate if frames were diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 1cc9af44f06..95d94d99d97 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,9 @@ +2008-02-28 Daniel Jacobowitz + + * 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 * gdb.texinfo (Debugging Output): Document "set debug timestamp". diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 4f4b6948ce1..dfc6e813a89 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -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 diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 972f9e22324..9d889b2bff9 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -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? ")) diff --git a/gdb/target.c b/gdb/target.c index 87ddf249e0a..ceb71b36cde 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -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. diff --git a/gdb/target.h b/gdb/target.h index 4a2236cbc3a..b7038304cba 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -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); -- 2.30.2