_dnl__ -*- Texinfo -*- _dnl__ Copyright (c) 1988 1989 1990 1991 Free Software Foundation, Inc. _dnl__ This file is part of the source for the GDB manual. @c M4 FRAGMENT: $Id$ @node Stopping, Stack, Running, Top @chapter Stopping and Continuing When you run a program normally, it runs until it terminates. The principal purpose of using a debugger is so that you can stop your program before it terminates; or so that, if the program runs into trouble, you can investigate and find out why. Inside _GDBN__, your program may stop for any of several reasons, such as a signal, a breakpoint, or reaching a new line after a _GDBN__ command such as @code{step}. Usually, the messages shown by _GDBN__ provide ample explanation of the status of your program---but you can also explicitly request this information at any time. @table @code @item info program @kindex info program Display information about the status of your program: whether it is running or not, what process it is, and why it stopped. @end table @menu * Breakpoints:: Breakpoints, Watchpoints, and Exceptions * Stepping:: Stepping * Continuing:: Continuing * Signals:: Signals @end menu @node Breakpoints, Stepping, Stopping, Stopping @section Breakpoints, Watchpoints, and Exceptions @cindex breakpoints A @dfn{breakpoint} makes your program stop whenever a certain point in the program is reached. For each breakpoint, you can add various conditions to control in finer detail whether the program will stop. You can set breakpoints with the @code{break} command and its variants (@pxref{Set Breaks}), to specify the place where the program should stop by line number, function name or exact address in the program. In languages with exception handling (such as GNU C++), you can also set breakpoints where an execption is raised (@pxref{Exception Handling}). @cindex watchpoints A @dfn{watchpoint} is a special breakpoint that stops your program when the value of an expression changes. You must use a different command to set watchpoints (@pxref{Set Watchpoints}), but aside from that, you can manage a watchpoint exactly like any other breakpoint: you enable, disable, and delete both breakpoints and watchpoints using exactly the same commands. Each breakpoint or watchpoint is assigned a number when it is created; these numbers are successive integers starting with one. In many of the commands for controlling various features of breakpoints you use the breakpoint number to say which breakpoint you want to change. Each breakpoint may be @dfn{enabled} or @dfn{disabled}; if disabled, it has no effect on the program until you enable it again. @menu * Set Breaks:: Setting Breakpoints * Set Watchpoints:: Setting Watchpoints * Exception Handling:: Breakpoints and Exceptions * Delete Breaks:: Deleting Breakpoints * Disabling:: Disabling Breakpoints * Conditions:: Break Conditions * Break Commands:: Breakpoint Command Lists * Breakpoint Menus:: Breakpoint Menus * Error in Breakpoints:: @end menu @node Set Breaks, Set Watchpoints, Breakpoints, Breakpoints @subsection Setting Breakpoints @kindex break @kindex b Breakpoints are set with the @code{break} command (abbreviated @code{b}). You have several ways to say where the breakpoint should go. @table @code @item break @var{function} Set a breakpoint at entry to function @var{function}. When using source languages that permit overloading of symbols, such as C++, @var{function} may refer to more than one possible place to break. @xref{Breakpoint Menus}, for a discussion of that situation. @item break +@var{offset} @itemx break -@var{offset} Set a breakpoint some number of lines forward or back from the position at which execution stopped in the currently selected frame. @item break @var{linenum} Set a breakpoint at line @var{linenum} in the current source file. That file is the last file whose source text was printed. This breakpoint will stop the program just before it executes any of the code on that line. @item break @var{filename}:@var{linenum} Set a breakpoint at line @var{linenum} in source file @var{filename}. @item break @var{filename}:@var{function} Set a breakpoint at entry to function @var{function} found in file @var{filename}. Specifying a file name as well as a function name is superfluous except when multiple files contain similarly named functions. @item break *@var{address} Set a breakpoint at address @var{address}. You can use this to set breakpoints in parts of the program which do not have debugging information or source files. @item break When called without any arguments, @code{break} sets a breakpoint at the next instruction to be executed in the selected stack frame (@pxref{Stack}). In any selected frame but the innermost, this will cause the program to stop as soon as control returns to that frame. This is similar to the effect of a @code{finish} command in the frame inside the selected frame---except that @code{finish} doesn't leave an active breakpoint. If you use @code{break} without an argument in the innermost frame, _GDBN__ will stop the next time it reaches the current location; this may be useful inside loops. _GDBN__ normally ignores breakpoints when it resumes execution, until at least one instruction has been executed. If it did not do this, you would be unable to proceed past a breakpoint without first disabling the breakpoint. This rule applies whether or not the breakpoint already existed when the program stopped. @item break @dots{} if @var{cond} Set a breakpoint with condition @var{cond}; evaluate the expression @var{cond} each time the breakpoint is reached, and stop only if the value is nonzero. @samp{@dots{}} stands for one of the possible arguments described above (or no argument) specifying where to break. @xref{Conditions}, for more information on breakpoint conditions. @item tbreak @var{args} @kindex tbreak Set a breakpoint enabled only for one stop. @var{args} are the same as in the @code{break} command, and the breakpoint is set in the same way, but the breakpoint is automatically disabled the first time it is hit. @xref{Disabling}. @item rbreak @var{regex} @kindex rbreak Set a breakpoint on all functions matching @var{regex}. This is useful for setting breakpoints on overloaded functions that are not members of any special classes. This command sets an unconditional breakpoint on all matches, printing a list of all breakpoints it set. Once these breakpoints are set, they are treated just like the breakpoints set with the @code{break} command. They can be deleted, disabled, made conditional, etc., in the standard ways. @kindex info breakpoints @kindex $_ @item info breakpoints The command @code{info breakpoints} prints a list of all breakpoints (but not watchpoints) set and not deleted, showing their numbers, where in the program they are, and any special features in use for them. Disabled breakpoints are included in the list, but marked as disabled. @code{info break} with a breakpoint number as argument lists only that breakpoint. The convenience variable @code{$_} and the default examining-address for the @code{x} command are set to the address of the last breakpoint listed (@pxref{Memory}). The equivalent command for watchpoints is @code{info watch}. @end table _GDBN__ allows you to set any number of breakpoints at the same place in the program. There is nothing silly or meaningless about this. When the breakpoints are conditional, this is even useful (@pxref{Conditions}). @node Set Watchpoints, Exception Handling, Set Breaks, Breakpoints @subsection Setting Watchpoints @cindex setting watchpoints You can use a watchpoint to stop execution whenever the value of an expression changes, without having to predict a particular place in the inferior process where this may happen. Watchpoints currently execute two orders of magnitude more slowly than other breakpoints, but this can well be worth it to catch errors where you have no clue what part of your program is the culprit. Some processors provide special hardware to implement this feature; future releases of _GDBN__ will use such hardware if it is available. @table @code @kindex watch @item watch @var{expr} Set a watchpoint for an expression. @kindex info watchpoints @item info watchpoints This command prints a list of watchpoints; it is otherwise similar to @code{info break}. @end table @node Exception Handling, Delete Breaks, Set Watchpoints, Breakpoints @subsection Breakpoints and Exceptions @cindex exception handlers Some languages, such as GNU C++, implement exception handling. _GDBN__ can be used to examine what caused the program to raise an exception and to list the exceptions the program is prepared to handle at a given point in time. @table @code @item catch @var{exceptions} @kindex catch You can set breakpoints at active exception handlers by using the @code{catch} command. @var{exceptions} is a list of names of exceptions to catch. @end table You can use @code{info catch} to list active exception handlers; @pxref{Frame Info}. There are currently some limitations to exception handling in _GDBN__. These will be corrected in a future release. @itemize @bullet @item If you call a function interactively, _GDBN__ normally returns control to you when the function has finished executing. If the call raises an exception, however, the call may bypass the mechanism that returns control to the user and cause the program to simply continue running until it hits a breakpoint, catches a signal that _GDBN__ is listening for, or exits. @item You cannot raise an exception interactively. @item You cannot interactively install an exception handler. @end itemize @cindex raise exceptions Sometimes @code{catch} is not the best way to debug exception handling: if you need to know exactly where an exception is raised, it's better to stop @emph{before} the exception handler is called, since that way you can see the stack before any unwinding takes place. If you set a breakpoint in an exception handler instead, it may not be easy to find out where the exception was raised. To stop just before an exception handler is called, you need some knowledge of the implementation. In the case of GNU C++ exception are raised by calling a library function named @code{__raise_exception} which has the following ANSI C interface: @example /* ADDR is where the exception identifier is stored. ID is the exception identifier. */ void __raise_exception (void **@var{addr}, void *@var{id}); @end example @noindent To make the debugger catch all exceptions before any stack unwinding takes place, set a breakpoint on @code{__raise_exception} (@pxref{Breakpoints}). With a conditional breakpoint (@xref{Conditions}) that depends on the value of @var{id}, you can stop your program when a specific exception is raised. You can use multiple conditional breakpoints to stop the program when any of a number of exceptions are raised. @node Delete Breaks, Disabling, Exception Handling, Breakpoints @subsection Deleting Breakpoints @cindex clearing breakpoints, watchpoints @cindex deleting breakpoints, watchpoints It is often necessary to eliminate a breakpoint or watchpoint once it has done its job and you no longer want the program to stop there. This is called @dfn{deleting} the breakpoint. A breakpoint that has been deleted no longer exists in any sense; it is forgotten. With the @code{clear} command you can delete breakpoints according to where they are in the program. With the @code{delete} command you can delete individual breakpoints or watchpoints by specifying their breakpoint numbers. It is not necessary to delete a breakpoint to proceed past it. _GDBN__ automatically ignores breakpoints on the first instruction to be executed when you continue execution without changing the execution address. @table @code @item clear @kindex clear Delete any breakpoints at the next instruction to be executed in the selected stack frame (@pxref{Selection}). When the innermost frame is selected, this is a good way to delete a breakpoint that the program just stopped at. @item clear @var{function} @itemx clear @var{filename}:@var{function} Delete any breakpoints set at entry to the function @var{function}. @item clear @var{linenum} @itemx clear @var{filename}:@var{linenum} Delete any breakpoints set at or within the code of the specified line. @item delete breakpoints @var{bnums}@dots{} @itemx delete @var{bnums}@dots{} @itemx delete @cindex delete breakpoints @kindex delete @kindex d Delete the breakpoints or watchpoints of the numbers specified as arguments. If no argument is specified, delete all breakpoints. You can abbreviate this command as @code{d}. @end table @node Disabling, Conditions, Delete Breaks, Breakpoints @subsection Disabling Breakpoints @cindex disabled breakpoints @cindex enabled breakpoints Rather than deleting a breakpoint or watchpoint, you might prefer to @dfn{disable} it. This makes the breakpoint inoperative as if it had been deleted, but remembers the information on the breakpoint so that you can @dfn{enable} it again later. You disable and enable breakpoints and watchpoints with the @code{enable} and @code{disable} commands, optionally specifying one or more breakpoint numbers as arguments. Use @code{info break} or @code{info watch} to print a list of breakpoints or watchpoints if you don't know which numbers to use. A breakpoint or watchpoint can have any of four different states of enablement: @itemize @bullet @item Enabled. The breakpoint will stop the program. A breakpoint made with the @code{break} command starts out in this state. @item Disabled. The breakpoint has no effect on the program. @item Enabled once. The breakpoint will stop the program, but when it does so it will become disabled. A breakpoint made with the @code{tbreak} command starts out in this state. @item Enabled for deletion. The breakpoint will stop the program, but immediately after it does so it will be deleted permanently. @end itemize You can use the following commands to enable or disable breakpoints and watchpoints: @table @code @item disable breakpoints @var{bnums}@dots{} @itemx disable @var{bnums}@dots{} @itemx disable @kindex disable breakpoints @kindex disable @kindex dis Disable the specified breakpoints---or all breakpoints, if none are listed. A disabled breakpoint has no effect but is not forgotten. All options such as ignore-counts, conditions and commands are remembered in case the breakpoint is enabled again later. You may abbreviate @code{disable} as @code{dis}. @item enable breakpoints @var{bnums}@dots{} @itemx enable @var{bnums}@dots{} @itemx enable @kindex enable breakpoints @kindex enable Enable the specified breakpoints (or all defined breakpoints). They become effective once again in stopping the program, until you specify otherwise. @item enable breakpoints once @var{bnums}@dots{} @itemx enable once @var{bnums}@dots{} Enable the specified breakpoints temporarily. Each will be disabled again the next time it stops the program (unless you have used one of these commands to specify a different state before that time comes). @item enable breakpoints delete @var{bnums}@dots{} @itemx enable delete @var{bnums}@dots{} Enable the specified breakpoints to work once and then die. Each of the breakpoints will be deleted the next time it stops the program (unless you have used one of these commands to specify a different state before that time comes). @end table Save for a breakpoint set with @code{tbreak} (@pxref{Set Breaks}), breakpoints that you set initially enabled; subsequently, they become disabled or enabled only when you use one of the commands above. (The command @code{until} can set and delete a breakpoint of its own, but it will not change the state of your other breakpoints; @pxref{Stepping}.) @node Conditions, Break Commands, Disabling, Breakpoints @subsection Break Conditions @cindex conditional breakpoints @cindex breakpoint conditions The simplest sort of breakpoint breaks every time the program reaches a specified place. You can also specify a @dfn{condition} for a breakpoint. A condition is just a Boolean expression in your programming language. (@xref{Expressions}). A breakpoint with a condition evaluates the expression each time the program reaches it, and the program stops only if the condition is true. Conditions are also accepted for watchpoints; you may not need them, since a watchpoint is inspecting the value of an expression anyhow---but it might be simpler, say, to just set a watchpoint on a variable name, then have a condition that tests whether the new value is an interesting one. Break conditions may have side effects, and may even call functions in your program. These may sound like strange things to do, but their effects are completely predictable unless there is another enabled breakpoint at the same address. (In that case, _GDBN__ might see the other breakpoint first and stop the program without checking the condition of this one.) Note that breakpoint commands are usually more convenient and flexible for the purpose of performing side effects when a breakpoint is reached (@pxref{Break Commands}). Break conditions can be specified when a breakpoint is set, by using @samp{if} in the arguments to the @code{break} command. @xref{Set Breaks}. They can also be changed at any time with the @code{condition} command. The @code{watch} command doesn't recognize the @code{if} keyword; @code{condition} is the only way to impose a further condition on a watchpoint. @table @code @item condition @var{bnum} @var{expression} @kindex condition Specify @var{expression} as the break condition for breakpoint or watchpoint number @var{bnum}. From now on, this breakpoint will stop the program only if the value of @var{expression} is true (nonzero, in C). When you call @code{condition}, the expression you specify is checked immediately for syntactic correctness, and to determine whether symbols in it have referents in the context of your breakpoint. _GDBN__ does not actually evaluate @var{expression} at the time the @code{condition} command is given, however. @xref{Expressions}. @item condition @var{bnum} Remove the condition from breakpoint number @var{bnum}. It becomes an ordinary unconditional breakpoint. @end table @cindex ignore count (of breakpoint) A special case of a breakpoint condition is to stop only when the breakpoint has been reached a certain number of times. This is so useful that there is a special way to do it, using the @dfn{ignore count} of the breakpoint. Every breakpoint has an ignore count, which is an integer. Most of the time, the ignore count is zero, and therefore has no effect. But if the program reaches a breakpoint whose ignore count is positive, then instead of stopping, it just decrements the ignore count by one and continues. As a result, if the ignore count value is @var{n}, the breakpoint will not stop the next @var{n} times it is reached. @table @code @item ignore @var{bnum} @var{count} @kindex ignore Set the ignore count of breakpoint number @var{bnum} to @var{count}. The next @var{count} times the breakpoint is reached, your program's execution will not stop; other than to decrement the ignore count, _GDBN__ takes no action. To make the breakpoint stop the next time it is reached, specify a count of zero. @item continue @var{count} @itemx c @var{count} @itemx fg @var{count} @kindex continue @var{count} Continue execution of the program, setting the ignore count of the breakpoint that the program stopped at to @var{count} minus one. Thus, the program will not stop at this breakpoint until the @var{count}'th time it is reached. An argument to this command is meaningful only when the program stopped due to a breakpoint. At other times, the argument to @code{continue} is ignored. The synonym @code{fg} is provided purely for convenience, and has exactly the same behavior as other forms of the command. @end table If a breakpoint has a positive ignore count and a condition, the condition is not checked. Once the ignore count reaches zero, the condition will be checked. You could achieve the effect of the ignore count with a condition such as _0__@w{@samp{$foo-- <= 0}}_1__ using a debugger convenience variable that is decremented each time. @xref{Convenience Vars}. @node Break Commands, Breakpoint Menus, Conditions, Breakpoints @subsection Breakpoint Command Lists @cindex breakpoint commands You can give any breakpoint (or watchpoint) a series of commands to execute when the program stops due to that breakpoint. For example, you might want to print the values of certain expressions, or enable other breakpoints. @table @code @item commands @var{bnum} @itemx @dots{} @var{command-list} @dots{} @itemx end @kindex commands @kindex end Specify a list of commands for breakpoint number @var{bnum}. The commands themselves appear on the following lines. Type a line containing just @code{end} to terminate the commands. To remove all commands from a breakpoint, use the command @code{commands} and follow it immediately by @code{end}; that is, give no commands. With no @var{bnum} argument, @code{commands} refers to the last breakpoint or watchpoint set (not to the breakpoint most recently encountered). @end table Pressing @key{RET} as a means of repeating the last _GDBN__ command is disabled from the time you enter @code{commands} to just after the corresponding @code{end}. You can use breakpoint commands to start the program up again. Simply use the @code{continue} command, or @code{step}, or any other command to resume execution. However, if you do this, any further commands in the same breakpoint's command list are ignored. When the program stops again, _GDBN__ will act according to the cause of that stop. @kindex silent If the first command specified is @code{silent}, the usual message about stopping at a breakpoint is not printed. This may be desirable for breakpoints that are to print a specific message and then continue. If the remaining commands too print nothing, you will see no sign that the breakpoint was reached at all. @code{silent} is not really a command; it is meaningful only at the beginning of the commands for a breakpoint. The commands @code{echo} and @code{output} that allow you to print precisely controlled output are often useful in silent breakpoints. @xref{Output}. For example, here is how you could use breakpoint commands to print the value of @code{x} at entry to @code{foo} whenever @code{x} is positive. _0__@example break foo if x>0 commands silent echo x is\040 output x echo \n cont end _1__@end example One application for breakpoint commands is to correct one bug so you can test another. Put a breakpoint just after the erroneous line of code, give it a condition to detect the case in which something erroneous has been done, and give it commands to assign correct values to any variables that need them. End with the @code{continue} command so that the program does not stop, and start with the @code{silent} command so that no output is produced. Here is an example: @example break 403 commands silent set x = y + 4 cont end @end example @cindex lost output One deficiency in the operation of automatically continuing breakpoints under Unix appears when your program uses raw mode for the terminal. _GDBN__ switches back to its own terminal modes (not raw) before executing commands, and then must switch back to raw mode when your program is continued. This causes any pending terminal input to be lost. In the GNU system, this will be fixed by changing the behavior of terminal modes. Under Unix, when you have this problem, you might be able to get around it by putting your actions into the breakpoint condition instead of commands. For example @example condition 5 (x = y + 4), 0 @end example @noindent specifies a condition expression (@xref{Expressions}) that will change @code{x} as needed, then always have the value zero so the program will not stop. Loss of input is avoided here because break conditions are evaluated without changing the terminal modes. When you want to have nontrivial conditions for performing the side effects, the operators @samp{&&}, @samp{||} and @samp{?@dots{}:} may be useful. @node Breakpoint Menus, Error in Breakpoints, Break Commands, Breakpoints @subsection Breakpoint Menus @cindex C++ overloading @cindex symbol overloading Some programming languages (notably C++) permit a single function name to be defined several times, for application in different contexts. This is called @dfn{overloading}. When a function name is overloaded, @samp{break @var{function}} is not enough to tell _GDBN__ where you want a breakpoint. _GDBN__ responds to this situation by offering you a menu of numbered choices for different possible breakpoints, and waiting for your selection with the prompt @samp{>}. The first two options are always @samp{[0] cancel} and @samp{[1] all}. Typing @kbd{1} will set a breakpoint at all the definitions available for @var{function}, and typing @kbd{0} will abort the @code{break} command without setting any new breakpoints. For example, the following session excerpt shows an attempt to set a breakpoint at the overloaded symbol @code{String::after}. In the example, we choose three particular definitions of the function: @example (_GDBP__) b String::after [0] cancel [1] all [2] file:String.cc; line number:867 [3] file:String.cc; line number:860 [4] file:String.cc; line number:875 [5] file:String.cc; line number:853 [6] file:String.cc; line number:846 [7] file:String.cc; line number:735 > 2 4 6 Breakpoint 1 at 0xb26c: file String.cc, line 867. Breakpoint 2 at 0xb344: file String.cc, line 875. Breakpoint 3 at 0xafcc: file String.cc, line 846. Multiple breakpoints were set. Use the "delete" command to delete unwanted breakpoints. (_GDBP__) @end example @node Error in Breakpoints, , Breakpoint Menus, Breakpoints @subsection ``Cannot Insert Breakpoints'' @c FIXME: "cannot insert breakpoints" error, v unclear. @c Q in pending mail to Gilmore. ---pesch@cygnus.com, 26mar91 Under some operating systems, breakpoints cannot be used in a program if any other process is running that program. In this situation, attempting to run or continue a program with a breakpoint will cause _GDBN__ to stop the other process. When this happens, you have three ways to proceed: @enumerate @item Remove or disable the breakpoints, then continue. @item Suspend _GDBN__, and copy the file containing the program to a new name. Resume _GDBN__ and use the @code{exec-file} command to specify that _GDBN__ should run the program under that name. Then start the program again. @c FIXME: RMS commented here "Show example". Maybe when someone @c explains the first FIXME: in this section... @item Relink the program so that the text segment is nonsharable, using the linker option @samp{-N}. The operating system limitation may not apply to nonsharable executables. @end enumerate @node Stepping, Continuing, Breakpoints, Stopping @section Stepping @cindex stepping @dfn{Stepping} means setting your program in motion for a limited time, so that control will return automatically to _GDBN__ after one line of code or one machine instruction. @footnote{Your program might stop even sooner, during stepping, since a signal may arrive before your program reaches the next source line. Also, since breakpoints are active during stepping, your program will stop for them even if it has not gone as far as the stepping command specifies.} A typical technique for using stepping is to put a breakpoint (@pxref{Breakpoints}) at the beginning of the function or the section of the program in which a problem is believed to lie, run the program until it stops at that breakpoint, and then step through the suspect area, examining the variables that are interesting, until you see the problem happen. @table @code @item step @kindex step @kindex s Continue running the program until control reaches a different source line, then stop it and return control to the debugger. This command is abbreviated @code{s}. You may use the @code{step} command when control is within a function for which there is no debugging information. In that case, execution will proceed until control reaches a different function, or is about to return from this function. @item step @var{count} Continue running as in @code{step}, but do so @var{count} times. If a breakpoint is reached or a signal not related to stepping occurs before @var{count} steps, stepping stops right away. @item next @kindex next @kindex n Continue to the next source line in the current stack frame. Similar to @code{step}, but any function calls appearing within the line of code are executed without stopping. Execution stops when control reaches a different line of code at the stack level which was executing when the @code{next} command was given. This command is abbreviated @code{n}. An argument is a repeat count, as in @code{step}. @code{next} within a function that lacks debugging information acts like @code{step}, but any function calls appearing within the code of the function are executed without stopping. @item finish @kindex finish Continue running until just after the selected stack frame returns (or until there is some other reason to stop, such as a fatal signal or a breakpoint). Print the value returned by the selected stack frame (if any). Contrast this with the @code{return} command (@pxref{Returning}). @item until @kindex until @item u @kindex u Continue running until a source line past the current line, in the current stack frame, is reached. This command is used to avoid single stepping through a loop more than once. It is like the @code{next} command, except that when @code{until} encounters a jump, it automatically continues execution until the program counter is greater than the address of the jump. This means that when you reach the end of a loop after single stepping though it, @code{until} will cause the program to continue execution until the loop is exited. In contrast, a @code{next} command at the end of a loop will simply step back to the beginning of the loop, which would force you to step through the next iteration. @code{until} always stops the program if it attempts to exit the current stack frame. @code{until} may produce somewhat counterintuitive results if the order of the source lines does not match the actual order of execution. For example, in the following excerpt from a debugging session, the @code{f} (@code{frame}) command shows that execution is stopped at line @code{206}; yet when we use @code{until}, we get to line @code{195}: @example (_GDBP__) f #0 main (argc=4, argv=0xf7fffae8) at m4.c:206 206 expand_input(); (_GDBP__) until 195 for ( ; argc > 0; NEXTARG) @{ @end example In this case, (as for any C @code{for}-loop), the loop-step expression (here, @samp{argc > 0}) is executed @emph{after} the statements in the body of the loop, but is written before them. Therefore, the @code{until} command appeared to step back to the beginning of the loop when it advanced to this expression. However, it has not really gone to an earlier statement---not in terms of the actual machine code. @code{until} with no argument works by means of single instruction stepping, and hence is slower than @code{until} with an argument. @item until @var{location} @item u @var{location} Continue running the program until either the specified location is reached, or the current (innermost) stack frame returns. @var{location} is any of the forms of argument acceptable to @code{break} (@pxref{Set Breaks}). This form of the command uses breakpoints, and hence is quicker than @code{until} without an argument. @item stepi @itemx si @kindex stepi @kindex si Execute one machine instruction, then stop and return to the debugger. It is often useful to do @samp{display/i $pc} when stepping by machine instructions. This will cause the next instruction to be executed to be displayed automatically at each stop. @xref{Auto Display}. An argument is a repeat count, as in @code{step}. @item nexti @itemx ni @kindex nexti @kindex ni Execute one machine instruction, but if it is a function call, proceed until the function returns. An argument is a repeat count, as in @code{next}. @end table The @code{continue} command can be used after stepping to resume execution until the next breakpoint or signal. @node Continuing, Signals, Stepping, Stopping @section Continuing After your program stops, most likely you will want it to run some more if the bug you are looking for has not happened yet. @table @code @item continue @kindex continue Continue running the program at the place where it stopped. @end table If the program stopped at a breakpoint, the place to continue running is the address of the breakpoint. You might expect that continuing would just stop at the same breakpoint immediately. In fact, @code{continue} takes special care to prevent that from happening. You do not need to disable the breakpoint to proceed through it after stopping there. You can, however, specify an ignore-count for the breakpoint that the program stopped at, by means of an argument to the @code{continue} command. @xref{Conditions}. If the program stopped because of a signal other than @code{SIGINT} or @code{SIGTRAP}, continuing will cause the program to see that signal. You may not want this to happen. For example, if the program stopped due to some sort of memory reference error, you might store correct values into the erroneous variables and continue, hoping to see more execution; but the program would probably terminate immediately as a result of the fatal signal once it sees the signal. To prevent this, you can continue with @samp{signal 0}. @xref{Signaling}. You can also act in advance to control what signals your program will see, using the @code{handle} command (@pxref{Signals}). @node Signals, , Continuing, Stopping @section Signals @cindex signals A signal is an asynchronous event that can happen in a program. The operating system defines the possible kinds of signals, and gives each kind a name and a number. For example, in Unix @code{SIGINT} is the signal a program gets when you type an interrupt (often @kbd{C-c}); @code{SIGSEGV} is the signal a program gets from referencing a place in memory far away from all the areas in use; @code{SIGALRM} occurs when the alarm clock timer goes off (which happens only if the program has requested an alarm). @cindex fatal signals Some signals, including @code{SIGALRM}, are a normal part of the functioning of the program. Others, such as @code{SIGSEGV}, indicate errors; these signals are @dfn{fatal} (kill the program immediately) if the program has not specified in advance some other way to handle the signal. @code{SIGINT} does not indicate an error in the program, but it is normally fatal so it can carry out the purpose of the interrupt: to kill the program. _GDBN__ has the ability to detect any occurrence of a signal in the program running under _GDBN__'s control. You can tell _GDBN__ in advance what to do for each kind of signal. @cindex handling signals Normally, _GDBN__ is set up to ignore non-erroneous signals like @code{SIGALRM} (so as not to interfere with their role in the functioning of the program) but to stop the program immediately whenever an error signal happens. You can change these settings with the @code{handle} command. @table @code @item info signals @kindex info signals Print a table of all the kinds of signals and how _GDBN__ has been told to handle each one. You can use this to see the signal numbers of all the defined types of signals. @item handle @var{signal} @var{keywords}@dots{} @kindex handle Change the way _GDBN__ handles signal @var{signal}. @var{signal} can be the number of a signal or its name (with or without the @samp{SIG} at the beginning). The @var{keywords} say what change to make. @end table @c @group The keywords allowed by the @code{handle} command can be abbreviated. Their full names are: @table @code @item nostop _GDBN__ should not stop the program when this signal happens. It may still print a message telling you that the signal has come in. @item stop _GDBN__ should stop the program when this signal happens. This implies the @code{print} keyword as well. @item print _GDBN__ should print a message when this signal happens. @item noprint _GDBN__ should not mention the occurrence of the signal at all. This implies the @code{nostop} keyword as well. @item pass _GDBN__ should allow the program to see this signal; the program will be able to handle the signal, or may be terminated if the signal is fatal and not handled. @item nopass _GDBN__ should not allow the program to see this signal. @end table @c @end group When a signal has been set to stop the program, the program cannot see the signal until you continue. It will see the signal then, if @code{pass} is in effect for the signal in question @i{at that time}. In other words, after _GDBN__ reports a signal, you can use the @code{handle} command with @code{pass} or @code{nopass} to control whether that signal will be seen by the program when you later continue it. You can also use the @code{signal} command to prevent the program from seeing a signal, or cause it to see a signal it normally would not see, or to give it any signal at any time. @xref{Signaling}.