515 lines
		
	
	
	
		
			24 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			515 lines
		
	
	
	
		
			24 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
|  | <HTML> | ||
|  | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | ||
|  | <!-- Created on March, 27  2008 by texi2html 1.64 --> | ||
|  | <!-- 
 | ||
|  | Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) | ||
|  |             Karl Berry  <karl@freefriends.org> | ||
|  |             Olaf Bachmann <obachman@mathematik.uni-kl.de> | ||
|  |             and many others. | ||
|  | Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de> | ||
|  | Send bugs and suggestions to <texi2html@mathematik.uni-kl.de> | ||
|  |   | ||
|  | --> | ||
|  | <HEAD> | ||
|  | <TITLE>Debugging with GDB: Altering</TITLE> | ||
|  | 
 | ||
|  | <META NAME="description" CONTENT="Debugging with GDB: Altering"> | ||
|  | <META NAME="keywords" CONTENT="Debugging with GDB: Altering"> | ||
|  | <META NAME="resource-type" CONTENT="document"> | ||
|  | <META NAME="distribution" CONTENT="global"> | ||
|  | <META NAME="Generator" CONTENT="texi2html 1.64"> | ||
|  | 
 | ||
|  | </HEAD> | ||
|  | 
 | ||
|  | <BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> | ||
|  | 
 | ||
|  | <A NAME="SEC147"></A> | ||
|  | <TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> | ||
|  | <TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_14.html#SEC146"> < </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC148"> > </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_3.html#SEC6"> << </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top"> Up </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_16.html#SEC154"> >> </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD> | ||
|  | </TR></TABLE> | ||
|  | <H1> 14. Altering Execution </H1> | ||
|  | <!--docid::SEC147::--> | ||
|  | <P> | ||
|  | 
 | ||
|  | Once you think you have found an error in your program, you might want to | ||
|  | find out for certain whether correcting the apparent error would lead to | ||
|  | correct results in the rest of the run.  You can find the answer by | ||
|  | experiment, using the GDB features for altering execution of the | ||
|  | program. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | For example, you can store new values into variables or memory | ||
|  | locations, give your program a signal, restart it at a different | ||
|  | address, or even return prematurely from a function. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0>  | ||
|  | <TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_15.html#SEC148">14.1 Assignment to Variables</A></TD><TD>  </TD><TD ALIGN="left" VALIGN="TOP">Assignment to variables</TD></TR> | ||
|  | <TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_15.html#SEC149">14.2 Continuing at a Different Address</A></TD><TD>  </TD><TD ALIGN="left" VALIGN="TOP">Continuing at a different address</TD></TR> | ||
|  | <TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_15.html#SEC150">14.3 Giving your Program a Signal</A></TD><TD>  </TD><TD ALIGN="left" VALIGN="TOP">Giving your program a signal</TD></TR> | ||
|  | <TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_15.html#SEC151">14.4 Returning from a Function</A></TD><TD>  </TD><TD ALIGN="left" VALIGN="TOP">Returning from a function</TD></TR> | ||
|  | <TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_15.html#SEC152">14.5 Calling Program Functions</A></TD><TD>  </TD><TD ALIGN="left" VALIGN="TOP">Calling your program's functions</TD></TR> | ||
|  | <TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gdb_15.html#SEC153">14.6 Patching Programs</A></TD><TD>  </TD><TD ALIGN="left" VALIGN="TOP">Patching your program</TD></TR> | ||
|  | </TABLE></BLOCKQUOTE> | ||
|  | <P> | ||
|  | 
 | ||
|  | <A NAME="Assignment"></A> | ||
|  | <HR SIZE="6"> | ||
|  | <A NAME="SEC148"></A> | ||
|  | <TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> | ||
|  | <TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC147"> < </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC149"> > </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC147"> << </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC147"> Up </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_16.html#SEC154"> >> </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD> | ||
|  | </TR></TABLE> | ||
|  | <H2> 14.1 Assignment to Variables </H2> | ||
|  | <!--docid::SEC148::--> | ||
|  | <P> | ||
|  | 
 | ||
|  | <A NAME="IDX681"></A> | ||
|  | <A NAME="IDX682"></A> | ||
|  | To alter the value of a variable, evaluate an assignment expression. | ||
|  | See section <A HREF="gdb_9.html#SEC60">Expressions</A>.  For example, | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>print x=4 | ||
|  | </FONT></pre></td></tr></table></P><P> | ||
|  | 
 | ||
|  | stores the value 4 into the variable <CODE>x</CODE>, and then prints the | ||
|  | value of the assignment expression (which is 4). | ||
|  | See section <A HREF="gdb_13.html#SEC102">Using GDB with Different Languages</A>, for more | ||
|  | information on operators in supported languages. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <A NAME="IDX683"></A> | ||
|  | <A NAME="IDX684"></A> | ||
|  | If you are not interested in seeing the value of the assignment, use the | ||
|  | <CODE>set</CODE> command instead of the <CODE>print</CODE> command.  <CODE>set</CODE> is | ||
|  | really the same as <CODE>print</CODE> except that the expression's value is | ||
|  | not printed and is not put in the value history (see section <A HREF="gdb_9.html#SEC67">Value History</A>).  The expression is evaluated only for its effects. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | If the beginning of the argument string of the <CODE>set</CODE> command | ||
|  | appears identical to a <CODE>set</CODE> subcommand, use the <CODE>set | ||
|  | variable</CODE> command instead of just <CODE>set</CODE>.  This command is identical | ||
|  | to <CODE>set</CODE> except for its lack of subcommands.  For example, if your | ||
|  | program has a variable <CODE>width</CODE>, you get an error if you try to set | ||
|  | a new value with just <SAMP>`set width=13'</SAMP>, because GDB has the | ||
|  | command <CODE>set width</CODE>: | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>(gdb) whatis width | ||
|  | type = double | ||
|  | (gdb) p width | ||
|  | $4 = 13 | ||
|  | (gdb) set width=47 | ||
|  | Invalid syntax in expression. | ||
|  | </FONT></pre></td></tr></table></P><P> | ||
|  | 
 | ||
|  | The invalid expression, of course, is <SAMP>`=47'</SAMP>.  In | ||
|  | order to actually set the program's variable <CODE>width</CODE>, use | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>(gdb) set var width=47 | ||
|  | </FONT></pre></td></tr></table></P><P> | ||
|  | 
 | ||
|  | Because the <CODE>set</CODE> command has many subcommands that can conflict | ||
|  | with the names of program variables, it is a good idea to use the | ||
|  | <CODE>set variable</CODE> command instead of just <CODE>set</CODE>.  For example, if | ||
|  | your program has a variable <CODE>g</CODE>, you run into problems if you try | ||
|  | to set a new value with just <SAMP>`set g=4'</SAMP>, because GDB has | ||
|  | the command <CODE>set gnutarget</CODE>, abbreviated <CODE>set g</CODE>: | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>(gdb) whatis g | ||
|  | type = double | ||
|  | (gdb) p g | ||
|  | $1 = 1 | ||
|  | (gdb) set g=4 | ||
|  | (gdb) p g | ||
|  | $2 = 1 | ||
|  | (gdb) r | ||
|  | The program being debugged has been started already. | ||
|  | Start it from the beginning? (y or n) y | ||
|  | Starting program: /home/smith/cc_progs/a.out | ||
|  | "/home/smith/cc_progs/a.out": can't open to read symbols: | ||
|  |                                  Invalid bfd target. | ||
|  | (gdb) show g | ||
|  | The current BFD target is "=4". | ||
|  | </FONT></pre></td></tr></table></P><P> | ||
|  | 
 | ||
|  | The program variable <CODE>g</CODE> did not change, and you silently set the | ||
|  | <CODE>gnutarget</CODE> to an invalid value.  In order to set the variable | ||
|  | <CODE>g</CODE>, use | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>(gdb) set var g=4 | ||
|  | </FONT></pre></td></tr></table></P><P> | ||
|  | 
 | ||
|  | GDB allows more implicit conversions in assignments than C; you can | ||
|  | freely store an integer value into a pointer variable or vice versa, | ||
|  | and you can convert any structure to any other structure that is the | ||
|  | same length or shorter. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | To store values into arbitrary places in memory, use the <SAMP>`{<small>...</small>}'</SAMP> | ||
|  | construct to generate a value of specified type at a specified address | ||
|  | (see section <A HREF="gdb_9.html#SEC60">Expressions</A>).  For example, <CODE>{int}0x83040</CODE> refers | ||
|  | to memory location <CODE>0x83040</CODE> as an integer (which implies a certain size | ||
|  | and representation in memory), and | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>set {int}0x83040 = 4 | ||
|  | </FONT></pre></td></tr></table></P><P> | ||
|  | 
 | ||
|  | stores the value 4 into that memory location. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <A NAME="Jumping"></A> | ||
|  | <HR SIZE="6"> | ||
|  | <A NAME="SEC149"></A> | ||
|  | <TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> | ||
|  | <TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC148"> < </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC150"> > </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC150"> << </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC147"> Up </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_16.html#SEC154"> >> </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD> | ||
|  | </TR></TABLE> | ||
|  | <H2> 14.2 Continuing at a Different Address </H2> | ||
|  | <!--docid::SEC149::--> | ||
|  | <P> | ||
|  | 
 | ||
|  | Ordinarily, when you continue your program, you do so at the place where | ||
|  | it stopped, with the <CODE>continue</CODE> command.  You can instead continue at | ||
|  | an address of your own choosing, with the following commands: | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <DL COMPACT> | ||
|  | <A NAME="IDX685"></A> | ||
|  | <DT><CODE>jump <VAR>linespec</VAR></CODE> | ||
|  | <DD><DT><CODE>jump <VAR>location</VAR></CODE> | ||
|  | <DD>Resume execution at line <VAR>linespec</VAR> or at address given by | ||
|  | <VAR>location</VAR>.  Execution stops again immediately if there is a | ||
|  | breakpoint there.  See section <A HREF="gdb_8.html#SEC53">7.2 Specifying a Location</A>, for a description of the | ||
|  | different forms of <VAR>linespec</VAR> and <VAR>location</VAR>.  It is common | ||
|  | practice to use the <CODE>tbreak</CODE> command in conjunction with | ||
|  | <CODE>jump</CODE>.  See section <A HREF="gdb_6.html#SEC33">Setting Breakpoints</A>. | ||
|  | <P> | ||
|  | 
 | ||
|  | The <CODE>jump</CODE> command does not change the current stack frame, or | ||
|  | the stack pointer, or the contents of any memory location or any | ||
|  | register other than the program counter.  If line <VAR>linespec</VAR> is in | ||
|  | a different function from the one currently executing, the results may | ||
|  | be bizarre if the two functions expect different patterns of arguments or | ||
|  | of local variables.  For this reason, the <CODE>jump</CODE> command requests | ||
|  | confirmation if the specified line is not in the function currently | ||
|  | executing.  However, even bizarre results are predictable if you are | ||
|  | well acquainted with the machine-language code of your program. | ||
|  | </DL> | ||
|  | <P> | ||
|  | 
 | ||
|  | On many systems, you can get much the same effect as the <CODE>jump</CODE> | ||
|  | command by storing a new value into the register <CODE>$pc</CODE>.  The | ||
|  | difference is that this does not start your program running; it only | ||
|  | changes the address of where it <EM>will</EM> run when you continue.  For | ||
|  | example, | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>set $pc = 0x485 | ||
|  | </FONT></pre></td></tr></table></P><P> | ||
|  | 
 | ||
|  | makes the next <CODE>continue</CODE> command or stepping command execute at | ||
|  | address <CODE>0x485</CODE>, rather than at the address where your program stopped. | ||
|  | See section <A HREF="gdb_6.html#SEC43">Continuing and Stepping</A>. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | The most common occasion to use the <CODE>jump</CODE> command is to back | ||
|  | up--perhaps with more breakpoints set--over a portion of a program | ||
|  | that has already executed, in order to examine its execution in more | ||
|  | detail. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <A NAME="Signaling"></A> | ||
|  | <HR SIZE="6"> | ||
|  | <A NAME="SEC150"></A> | ||
|  | <TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> | ||
|  | <TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC149"> < </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC151"> > </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC151"> << </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC147"> Up </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_16.html#SEC154"> >> </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD> | ||
|  | </TR></TABLE> | ||
|  | <H2> 14.3 Giving your Program a Signal </H2> | ||
|  | <!--docid::SEC150::--> | ||
|  | <P> | ||
|  | 
 | ||
|  | <DL COMPACT> | ||
|  | <A NAME="IDX686"></A> | ||
|  | <DT><CODE>signal <VAR>signal</VAR></CODE> | ||
|  | <DD>Resume execution where your program stopped, but immediately give it the | ||
|  | signal <VAR>signal</VAR>.  <VAR>signal</VAR> can be the name or the number of a | ||
|  | signal.  For example, on many systems <CODE>signal 2</CODE> and <CODE>signal | ||
|  | SIGINT</CODE> are both ways of sending an interrupt signal. | ||
|  | <P> | ||
|  | 
 | ||
|  | Alternatively, if <VAR>signal</VAR> is zero, continue execution without | ||
|  | giving a signal.  This is useful when your program stopped on account of | ||
|  | a signal and would ordinary see the signal when resumed with the | ||
|  | <CODE>continue</CODE> command; <SAMP>`signal 0'</SAMP> causes it to resume without a | ||
|  | signal. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <CODE>signal</CODE> does not repeat when you press <KBD>RET</KBD> a second time | ||
|  | after executing the command. | ||
|  | </DL> | ||
|  | <P> | ||
|  | 
 | ||
|  | Invoking the <CODE>signal</CODE> command is not the same as invoking the | ||
|  | <CODE>kill</CODE> utility from the shell.  Sending a signal with <CODE>kill</CODE> | ||
|  | causes GDB to decide what to do with the signal depending on | ||
|  | the signal handling tables (see section <A HREF="gdb_6.html#SEC44">5.3 Signals</A>).  The <CODE>signal</CODE> command | ||
|  | passes the signal directly to your program. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <A NAME="Returning"></A> | ||
|  | <HR SIZE="6"> | ||
|  | <A NAME="SEC151"></A> | ||
|  | <TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> | ||
|  | <TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC150"> < </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC152"> > </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC152"> << </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC147"> Up </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_16.html#SEC154"> >> </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD> | ||
|  | </TR></TABLE> | ||
|  | <H2> 14.4 Returning from a Function </H2> | ||
|  | <!--docid::SEC151::--> | ||
|  | <P> | ||
|  | 
 | ||
|  | <DL COMPACT> | ||
|  | <A NAME="IDX687"></A> | ||
|  | <A NAME="IDX688"></A> | ||
|  | <DT><CODE>return</CODE> | ||
|  | <DD><DT><CODE>return <VAR>expression</VAR></CODE> | ||
|  | <DD>You can cancel execution of a function call with the <CODE>return</CODE> | ||
|  | command.  If you give an | ||
|  | <VAR>expression</VAR> argument, its value is used as the function's return | ||
|  | value. | ||
|  | </DL> | ||
|  | <P> | ||
|  | 
 | ||
|  | When you use <CODE>return</CODE>, GDB discards the selected stack frame | ||
|  | (and all frames within it).  You can think of this as making the | ||
|  | discarded frame return prematurely.  If you wish to specify a value to | ||
|  | be returned, give that value as the argument to <CODE>return</CODE>. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | This pops the selected stack frame (see section <A HREF="gdb_7.html#SEC49">Selecting a Frame</A>), and any other frames inside of it, leaving its caller as the | ||
|  | innermost remaining frame.  That frame becomes selected.  The | ||
|  | specified value is stored in the registers used for returning values | ||
|  | of functions. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | The <CODE>return</CODE> command does not resume execution; it leaves the | ||
|  | program stopped in the state that would exist if the function had just | ||
|  | returned.  In contrast, the <CODE>finish</CODE> command (see section <A HREF="gdb_6.html#SEC43">Continuing and Stepping</A>) resumes execution until the | ||
|  | selected stack frame returns naturally. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <A NAME="Calling"></A> | ||
|  | <HR SIZE="6"> | ||
|  | <A NAME="SEC152"></A> | ||
|  | <TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> | ||
|  | <TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC151"> < </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC153"> > </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC153"> << </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC147"> Up </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_16.html#SEC154"> >> </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD> | ||
|  | </TR></TABLE> | ||
|  | <H2> 14.5 Calling Program Functions </H2> | ||
|  | <!--docid::SEC152::--> | ||
|  | <P> | ||
|  | 
 | ||
|  | <DL COMPACT> | ||
|  | <A NAME="IDX689"></A> | ||
|  | <A NAME="IDX690"></A> | ||
|  | <DT><CODE>print <VAR>expr</VAR></CODE> | ||
|  | <DD>Evaluate the expression <VAR>expr</VAR> and display the resulting value. | ||
|  | <VAR>expr</VAR> may include calls to functions in the program being | ||
|  | debugged. | ||
|  | <P> | ||
|  | 
 | ||
|  | <A NAME="IDX691"></A> | ||
|  | <DT><CODE>call <VAR>expr</VAR></CODE> | ||
|  | <DD>Evaluate the expression <VAR>expr</VAR> without displaying <CODE>void</CODE> | ||
|  | returned values. | ||
|  | <P> | ||
|  | 
 | ||
|  | You can use this variant of the <CODE>print</CODE> command if you want to | ||
|  | execute a function from your program that does not return anything | ||
|  | (a.k.a. <EM>a void function</EM>), but without cluttering the output | ||
|  | with <CODE>void</CODE> returned values that GDB will otherwise | ||
|  | print.  If the result is not void, it is printed and saved in the | ||
|  | value history. | ||
|  | </DL> | ||
|  | <P> | ||
|  | 
 | ||
|  | It is possible for the function you call via the <CODE>print</CODE> or | ||
|  | <CODE>call</CODE> command to generate a signal (e.g., if there's a bug in | ||
|  | the function, or if you passed it incorrect arguments).  What happens | ||
|  | in that case is controlled by the <CODE>set unwindonsignal</CODE> command. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <DL COMPACT> | ||
|  | <DT><CODE>set unwindonsignal</CODE> | ||
|  | <DD><A NAME="IDX692"></A> | ||
|  | <A NAME="IDX693"></A> | ||
|  | <A NAME="IDX694"></A> | ||
|  | Set unwinding of the stack if a signal is received while in a function | ||
|  | that GDB called in the program being debugged.  If set to on, | ||
|  | GDB unwinds the stack it created for the call and restores | ||
|  | the context to what it was before the call.  If set to off (the | ||
|  | default), GDB stops in the frame where the signal was | ||
|  | received. | ||
|  | <P> | ||
|  | 
 | ||
|  | <DT><CODE>show unwindonsignal</CODE> | ||
|  | <DD><A NAME="IDX695"></A> | ||
|  | Show the current setting of stack unwinding in the functions called by | ||
|  | GDB. | ||
|  | </DL> | ||
|  | <P> | ||
|  | 
 | ||
|  | <A NAME="IDX696"></A> | ||
|  | Sometimes, a function you wish to call is actually a <EM>weak alias</EM> | ||
|  | for another function.  In such case, GDB might not pick up | ||
|  | the type information, including the types of the function arguments, | ||
|  | which causes GDB to call the inferior function incorrectly. | ||
|  | As a result, the called function will function erroneously and may | ||
|  | even crash.  A solution to that is to use the name of the aliased | ||
|  | function instead. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <A NAME="Patching"></A> | ||
|  | <HR SIZE="6"> | ||
|  | <A NAME="SEC153"></A> | ||
|  | <TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> | ||
|  | <TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC152"> < </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_16.html#SEC154"> > </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC147"> << </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC147"> Up </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_16.html#SEC154"> >> </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD> | ||
|  | </TR></TABLE> | ||
|  | <H2> 14.6 Patching Programs </H2> | ||
|  | <!--docid::SEC153::--> | ||
|  | <P> | ||
|  | 
 | ||
|  | <A NAME="IDX697"></A> | ||
|  | <A NAME="IDX698"></A> | ||
|  | <A NAME="IDX699"></A> | ||
|  | </P><P> | ||
|  | 
 | ||
|  | By default, GDB opens the file containing your program's | ||
|  | executable code (or the corefile) read-only.  This prevents accidental | ||
|  | alterations to machine code; but it also prevents you from intentionally | ||
|  | patching your program's binary. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | If you'd like to be able to patch the binary, you can specify that | ||
|  | explicitly with the <CODE>set write</CODE> command.  For example, you might | ||
|  | want to turn on internal debugging flags, or even to make emergency | ||
|  | repairs. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <DL COMPACT> | ||
|  | <A NAME="IDX700"></A> | ||
|  | <DT><CODE>set write on</CODE> | ||
|  | <DD><DT><CODE>set write off</CODE> | ||
|  | <DD>If you specify <SAMP>`set write on'</SAMP>, GDB opens executable and | ||
|  | core files for both reading and writing; if you specify <SAMP>`set write | ||
|  | off'</SAMP> (the default), GDB opens them read-only. | ||
|  | <P> | ||
|  | 
 | ||
|  | If you have already loaded a file, you must load it again (using the | ||
|  | <CODE>exec-file</CODE> or <CODE>core-file</CODE> command) after changing <CODE>set | ||
|  | write</CODE>, for your new setting to take effect. | ||
|  | </P><P> | ||
|  | 
 | ||
|  | <DT><CODE>show write</CODE> | ||
|  | <DD><A NAME="IDX701"></A> | ||
|  | Display whether executable files and core files are opened for writing | ||
|  | as well as reading. | ||
|  | </DL> | ||
|  | <P> | ||
|  | 
 | ||
|  | <A NAME="GDB Files"></A> | ||
|  | <HR SIZE="6"> | ||
|  | <TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> | ||
|  | <TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_15.html#SEC147"> << </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_16.html#SEC154"> >> </A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">   <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb.html#SEC_Top">Top</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_toc.html#SEC_Contents">Contents</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_38.html#SEC764">Index</A>]</TD> | ||
|  | <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdb_abt.html#SEC_About"> ? </A>]</TD> | ||
|  | </TR></TABLE> | ||
|  | <BR>   | ||
|  | <FONT SIZE="-1"> | ||
|  | 
 | ||
|  | <address> | ||
|  | 
 | ||
|  | <p>Please send FSF & GNU inquiries & questions to <a | ||
|  | href="mailto:gnu@gnu.org">gnu@gnu.org</a>.  There are also <a | ||
|  | href="http://www.gnu.org/home.html#ContactInfo">other ways to | ||
|  | contact</a> the FSF.</p> | ||
|  | 
 | ||
|  | <p>These pages are maintained by <a | ||
|  | href="http://www.gnu.org/software/gdb/">the GDB developers</a>.</p> | ||
|  | 
 | ||
|  | <p>Copyright Free Software Foundation, Inc., 59 Temple Place - Suite | ||
|  | 330, Boston, MA 02111, USA.</p> | ||
|  | 
 | ||
|  | <p>Verbatim copying and distribution of this entire article is | ||
|  | permitted in any medium, provided this notice is preserved.</p> | ||
|  | 
 | ||
|  | </address> | ||
|  | 
 | ||
|  | This document was generated | ||
|  | by <I>GDB Administrator</I> on <I>March, 27  2008</I> | ||
|  | using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html | ||
|  | "><I>texi2html</I></A> | ||
|  | 
 | ||
|  | </BODY> | ||
|  | </HTML> |