| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <html> |
| <!-- Copyright (C) 1988-2015 Free Software Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.3 or |
| any later version published by the Free Software Foundation; with the |
| Invariant Sections being "Free Software" and "Free Software Needs |
| Free Documentation", with the Front-Cover Texts being "A GNU Manual," |
| and with the Back-Cover Texts as in (a) below. |
| |
| (a) The FSF's Back-Cover Text is: "You are free to copy and modify |
| this GNU Manual. Buying copies from GNU Press supports the FSF in |
| developing GNU and promoting software freedom." --> |
| <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ --> |
| <head> |
| <title>Debugging with GDB: Variables</title> |
| |
| <meta name="description" content="Debugging with GDB: Variables"> |
| <meta name="keywords" content="Debugging with GDB: Variables"> |
| <meta name="resource-type" content="document"> |
| <meta name="distribution" content="global"> |
| <meta name="Generator" content="makeinfo"> |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
| <link href="index.html#Top" rel="start" title="Top"> |
| <link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index"> |
| <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents"> |
| <link href="Data.html#Data" rel="up" title="Data"> |
| <link href="Arrays.html#Arrays" rel="next" title="Arrays"> |
| <link href="Ambiguous-Expressions.html#Ambiguous-Expressions" rel="prev" title="Ambiguous Expressions"> |
| <style type="text/css"> |
| <!-- |
| a.summary-letter {text-decoration: none} |
| blockquote.smallquotation {font-size: smaller} |
| div.display {margin-left: 3.2em} |
| div.example {margin-left: 3.2em} |
| div.indentedblock {margin-left: 3.2em} |
| div.lisp {margin-left: 3.2em} |
| div.smalldisplay {margin-left: 3.2em} |
| div.smallexample {margin-left: 3.2em} |
| div.smallindentedblock {margin-left: 3.2em; font-size: smaller} |
| div.smalllisp {margin-left: 3.2em} |
| kbd {font-style:oblique} |
| pre.display {font-family: inherit} |
| pre.format {font-family: inherit} |
| pre.menu-comment {font-family: serif} |
| pre.menu-preformatted {font-family: serif} |
| pre.smalldisplay {font-family: inherit; font-size: smaller} |
| pre.smallexample {font-size: smaller} |
| pre.smallformat {font-family: inherit; font-size: smaller} |
| pre.smalllisp {font-size: smaller} |
| span.nocodebreak {white-space:nowrap} |
| span.nolinebreak {white-space:nowrap} |
| span.roman {font-family:serif; font-weight:normal} |
| span.sansserif {font-family:sans-serif; font-weight:normal} |
| ul.no-bullet {list-style: none} |
| --> |
| </style> |
| |
| |
| </head> |
| |
| <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"> |
| <a name="Variables"></a> |
| <div class="header"> |
| <p> |
| Next: <a href="Arrays.html#Arrays" accesskey="n" rel="next">Arrays</a>, Previous: <a href="Ambiguous-Expressions.html#Ambiguous-Expressions" accesskey="p" rel="prev">Ambiguous Expressions</a>, Up: <a href="Data.html#Data" accesskey="u" rel="up">Data</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p> |
| </div> |
| <hr> |
| <a name="Program-Variables"></a> |
| <h3 class="section">10.3 Program Variables</h3> |
| |
| <p>The most common kind of expression to use is the name of a variable |
| in your program. |
| </p> |
| <p>Variables in expressions are understood in the selected stack frame |
| (see <a href="Selection.html#Selection">Selecting a Frame</a>); they must be either: |
| </p> |
| <ul> |
| <li> global (or file-static) |
| </li></ul> |
| |
| <p>or |
| </p> |
| <ul> |
| <li> visible according to the scope rules of the |
| programming language from the point of execution in that frame |
| </li></ul> |
| |
| <p>This means that in the function |
| </p> |
| <div class="smallexample"> |
| <pre class="smallexample">foo (a) |
| int a; |
| { |
| bar (a); |
| { |
| int b = test (); |
| bar (b); |
| } |
| } |
| </pre></div> |
| |
| <p>you can examine and use the variable <code>a</code> whenever your program is |
| executing within the function <code>foo</code>, but you can only use or |
| examine the variable <code>b</code> while your program is executing inside |
| the block where <code>b</code> is declared. |
| </p> |
| <a name="index-variable-name-conflict"></a> |
| <p>There is an exception: you can refer to a variable or function whose |
| scope is a single source file even if the current execution point is not |
| in this file. But it is possible to have more than one such variable or |
| function with the same name (in different source files). If that |
| happens, referring to that name has unpredictable effects. If you wish, |
| you can specify a static variable in a particular function or file by |
| using the colon-colon (<code>::</code>) notation: |
| </p> |
| <a name="index-colon_002dcolon_002c-context-for-variables_002ffunctions"></a> |
| <a name="index-_003a_003a_002c-context-for-variables_002ffunctions"></a> |
| <div class="smallexample"> |
| <pre class="smallexample"><var>file</var>::<var>variable</var> |
| <var>function</var>::<var>variable</var> |
| </pre></div> |
| |
| <p>Here <var>file</var> or <var>function</var> is the name of the context for the |
| static <var>variable</var>. In the case of file names, you can use quotes to |
| make sure <small>GDB</small> parses the file name as a single word—for example, |
| to print a global value of <code>x</code> defined in <samp>f2.c</samp>: |
| </p> |
| <div class="smallexample"> |
| <pre class="smallexample">(gdb) p 'f2.c'::x |
| </pre></div> |
| |
| <p>The <code>::</code> notation is normally used for referring to |
| static variables, since you typically disambiguate uses of local variables |
| in functions by selecting the appropriate frame and using the |
| simple name of the variable. However, you may also use this notation |
| to refer to local variables in frames enclosing the selected frame: |
| </p> |
| <div class="smallexample"> |
| <pre class="smallexample">void |
| foo (int a) |
| { |
| if (a < 10) |
| bar (a); |
| else |
| process (a); /* Stop here */ |
| } |
| |
| int |
| bar (int a) |
| { |
| foo (a + 5); |
| } |
| </pre></div> |
| |
| <p>For example, if there is a breakpoint at the commented line, |
| here is what you might see |
| when the program stops after executing the call <code>bar(0)</code>: |
| </p> |
| <div class="smallexample"> |
| <pre class="smallexample">(gdb) p a |
| $1 = 10 |
| (gdb) p bar::a |
| $2 = 5 |
| (gdb) up 2 |
| #2 0x080483d0 in foo (a=5) at foobar.c:12 |
| (gdb) p a |
| $3 = 5 |
| (gdb) p bar::a |
| $4 = 0 |
| </pre></div> |
| |
| <a name="index-C_002b_002b-scope-resolution"></a> |
| <p>These uses of ‘<samp>::</samp>’ are very rarely in conflict with the very |
| similar use of the same notation in C<tt>++</tt>. When they are in |
| conflict, the C<tt>++</tt> meaning takes precedence; however, this can be |
| overridden by quoting the file or function name with single quotes. |
| </p> |
| <p>For example, suppose the program is stopped in a method of a class |
| that has a field named <code>includefile</code>, and there is also an |
| include file named <samp>includefile</samp> that defines a variable, |
| <code>some_global</code>. |
| </p> |
| <div class="smallexample"> |
| <pre class="smallexample">(gdb) p includefile |
| $1 = 23 |
| (gdb) p includefile::some_global |
| A syntax error in expression, near `'. |
| (gdb) p 'includefile'::some_global |
| $2 = 27 |
| </pre></div> |
| |
| <a name="index-wrong-values"></a> |
| <a name="index-variable-values_002c-wrong"></a> |
| <a name="index-function-entry_002fexit_002c-wrong-values-of-variables"></a> |
| <a name="index-optimized-code_002c-wrong-values-of-variables"></a> |
| <blockquote> |
| <p><em>Warning:</em> Occasionally, a local variable may appear to have the |
| wrong value at certain points in a function—just after entry to a new |
| scope, and just before exit. |
| </p></blockquote> |
| <p>You may see this problem when you are stepping by machine instructions. |
| This is because, on most machines, it takes more than one instruction to |
| set up a stack frame (including local variable definitions); if you are |
| stepping by machine instructions, variables may appear to have the wrong |
| values until the stack frame is completely built. On exit, it usually |
| also takes more than one machine instruction to destroy a stack frame; |
| after you begin stepping through that group of instructions, local |
| variable definitions may be gone. |
| </p> |
| <p>This may also happen when the compiler does significant optimizations. |
| To be sure of always seeing accurate values, turn off all optimization |
| when compiling. |
| </p> |
| <a name="index-_0060_0060No-symbol-_0022foo_0022-in-current-context_0027_0027"></a> |
| <p>Another possible effect of compiler optimizations is to optimize |
| unused variables out of existence, or assign variables to registers (as |
| opposed to memory addresses). Depending on the support for such cases |
| offered by the debug info format used by the compiler, <small>GDB</small> |
| might not be able to display values for such local variables. If that |
| happens, <small>GDB</small> will print a message like this: |
| </p> |
| <div class="smallexample"> |
| <pre class="smallexample">No symbol "foo" in current context. |
| </pre></div> |
| |
| <p>To solve such problems, either recompile without optimizations, or use a |
| different debug info format, if the compiler supports several such |
| formats. See <a href="Compilation.html#Compilation">Compilation</a>, for more information on choosing compiler |
| options. See <a href="C.html#C">C and C<tt>++</tt></a>, for more information about debug |
| info formats that are best suited to C<tt>++</tt> programs. |
| </p> |
| <p>If you ask to print an object whose contents are unknown to |
| <small>GDB</small>, e.g., because its data type is not completely specified |
| by the debug information, <small>GDB</small> will say ‘<samp><incomplete |
| type></samp>’. See <a href="Symbols.html#Symbols">incomplete type</a>, for more about this. |
| </p> |
| <p>If you append <kbd>@entry</kbd> string to a function parameter name you get its |
| value at the time the function got called. If the value is not available an |
| error message is printed. Entry values are available only with some compilers. |
| Entry values are normally also printed at the function parameter list according |
| to <a href="Print-Settings.html#set-print-entry_002dvalues">set print entry-values</a>. |
| </p> |
| <div class="smallexample"> |
| <pre class="smallexample">Breakpoint 1, d (i=30) at gdb.base/entry-value.c:29 |
| 29 i++; |
| (gdb) next |
| 30 e (i); |
| (gdb) print i |
| $1 = 31 |
| (gdb) print i@entry |
| $2 = 30 |
| </pre></div> |
| |
| <p>Strings are identified as arrays of <code>char</code> values without specified |
| signedness. Arrays of either <code>signed char</code> or <code>unsigned char</code> get |
| printed as arrays of 1 byte sized integers. <code>-fsigned-char</code> or |
| <code>-funsigned-char</code> <small>GCC</small> options have no effect as <small>GDB</small> |
| defines literal string type <code>"char"</code> as <code>char</code> without a sign. |
| For program code |
| </p> |
| <div class="smallexample"> |
| <pre class="smallexample">char var0[] = "A"; |
| signed char var1[] = "A"; |
| </pre></div> |
| |
| <p>You get during debugging |
| </p><div class="smallexample"> |
| <pre class="smallexample">(gdb) print var0 |
| $1 = "A" |
| (gdb) print var1 |
| $2 = {65 'A', 0 '\0'} |
| </pre></div> |
| |
| <hr> |
| <div class="header"> |
| <p> |
| Next: <a href="Arrays.html#Arrays" accesskey="n" rel="next">Arrays</a>, Previous: <a href="Ambiguous-Expressions.html#Ambiguous-Expressions" accesskey="p" rel="prev">Ambiguous Expressions</a>, Up: <a href="Data.html#Data" accesskey="u" rel="up">Data</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p> |
| </div> |
| |
| |
| |
| </body> |
| </html> |