Index: gdb/infcmd.c |
diff --git a/gdb/infcmd.c b/gdb/infcmd.c |
index 7e31600219e6f555991966f826e551ff8048674e..19f720b4506c45c16d77c852e42fc3f36cd81fd8 100644 |
--- a/gdb/infcmd.c |
+++ b/gdb/infcmd.c |
@@ -1,6 +1,6 @@ |
/* Memory-access and commands for "inferior" process, for GDB. |
- Copyright (C) 1986-2012 Free Software Foundation, Inc. |
+ Copyright (C) 1986-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -20,7 +20,7 @@ |
#include "defs.h" |
#include "arch-utils.h" |
#include <signal.h> |
-#include "gdb_string.h" |
+#include <string.h> |
#include "symtab.h" |
#include "gdbtypes.h" |
#include "frame.h" |
@@ -56,20 +56,7 @@ |
#include "inf-loop.h" |
#include "continuations.h" |
#include "linespec.h" |
- |
-/* Functions exported for general use, in inferior.h: */ |
- |
-void all_registers_info (char *, int); |
- |
-void registers_info (char *, int); |
- |
-void nexti_command (char *, int); |
- |
-void stepi_command (char *, int); |
- |
-void continue_command (char *, int); |
- |
-void interrupt_target_command (char *args, int from_tty); |
+#include "cli/cli-utils.h" |
/* Local functions: */ |
@@ -151,11 +138,6 @@ ptid_t inferior_ptid; |
CORE_ADDR stop_pc; |
-/* Flag indicating that a command has proceeded the inferior past the |
- current breakpoint. */ |
- |
-int breakpoint_proceeded; |
- |
/* Nonzero if stopped due to completion of a stack dummy routine. */ |
enum stop_stack_kind stop_stack_dummy; |
@@ -165,6 +147,10 @@ enum stop_stack_kind stop_stack_dummy; |
int stopped_by_random_signal; |
+/* See inferior.h. */ |
+ |
+int startup_with_shell = 1; |
+ |
/* Accessor routines. */ |
@@ -273,7 +259,7 @@ construct_inferior_arguments (int argc, char **argv) |
{ |
char *result; |
- if (STARTUP_WITH_SHELL) |
+ if (startup_with_shell) |
{ |
#ifdef __MINGW32__ |
/* This holds all the characters considered special to the |
@@ -450,11 +436,7 @@ post_create_inferior (struct target_ops *target, int from_tty) |
/* Create the hooks to handle shared library load and unload |
events. */ |
-#ifdef SOLIB_CREATE_INFERIOR_HOOK |
- SOLIB_CREATE_INFERIOR_HOOK (PIDGET (inferior_ptid)); |
-#else |
solib_create_inferior_hook (from_tty); |
-#endif |
if (current_program_space->solib_add_generation == solib_add_generation) |
{ |
@@ -469,14 +451,8 @@ post_create_inferior (struct target_ops *target, int from_tty) |
/* If the solist is global across processes, there's no need to |
refetch it here. */ |
- if (!gdbarch_has_global_solist (target_gdbarch)) |
- { |
-#ifdef SOLIB_ADD |
- SOLIB_ADD (NULL, 0, target, auto_solib_add); |
-#else |
- solib_add (NULL, 0, target, auto_solib_add); |
-#endif |
- } |
+ if (!gdbarch_has_global_solist (target_gdbarch ())) |
+ solib_add (NULL, 0, target, auto_solib_add); |
} |
} |
@@ -708,6 +684,24 @@ ensure_not_tfind_mode (void) |
error (_("Cannot execute this command while looking at trace frames.")); |
} |
+/* Throw an error indicating the current thread is running. */ |
+ |
+static void |
+error_is_running (void) |
+{ |
+ error (_("Cannot execute this command while " |
+ "the selected thread is running.")); |
+} |
+ |
+/* Calls error_is_running if the current thread is running. */ |
+ |
+static void |
+ensure_not_running (void) |
+{ |
+ if (is_running (inferior_ptid)) |
+ error_is_running (); |
+} |
+ |
void |
continue_1 (int all_threads) |
{ |
@@ -738,7 +732,7 @@ continue_1 (int all_threads) |
} |
/* continue [-a] [proceed-count] [&] */ |
-void |
+static void |
continue_command (char *args, int from_tty) |
{ |
int async_exec = 0; |
@@ -857,13 +851,13 @@ next_command (char *count_string, int from_tty) |
/* Likewise, but step only one instruction. */ |
-void |
+static void |
stepi_command (char *count_string, int from_tty) |
{ |
step_1 (0, 1, count_string); |
} |
-void |
+static void |
nexti_command (char *count_string, int from_tty) |
{ |
step_1 (1, 1, count_string); |
@@ -1028,7 +1022,7 @@ step_once (int skip_subroutines, int single_inst, int count, int thread) |
CORE_ADDR pc; |
/* Step at an inlined function behaves like "down". */ |
- if (!skip_subroutines && !single_inst |
+ if (!skip_subroutines |
&& inline_skipped_frames (inferior_ptid)) |
{ |
ptid_t resume_ptid; |
@@ -1056,9 +1050,14 @@ step_once (int skip_subroutines, int single_inst, int count, int thread) |
&tp->control.step_range_start, |
&tp->control.step_range_end); |
+ tp->control.may_range_step = 1; |
+ |
/* If we have no line info, switch to stepi mode. */ |
if (tp->control.step_range_end == 0 && step_stop_if_no_debug) |
- tp->control.step_range_start = tp->control.step_range_end = 1; |
+ { |
+ tp->control.step_range_start = tp->control.step_range_end = 1; |
+ tp->control.may_range_step = 0; |
+ } |
else if (tp->control.step_range_end == 0) |
{ |
const char *name; |
@@ -1170,8 +1169,8 @@ jump_command (char *arg, int from_tty) |
if (sfn != NULL) |
{ |
fixup_symbol_section (sfn, 0); |
- if (section_is_overlay (SYMBOL_OBJ_SECTION (sfn)) && |
- !section_is_mapped (SYMBOL_OBJ_SECTION (sfn))) |
+ if (section_is_overlay (SYMBOL_OBJ_SECTION (SYMBOL_OBJFILE (sfn), sfn)) && |
+ !section_is_mapped (SYMBOL_OBJ_SECTION (SYMBOL_OBJFILE (sfn), sfn))) |
{ |
if (!query (_("WARNING!!! Destination is in " |
"unmapped overlay! Jump anyway? "))) |
@@ -1332,12 +1331,12 @@ until_next_command (int from_tty) |
if (!func) |
{ |
- struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (pc); |
+ struct bound_minimal_symbol msymbol = lookup_minimal_symbol_by_pc (pc); |
- if (msymbol == NULL) |
+ if (msymbol.minsym == NULL) |
error (_("Execution is not within a known function.")); |
- tp->control.step_range_start = SYMBOL_VALUE_ADDRESS (msymbol); |
+ tp->control.step_range_start = SYMBOL_VALUE_ADDRESS (msymbol.minsym); |
tp->control.step_range_end = pc; |
} |
else |
@@ -1347,6 +1346,7 @@ until_next_command (int from_tty) |
tp->control.step_range_start = BLOCK_START (SYMBOL_BLOCK_VALUE (func)); |
tp->control.step_range_end = sal.end; |
} |
+ tp->control.may_range_step = 1; |
tp->control.step_over_calls = STEP_OVER_ALL; |
@@ -1446,14 +1446,13 @@ get_return_value (struct value *function, struct type *value_type) |
struct regcache *stop_regs = stop_registers; |
struct gdbarch *gdbarch; |
struct value *value; |
- struct ui_out *uiout = current_uiout; |
struct cleanup *cleanup = make_cleanup (null_cleanup, NULL); |
/* If stop_registers were not saved, use the current registers. */ |
if (!stop_regs) |
{ |
stop_regs = regcache_dup (get_current_regcache ()); |
- cleanup = make_cleanup_regcache_xfree (stop_regs); |
+ make_cleanup_regcache_xfree (stop_regs); |
} |
gdbarch = get_regcache_arch (stop_regs); |
@@ -1511,7 +1510,7 @@ print_return_value (struct value *function, struct type *value_type) |
ui_out_field_fmt (uiout, "gdb-result-var", "$%d", |
record_latest_value (value)); |
ui_out_text (uiout, " = "); |
- get_raw_print_options (&opts); |
+ get_no_prettyformat_print_options (&opts); |
value_print (value, stb, &opts); |
ui_out_field_stream (uiout, "return-value", stb); |
ui_out_text (uiout, "\n"); |
@@ -1770,7 +1769,7 @@ finish_command (char *arg, int from_tty) |
if (from_tty) |
{ |
printf_filtered (_("Run till exit from ")); |
- print_stack_frame (get_selected_frame (NULL), 1, LOCATION); |
+ print_stack_frame (get_selected_frame (NULL), 1, LOCATION, 0); |
} |
proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT, 1); |
@@ -1795,7 +1794,7 @@ finish_command (char *arg, int from_tty) |
else |
printf_filtered (_("Run till exit from ")); |
- print_stack_frame (get_selected_frame (NULL), 1, LOCATION); |
+ print_stack_frame (get_selected_frame (NULL), 1, LOCATION, 0); |
} |
if (execution_direction == EXEC_REVERSE) |
@@ -1839,7 +1838,7 @@ program_info (char *args, int from_tty) |
target_files_info (); |
printf_filtered (_("Program stopped at %s.\n"), |
- paddress (target_gdbarch, stop_pc)); |
+ paddress (target_gdbarch (), stop_pc)); |
if (tp->control.stop_step) |
printf_filtered (_("It stopped after being stepped.\n")); |
else if (stat != 0) |
@@ -2020,6 +2019,76 @@ path_command (char *dirname, int from_tty) |
} |
+/* Print out the register NAME with value VAL, to FILE, in the default |
+ fashion. */ |
+ |
+static void |
+default_print_one_register_info (struct ui_file *file, |
+ const char *name, |
+ struct value *val) |
+{ |
+ struct type *regtype = value_type (val); |
+ int print_raw_format; |
+ |
+ fputs_filtered (name, file); |
+ print_spaces_filtered (15 - strlen (name), file); |
+ |
+ print_raw_format = (value_entirely_available (val) |
+ && !value_optimized_out (val)); |
+ |
+ /* If virtual format is floating, print it that way, and in raw |
+ hex. */ |
+ if (TYPE_CODE (regtype) == TYPE_CODE_FLT |
+ || TYPE_CODE (regtype) == TYPE_CODE_DECFLOAT) |
+ { |
+ int j; |
+ struct value_print_options opts; |
+ const gdb_byte *valaddr = value_contents_for_printing (val); |
+ enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (regtype)); |
+ |
+ get_user_print_options (&opts); |
+ opts.deref_ref = 1; |
+ |
+ val_print (regtype, |
+ value_contents_for_printing (val), |
+ value_embedded_offset (val), 0, |
+ file, 0, val, &opts, current_language); |
+ |
+ if (print_raw_format) |
+ { |
+ fprintf_filtered (file, "\t(raw "); |
+ print_hex_chars (file, valaddr, TYPE_LENGTH (regtype), byte_order); |
+ fprintf_filtered (file, ")"); |
+ } |
+ } |
+ else |
+ { |
+ struct value_print_options opts; |
+ |
+ /* Print the register in hex. */ |
+ get_formatted_print_options (&opts, 'x'); |
+ opts.deref_ref = 1; |
+ val_print (regtype, |
+ value_contents_for_printing (val), |
+ value_embedded_offset (val), 0, |
+ file, 0, val, &opts, current_language); |
+ /* If not a vector register, print it also according to its |
+ natural format. */ |
+ if (print_raw_format && TYPE_VECTOR (regtype) == 0) |
+ { |
+ get_user_print_options (&opts); |
+ opts.deref_ref = 1; |
+ fprintf_filtered (file, "\t"); |
+ val_print (regtype, |
+ value_contents_for_printing (val), |
+ value_embedded_offset (val), 0, |
+ file, 0, val, &opts, current_language); |
+ } |
+ } |
+ |
+ fprintf_filtered (file, "\n"); |
+} |
+ |
/* Print out the machine register regnum. If regnum is -1, print all |
registers (print_all == 1) or all non-float and non-vector |
registers (print_all == 0). |
@@ -2043,9 +2112,6 @@ default_print_registers_info (struct gdbarch *gdbarch, |
for (i = 0; i < numregs; i++) |
{ |
- struct type *regtype; |
- struct value *val; |
- |
/* Decide between printing all regs, non-float / vector regs, or |
specific reg. */ |
if (regnum == -1) |
@@ -2073,76 +2139,9 @@ default_print_registers_info (struct gdbarch *gdbarch, |
|| *(gdbarch_register_name (gdbarch, i)) == '\0') |
continue; |
- fputs_filtered (gdbarch_register_name (gdbarch, i), file); |
- print_spaces_filtered (15 - strlen (gdbarch_register_name |
- (gdbarch, i)), file); |
- |
- regtype = register_type (gdbarch, i); |
- val = allocate_value (regtype); |
- |
- /* Get the data in raw format. */ |
- if (! frame_register_read (frame, i, value_contents_raw (val))) |
- { |
- fprintf_filtered (file, "*value not available*\n"); |
- continue; |
- } |
- |
- /* If virtual format is floating, print it that way, and in raw |
- hex. */ |
- if (TYPE_CODE (regtype) == TYPE_CODE_FLT |
- || TYPE_CODE (regtype) == TYPE_CODE_DECFLOAT) |
- { |
- int j; |
- struct value_print_options opts; |
- const gdb_byte *valaddr = value_contents_for_printing (val); |
- |
- get_user_print_options (&opts); |
- opts.deref_ref = 1; |
- |
- val_print (regtype, |
- value_contents_for_printing (val), |
- value_embedded_offset (val), 0, |
- file, 0, val, &opts, current_language); |
- |
- fprintf_filtered (file, "\t(raw 0x"); |
- for (j = 0; j < register_size (gdbarch, i); j++) |
- { |
- int idx; |
- |
- if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) |
- idx = j; |
- else |
- idx = register_size (gdbarch, i) - 1 - j; |
- fprintf_filtered (file, "%02x", (unsigned char) valaddr[idx]); |
- } |
- fprintf_filtered (file, ")"); |
- } |
- else |
- { |
- struct value_print_options opts; |
- |
- /* Print the register in hex. */ |
- get_formatted_print_options (&opts, 'x'); |
- opts.deref_ref = 1; |
- val_print (regtype, |
- value_contents_for_printing (val), |
- value_embedded_offset (val), 0, |
- file, 0, val, &opts, current_language); |
- /* If not a vector register, print it also according to its |
- natural format. */ |
- if (TYPE_VECTOR (regtype) == 0) |
- { |
- get_user_print_options (&opts); |
- opts.deref_ref = 1; |
- fprintf_filtered (file, "\t"); |
- val_print (regtype, |
- value_contents_for_printing (val), |
- value_embedded_offset (val), 0, |
- file, 0, val, &opts, current_language); |
- } |
- } |
- |
- fprintf_filtered (file, "\n"); |
+ default_print_one_register_info (file, |
+ gdbarch_register_name (gdbarch, i), |
+ value_of_register (i, frame)); |
} |
} |
@@ -2169,12 +2168,8 @@ registers_info (char *addr_exp, int fpregs) |
char *start; |
const char *end; |
- /* Keep skipping leading white space. */ |
- if (isspace ((*addr_exp))) |
- { |
- addr_exp++; |
- continue; |
- } |
+ /* Skip leading white space. */ |
+ addr_exp = skip_spaces (addr_exp); |
/* Discard any leading ``$''. Check that there is something |
resembling a register following it. */ |
@@ -2203,17 +2198,16 @@ registers_info (char *addr_exp, int fpregs) |
if (regnum >= gdbarch_num_regs (gdbarch) |
+ gdbarch_num_pseudo_regs (gdbarch)) |
{ |
- struct value_print_options opts; |
- struct value *val = value_of_user_reg (regnum, frame); |
- |
- printf_filtered ("%.*s: ", (int) (end - start), start); |
- get_formatted_print_options (&opts, 'x'); |
- val_print_scalar_formatted (check_typedef (value_type (val)), |
- value_contents_for_printing (val), |
- value_embedded_offset (val), |
- val, |
- &opts, 0, gdb_stdout); |
- printf_filtered ("\n"); |
+ struct value *regval = value_of_user_reg (regnum, frame); |
+ const char *regname = user_reg_map_regnum_to_name (gdbarch, |
+ regnum); |
+ |
+ /* Print in the same fashion |
+ gdbarch_print_registers_info's default |
+ implementation prints. */ |
+ default_print_one_register_info (gdb_stdout, |
+ regname, |
+ regval); |
} |
else |
gdbarch_print_registers_info (gdbarch, gdb_stdout, |
@@ -2259,7 +2253,7 @@ registers_info (char *addr_exp, int fpregs) |
} |
} |
-void |
+static void |
all_registers_info (char *addr_exp, int from_tty) |
{ |
registers_info (addr_exp, 1); |
@@ -2335,7 +2329,7 @@ kill_command (char *arg, int from_tty) |
if (target_has_stack) |
{ |
printf_filtered (_("In %s,\n"), target_longname); |
- print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC); |
+ print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); |
} |
} |
bfd_cache_close_all (); |
@@ -2413,7 +2407,7 @@ attach_command_post_wait (char *args, int from_tty, int async_exec) |
exec_file = (char *) get_exec_file (0); |
if (!exec_file) |
{ |
- exec_file = target_pid_to_exec_file (PIDGET (inferior_ptid)); |
+ exec_file = target_pid_to_exec_file (ptid_get_pid (inferior_ptid)); |
if (exec_file) |
{ |
/* It's possible we don't have a full path, but rather just a |
@@ -2438,7 +2432,7 @@ attach_command_post_wait (char *args, int from_tty, int async_exec) |
} |
/* Take any necessary post-attaching actions for this platform. */ |
- target_post_attach (PIDGET (inferior_ptid)); |
+ target_post_attach (ptid_get_pid (inferior_ptid)); |
post_create_inferior (¤t_target, from_tty); |
@@ -2525,7 +2519,7 @@ attach_command (char *args, int from_tty) |
dont_repeat (); /* Not for the faint of heart */ |
- if (gdbarch_has_global_solist (target_gdbarch)) |
+ if (gdbarch_has_global_solist (target_gdbarch ())) |
/* Don't complain if all processes share the same symbol |
space. */ |
; |
@@ -2709,13 +2703,15 @@ detach_command (char *args, int from_tty) |
if (ptid_equal (inferior_ptid, null_ptid)) |
error (_("The program is not being run.")); |
- disconnect_tracing (from_tty); |
+ query_if_trace_running (from_tty); |
+ |
+ disconnect_tracing (); |
target_detach (args, from_tty); |
/* If the solist is global across inferiors, don't clear it when we |
detach from a single inferior. */ |
- if (!gdbarch_has_global_solist (target_gdbarch)) |
+ if (!gdbarch_has_global_solist (target_gdbarch ())) |
no_shared_libraries (NULL, from_tty); |
/* If we still have inferiors to debug, then don't mess with their |
@@ -2739,7 +2735,8 @@ static void |
disconnect_command (char *args, int from_tty) |
{ |
dont_repeat (); /* Not for the faint of heart. */ |
- disconnect_tracing (from_tty); |
+ query_if_trace_running (from_tty); |
+ disconnect_tracing (); |
target_disconnect (args, from_tty); |
no_shared_libraries (NULL, from_tty); |
init_thread_list (); |
@@ -2774,7 +2771,7 @@ interrupt_target_1 (int all_threads) |
if the `-a' switch is used. */ |
/* interrupt [-a] */ |
-void |
+static void |
interrupt_target_command (char *args, int from_tty) |
{ |
if (target_can_async_p ()) |
@@ -2848,10 +2845,13 @@ info_proc_cmd_1 (char *args, enum info_proc_what what, int from_tty) |
{ |
struct gdbarch *gdbarch = get_current_arch (); |
- if (gdbarch_info_proc_p (gdbarch)) |
- gdbarch_info_proc (gdbarch, args, what); |
- else |
- target_info_proc (args, what); |
+ if (!target_info_proc (args, what)) |
+ { |
+ if (gdbarch_info_proc_p (gdbarch)) |
+ gdbarch_info_proc (gdbarch, args, what); |
+ else |
+ error (_("Not supported on this target.")); |
+ } |
} |
/* Implement `info proc' when given without any futher parameters. */ |
@@ -2923,6 +2923,7 @@ _initialize_infcmd (void) |
{ |
static struct cmd_list_element *info_proc_cmdlist; |
struct cmd_list_element *c = NULL; |
+ const char *cmd_name; |
/* Add the filename of the terminal connected to inferior I/O. */ |
add_setshow_filename_cmd ("inferior-tty", class_run, |
@@ -2935,14 +2936,18 @@ Usage: set inferior-tty /dev/pts/1"), |
&setlist, &showlist); |
add_com_alias ("tty", "set inferior-tty", class_alias, 0); |
- add_setshow_optional_filename_cmd ("args", class_run, |
- &inferior_args_scratch, _("\ |
+ cmd_name = "args"; |
+ add_setshow_string_noescape_cmd (cmd_name, class_run, |
+ &inferior_args_scratch, _("\ |
Set argument list to give program being debugged when it is started."), _("\ |
Show argument list to give program being debugged when it is started."), _("\ |
Follow this command with any number of args, to be passed to the program."), |
- set_args_command, |
- show_args_command, |
- &setlist, &showlist); |
+ set_args_command, |
+ show_args_command, |
+ &setlist, &showlist); |
+ c = lookup_cmd (&cmd_name, setlist, "", -1, 1); |
+ gdb_assert (c != NULL); |
+ set_cmd_completer (c, filename_completer); |
c = add_cmd ("environment", no_class, environment_info, _("\ |
The environment to give the program, or one variable's value.\n\ |
@@ -3016,40 +3021,50 @@ Disconnect from a target.\n\ |
The target will wait for another debugger to connect. Not available for\n\ |
all targets.")); |
- add_com ("signal", class_run, signal_command, _("\ |
-Continue program giving it signal specified by the argument.\n\ |
-An argument of \"0\" means continue program without giving it a signal.")); |
+ c = add_com ("signal", class_run, signal_command, _("\ |
+Continue program with the specified signal.\n\ |
+Usage: signal SIGNAL\n\ |
+The SIGNAL argument is processed the same as the handle command.\n\ |
+\n\ |
+An argument of \"0\" means continue the program without sending it a signal.\n\ |
+This is useful in cases where the program stopped because of a signal,\n\ |
+and you want to resume the program while discarding the signal.")); |
+ set_cmd_completer (c, signal_completer); |
add_com ("stepi", class_run, stepi_command, _("\ |
Step one instruction exactly.\n\ |
-Argument N means do this N times (or till program stops for another \ |
+Usage: stepi [N]\n\ |
+Argument N means step N times (or till program stops for another \ |
reason).")); |
add_com_alias ("si", "stepi", class_alias, 0); |
add_com ("nexti", class_run, nexti_command, _("\ |
Step one instruction, but proceed through subroutine calls.\n\ |
-Argument N means do this N times (or till program stops for another \ |
+Usage: nexti [N]\n\ |
+Argument N means step N times (or till program stops for another \ |
reason).")); |
add_com_alias ("ni", "nexti", class_alias, 0); |
add_com ("finish", class_run, finish_command, _("\ |
Execute until selected stack frame returns.\n\ |
+Usage: finish\n\ |
Upon return, the value returned is printed and put in the value history.")); |
add_com_alias ("fin", "finish", class_run, 1); |
add_com ("next", class_run, next_command, _("\ |
Step program, proceeding through subroutine calls.\n\ |
-Like the \"step\" command as long as subroutine calls do not happen;\n\ |
-when they do, the call is treated as one instruction.\n\ |
-Argument N means do this N times (or till program stops for another \ |
-reason).")); |
+Usage: next [N]\n\ |
+Unlike \"step\", if the current source line calls a subroutine,\n\ |
+this command does not enter the subroutine, but instead steps over\n\ |
+the call, in effect treating it as a single source line.")); |
add_com_alias ("n", "next", class_run, 1); |
if (xdb_commands) |
add_com_alias ("S", "next", class_run, 1); |
add_com ("step", class_run, step_command, _("\ |
Step program until it reaches a different source line.\n\ |
-Argument N means do this N times (or till program stops for another \ |
+Usage: step [N]\n\ |
+Argument N means step N times (or till program stops for another \ |
reason).")); |
add_com_alias ("s", "step", class_run, 1); |
@@ -3068,9 +3083,11 @@ Execution will also stop upon exit from the current stack frame.")); |
c = add_com ("jump", class_run, jump_command, _("\ |
Continue program being debugged at specified line or address.\n\ |
+Usage: jump <location>\n\ |
Give as argument either LINENUM or *ADDR, where ADDR is an expression\n\ |
for an address to start at.")); |
set_cmd_completer (c, location_completer); |
+ add_com_alias ("j", "jump", class_run, 1); |
if (xdb_commands) |
{ |
@@ -3089,6 +3106,7 @@ This command is a combination of tbreak and jump.")); |
add_com ("continue", class_run, continue_command, _("\ |
Continue program being debugged, after signal or breakpoint.\n\ |
+Usage: continue [N]\n\ |
If proceeding from breakpoint, a number N may be used as an argument,\n\ |
which means to set the ignore count of that breakpoint to N - 1 (so that\n\ |
the breakpoint won't break until the Nth time it is reached).\n\ |