toolchain/share/doc/gdb/GDB_002fMI-Variable-Objects...

784 lines
38 KiB
HTML
Raw Permalink Normal View History

2024-01-10 05:24:32 +00:00
<html lang="en">
<head>
<title>GDB/MI Variable Objects - Debugging with GDB</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="Debugging with GDB">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="GDB_002fMI.html#GDB_002fMI" title="GDB/MI">
<link rel="prev" href="GDB_002fMI-Stack-Manipulation.html#GDB_002fMI-Stack-Manipulation" title="GDB/MI Stack Manipulation">
<link rel="next" href="GDB_002fMI-Data-Manipulation.html#GDB_002fMI-Data-Manipulation" title="GDB/MI Data Manipulation">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
Copyright (C) 1988-2019 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.''
-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
</head>
<body>
<div class="node">
<a name="GDB%2fMI-Variable-Objects"></a>
<a name="GDB_002fMI-Variable-Objects"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="GDB_002fMI-Data-Manipulation.html#GDB_002fMI-Data-Manipulation">GDB/MI Data Manipulation</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="GDB_002fMI-Stack-Manipulation.html#GDB_002fMI-Stack-Manipulation">GDB/MI Stack Manipulation</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="GDB_002fMI.html#GDB_002fMI">GDB/MI</a>
<hr>
</div>
<h3 class="section">27.15 <span class="sc">gdb/mi</span> Variable Objects</h3>
<h4 class="subheading">Introduction to Variable Objects</h4>
<p><a name="index-variable-objects-in-_0040sc_007bgdb_002fmi_007d-3027"></a>
Variable objects are "object-oriented" MI interface for examining and
changing values of expressions. Unlike some other MI interfaces that
work with expressions, variable objects are specifically designed for
simple and efficient presentation in the frontend. A variable object
is identified by string name. When a variable object is created, the
frontend specifies the expression for that variable object. The
expression can be a simple variable, or it can be an arbitrary complex
expression, and can even involve CPU registers. After creating a
variable object, the frontend can invoke other variable object
operations&mdash;for example to obtain or change the value of a variable
object, or to change display format.
<p>Variable objects have hierarchical tree structure. Any variable object
that corresponds to a composite type, such as structure in C, has
a number of child variable objects, for example corresponding to each
element of a structure. A child variable object can itself have
children, recursively. Recursion ends when we reach
leaf variable objects, which always have built-in types. Child variable
objects are created only by explicit request, so if a frontend
is not interested in the children of a particular variable object, no
child will be created.
<p>For a leaf variable object it is possible to obtain its value as a
string, or set the value from a string. String value can be also
obtained for a non-leaf variable object, but it's generally a string
that only indicates the type of the object, and does not list its
contents. Assignment to a non-leaf variable object is not allowed.
<p>A frontend does not need to read the values of all variable objects each time
the program stops. Instead, MI provides an update command that lists all
variable objects whose values has changed since the last update
operation. This considerably reduces the amount of data that must
be transferred to the frontend. As noted above, children variable
objects are created on demand, and only leaf variable objects have a
real value. As result, gdb will read target memory only for leaf
variables that frontend has created.
<p>The automatic update is not always desirable. For example, a frontend
might want to keep a value of some expression for future reference,
and never update it. For another example, fetching memory is
relatively slow for embedded targets, so a frontend might want
to disable automatic update for the variables that are either not
visible on the screen, or &ldquo;closed&rdquo;. This is possible using so
called &ldquo;frozen variable objects&rdquo;. Such variable objects are never
implicitly updated.
<p>Variable objects can be either <dfn>fixed</dfn> or <dfn>floating</dfn>. For the
fixed variable object, the expression is parsed when the variable
object is created, including associating identifiers to specific
variables. The meaning of expression never changes. For a floating
variable object the values of variables whose names appear in the
expressions are re-evaluated every time in the context of the current
frame. Consider this example:
<pre class="smallexample"> void do_work(...)
{
struct work_state state;
if (...)
do_work(...);
}
</pre>
<p>If a fixed variable object for the <code>state</code> variable is created in
this function, and we enter the recursive call, the variable
object will report the value of <code>state</code> in the top-level
<code>do_work</code> invocation. On the other hand, a floating variable
object will report the value of <code>state</code> in the current frame.
<p>If an expression specified when creating a fixed variable object
refers to a local variable, the variable object becomes bound to the
thread and frame in which the variable object is created. When such
variable object is updated, <span class="sc">gdb</span> makes sure that the
thread/frame combination the variable object is bound to still exists,
and re-evaluates the variable object in context of that thread/frame.
<p>The following is the complete set of <span class="sc">gdb/mi</span> operations defined to
access this functionality:
<p><table summary=""><tr align="left"><td valign="top" width="40%"><strong>Operation</strong>
</td><td valign="top" width="60%"><strong>Description</strong>
<p><br></td></tr><tr align="left"><td valign="top" width="40%"><code>-enable-pretty-printing</code>
</td><td valign="top" width="60%">enable Python-based pretty-printing
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-create</code>
</td><td valign="top" width="60%">create a variable object
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-delete</code>
</td><td valign="top" width="60%">delete the variable object and/or its children
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-set-format</code>
</td><td valign="top" width="60%">set the display format of this variable
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-show-format</code>
</td><td valign="top" width="60%">show the display format of this variable
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-info-num-children</code>
</td><td valign="top" width="60%">tells how many children this object has
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-list-children</code>
</td><td valign="top" width="60%">return a list of the object's children
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-info-type</code>
</td><td valign="top" width="60%">show the type of this variable object
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-info-expression</code>
</td><td valign="top" width="60%">print parent-relative expression that this variable object represents
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-info-path-expression</code>
</td><td valign="top" width="60%">print full expression that this variable object represents
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-show-attributes</code>
</td><td valign="top" width="60%">is this variable editable? does it exist here?
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-evaluate-expression</code>
</td><td valign="top" width="60%">get the value of this variable
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-assign</code>
</td><td valign="top" width="60%">set the value of this variable
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-update</code>
</td><td valign="top" width="60%">update the variable and its children
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-set-frozen</code>
</td><td valign="top" width="60%">set frozeness attribute
<br></td></tr><tr align="left"><td valign="top" width="40%"><code>-var-set-update-range</code>
</td><td valign="top" width="60%">set range of children to display on update
<br></td></tr></table>
<p>In the next subsection we describe each operation in detail and suggest
how it can be used.
<h4 class="subheading">Description And Use of Operations on Variable Objects</h4>
<h4 class="subheading">The <code>-enable-pretty-printing</code> Command</h4>
<p><a name="index-g_t_002denable_002dpretty_002dprinting-3028"></a>
<pre class="smallexample"> -enable-pretty-printing
</pre>
<p><span class="sc">gdb</span> allows Python-based visualizers to affect the output of the
MI variable object commands. However, because there was no way to
implement this in a fully backward-compatible way, a front end must
request that this functionality be enabled.
<p>Once enabled, this feature cannot be disabled.
<p>Note that if Python support has not been compiled into <span class="sc">gdb</span>,
this command will still succeed (and do nothing).
<p>This feature is currently (as of <span class="sc">gdb</span> 7.0) experimental, and
may work differently in future versions of <span class="sc">gdb</span>.
<h4 class="subheading">The <code>-var-create</code> Command</h4>
<p><a name="index-g_t_002dvar_002dcreate-3029"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-create {<var>name</var> | "-"}
{<var>frame-addr</var> | "*" | "@"} <var>expression</var>
</pre>
<p>This operation creates a variable object, which allows the monitoring of
a variable, the result of an expression, a memory cell or a CPU
register.
<p>The <var>name</var> parameter is the string by which the object can be
referenced. It must be unique. If &lsquo;<samp><span class="samp">-</span></samp>&rsquo; is specified, the varobj
system will generate a string &ldquo;varNNNNNN&rdquo; automatically. It will be
unique provided that one does not specify <var>name</var> of that format.
The command fails if a duplicate name is found.
<p>The frame under which the expression should be evaluated can be
specified by <var>frame-addr</var>. A &lsquo;<samp><span class="samp">*</span></samp>&rsquo; indicates that the current
frame should be used. A &lsquo;<samp><span class="samp">@</span></samp>&rsquo; indicates that a floating variable
object must be created.
<p><var>expression</var> is any expression valid on the current language set (must not
begin with a &lsquo;<samp><span class="samp">*</span></samp>&rsquo;), or one of the following:
<ul>
<li>&lsquo;<samp><span class="samp">*</span><var>addr</var></samp>&rsquo;, where <var>addr</var> is the address of a memory cell
<li>&lsquo;<samp><span class="samp">*</span><var>addr</var><span class="samp">-</span><var>addr</var></samp>&rsquo; &mdash; a memory address range (TBD)
<li>&lsquo;<samp><span class="samp">$</span><var>regname</var></samp>&rsquo; &mdash; a CPU register name
</ul>
<p><a name="index-dynamic-varobj-3030"></a>A varobj's contents may be provided by a Python-based pretty-printer. In this
case the varobj is known as a <dfn>dynamic varobj</dfn>. Dynamic varobjs
have slightly different semantics in some cases. If the
<code>-enable-pretty-printing</code> command is not sent, then <span class="sc">gdb</span>
will never create a dynamic varobj. This ensures backward
compatibility for existing clients.
<h5 class="subsubheading">Result</h5>
<p>This operation returns attributes of the newly-created varobj. These
are:
<dl>
<dt>&lsquo;<samp><span class="samp">name</span></samp>&rsquo;<dd>The name of the varobj.
<br><dt>&lsquo;<samp><span class="samp">numchild</span></samp>&rsquo;<dd>The number of children of the varobj. This number is not necessarily
reliable for a dynamic varobj. Instead, you must examine the
&lsquo;<samp><span class="samp">has_more</span></samp>&rsquo; attribute.
<br><dt>&lsquo;<samp><span class="samp">value</span></samp>&rsquo;<dd>The varobj's scalar value. For a varobj whose type is some sort of
aggregate (e.g., a <code>struct</code>), or for a dynamic varobj, this value
will not be interesting.
<br><dt>&lsquo;<samp><span class="samp">type</span></samp>&rsquo;<dd>The varobj's type. This is a string representation of the type, as
would be printed by the <span class="sc">gdb</span> CLI. If &lsquo;<samp><span class="samp">print object</span></samp>&rsquo;
(see <a href="Print-Settings.html#Print-Settings">set print object</a>) is set to <code>on</code>, the
<em>actual</em> (derived) type of the object is shown rather than the
<em>declared</em> one.
<br><dt>&lsquo;<samp><span class="samp">thread-id</span></samp>&rsquo;<dd>If a variable object is bound to a specific thread, then this is the
thread's global identifier.
<br><dt>&lsquo;<samp><span class="samp">has_more</span></samp>&rsquo;<dd>For a dynamic varobj, this indicates whether there appear to be any
children available. For a non-dynamic varobj, this will be 0.
<br><dt>&lsquo;<samp><span class="samp">dynamic</span></samp>&rsquo;<dd>This attribute will be present and have the value &lsquo;<samp><span class="samp">1</span></samp>&rsquo; if the
varobj is a dynamic varobj. If the varobj is not a dynamic varobj,
then this attribute will not be present.
<br><dt>&lsquo;<samp><span class="samp">displayhint</span></samp>&rsquo;<dd>A dynamic varobj can supply a display hint to the front end. The
value comes directly from the Python pretty-printer object's
<code>display_hint</code> method. See <a href="Pretty-Printing-API.html#Pretty-Printing-API">Pretty Printing API</a>.
</dl>
<p>Typical output will look like this:
<pre class="smallexample"> name="<var>name</var>",numchild="<var>N</var>",type="<var>type</var>",thread-id="<var>M</var>",
has_more="<var>has_more</var>"
</pre>
<h4 class="subheading">The <code>-var-delete</code> Command</h4>
<p><a name="index-g_t_002dvar_002ddelete-3031"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-delete [ -c ] <var>name</var>
</pre>
<p>Deletes a previously created variable object and all of its children.
With the &lsquo;<samp><span class="samp">-c</span></samp>&rsquo; option, just deletes the children.
<p>Returns an error if the object <var>name</var> is not found.
<h4 class="subheading">The <code>-var-set-format</code> Command</h4>
<p><a name="index-g_t_002dvar_002dset_002dformat-3032"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-set-format <var>name</var> <var>format-spec</var>
</pre>
<p>Sets the output format for the value of the object <var>name</var> to be
<var>format-spec</var>.
<p><a name="g_t_002dvar_002dset_002dformat"></a>The syntax for the <var>format-spec</var> is as follows:
<pre class="smallexample"> <var>format-spec</var> ==&gt;
{binary | decimal | hexadecimal | octal | natural | zero-hexadecimal}
</pre>
<p>The natural format is the default format choosen automatically
based on the variable type (like decimal for an <code>int</code>, hex
for pointers, etc.).
<p>The zero-hexadecimal format has a representation similar to hexadecimal
but with padding zeroes to the left of the value. For example, a 32-bit
hexadecimal value of 0x1234 would be represented as 0x00001234 in the
zero-hexadecimal format.
<p>For a variable with children, the format is set only on the
variable itself, and the children are not affected.
<h4 class="subheading">The <code>-var-show-format</code> Command</h4>
<p><a name="index-g_t_002dvar_002dshow_002dformat-3033"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-show-format <var>name</var>
</pre>
<p>Returns the format used to display the value of the object <var>name</var>.
<pre class="smallexample"> <var>format</var> ==&gt;
<var>format-spec</var>
</pre>
<h4 class="subheading">The <code>-var-info-num-children</code> Command</h4>
<p><a name="index-g_t_002dvar_002dinfo_002dnum_002dchildren-3034"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-info-num-children <var>name</var>
</pre>
<p>Returns the number of children of a variable object <var>name</var>:
<pre class="smallexample"> numchild=<var>n</var>
</pre>
<p>Note that this number is not completely reliable for a dynamic varobj.
It will return the current number of children, but more children may
be available.
<h4 class="subheading">The <code>-var-list-children</code> Command</h4>
<p><a name="index-g_t_002dvar_002dlist_002dchildren-3035"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-list-children [<var>print-values</var>] <var>name</var> [<var>from</var> <var>to</var>]
</pre>
<p><a name="g_t_002dvar_002dlist_002dchildren"></a>Return a list of the children of the specified variable object and
create variable objects for them, if they do not already exist. With
a single argument or if <var>print-values</var> has a value of 0 or
<code>--no-values</code>, print only the names of the variables; if
<var>print-values</var> is 1 or <code>--all-values</code>, also print their
values; and if it is 2 or <code>--simple-values</code> print the name and
value for simple data types and just the name for arrays, structures
and unions.
<p><var>from</var> and <var>to</var>, if specified, indicate the range of children
to report. If <var>from</var> or <var>to</var> is less than zero, the range is
reset and all children will be reported. Otherwise, children starting
at <var>from</var> (zero-based) and up to and excluding <var>to</var> will be
reported.
<p>If a child range is requested, it will only affect the current call to
<code>-var-list-children</code>, but not future calls to <code>-var-update</code>.
For this, you must instead use <code>-var-set-update-range</code>. The
intent of this approach is to enable a front end to implement any
update approach it likes; for example, scrolling a view may cause the
front end to request more children with <code>-var-list-children</code>, and
then the front end could call <code>-var-set-update-range</code> with a
different range to ensure that future updates are restricted to just
the visible items.
<p>For each child the following results are returned:
<dl>
<dt><var>name</var><dd>Name of the variable object created for this child.
<br><dt><var>exp</var><dd>The expression to be shown to the user by the front end to designate this child.
For example this may be the name of a structure member.
<p>For a dynamic varobj, this value cannot be used to form an
expression. There is no way to do this at all with a dynamic varobj.
<p>For C/C<tt>++</tt> structures there are several pseudo children returned to
designate access qualifiers. For these pseudo children <var>exp</var> is
&lsquo;<samp><span class="samp">public</span></samp>&rsquo;, &lsquo;<samp><span class="samp">private</span></samp>&rsquo;, or &lsquo;<samp><span class="samp">protected</span></samp>&rsquo;. In this case the
type and value are not present.
<p>A dynamic varobj will not report the access qualifying
pseudo-children, regardless of the language. This information is not
available at all with a dynamic varobj.
<br><dt><var>numchild</var><dd>Number of children this child has. For a dynamic varobj, this will be
0.
<br><dt><var>type</var><dd>The type of the child. If &lsquo;<samp><span class="samp">print object</span></samp>&rsquo;
(see <a href="Print-Settings.html#Print-Settings">set print object</a>) is set to <code>on</code>, the
<em>actual</em> (derived) type of the object is shown rather than the
<em>declared</em> one.
<br><dt><var>value</var><dd>If values were requested, this is the value.
<br><dt><var>thread-id</var><dd>If this variable object is associated with a thread, this is the
thread's global thread id. Otherwise this result is not present.
<br><dt><var>frozen</var><dd>If the variable object is frozen, this variable will be present with a value of 1.
<br><dt><var>displayhint</var><dd>A dynamic varobj can supply a display hint to the front end. The
value comes directly from the Python pretty-printer object's
<code>display_hint</code> method. See <a href="Pretty-Printing-API.html#Pretty-Printing-API">Pretty Printing API</a>.
<br><dt><var>dynamic</var><dd>This attribute will be present and have the value &lsquo;<samp><span class="samp">1</span></samp>&rsquo; if the
varobj is a dynamic varobj. If the varobj is not a dynamic varobj,
then this attribute will not be present.
</dl>
<p>The result may have its own attributes:
<dl>
<dt>&lsquo;<samp><span class="samp">displayhint</span></samp>&rsquo;<dd>A dynamic varobj can supply a display hint to the front end. The
value comes directly from the Python pretty-printer object's
<code>display_hint</code> method. See <a href="Pretty-Printing-API.html#Pretty-Printing-API">Pretty Printing API</a>.
<br><dt>&lsquo;<samp><span class="samp">has_more</span></samp>&rsquo;<dd>This is an integer attribute which is nonzero if there are children
remaining after the end of the selected range.
</dl>
<h5 class="subsubheading">Example</h5>
<pre class="smallexample"> (gdb)
-var-list-children n
^done,numchild=<var>n</var>,children=[child={name=<var>name</var>,exp=<var>exp</var>,
numchild=<var>n</var>,type=<var>type</var>},<span class="roman">(repeats N times)</span>]
(gdb)
-var-list-children --all-values n
^done,numchild=<var>n</var>,children=[child={name=<var>name</var>,exp=<var>exp</var>,
numchild=<var>n</var>,value=<var>value</var>,type=<var>type</var>},<span class="roman">(repeats N times)</span>]
</pre>
<h4 class="subheading">The <code>-var-info-type</code> Command</h4>
<p><a name="index-g_t_002dvar_002dinfo_002dtype-3036"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-info-type <var>name</var>
</pre>
<p>Returns the type of the specified variable <var>name</var>. The type is
returned as a string in the same format as it is output by the
<span class="sc">gdb</span> CLI:
<pre class="smallexample"> type=<var>typename</var>
</pre>
<h4 class="subheading">The <code>-var-info-expression</code> Command</h4>
<p><a name="index-g_t_002dvar_002dinfo_002dexpression-3037"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-info-expression <var>name</var>
</pre>
<p>Returns a string that is suitable for presenting this
variable object in user interface. The string is generally
not valid expression in the current language, and cannot be evaluated.
<p>For example, if <code>a</code> is an array, and variable object
<code>A</code> was created for <code>a</code>, then we'll get this output:
<pre class="smallexample"> (gdb) -var-info-expression A.1
^done,lang="C",exp="1"
</pre>
<p class="noindent">Here, the value of <code>lang</code> is the language name, which can be
found in <a href="Supported-Languages.html#Supported-Languages">Supported Languages</a>.
<p>Note that the output of the <code>-var-list-children</code> command also
includes those expressions, so the <code>-var-info-expression</code> command
is of limited use.
<h4 class="subheading">The <code>-var-info-path-expression</code> Command</h4>
<p><a name="index-g_t_002dvar_002dinfo_002dpath_002dexpression-3038"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-info-path-expression <var>name</var>
</pre>
<p>Returns an expression that can be evaluated in the current
context and will yield the same value that a variable object has.
Compare this with the <code>-var-info-expression</code> command, which
result can be used only for UI presentation. Typical use of
the <code>-var-info-path-expression</code> command is creating a
watchpoint from a variable object.
<p>This command is currently not valid for children of a dynamic varobj,
and will give an error when invoked on one.
<p>For example, suppose <code>C</code> is a C<tt>++</tt> class, derived from class
<code>Base</code>, and that the <code>Base</code> class has a member called
<code>m_size</code>. Assume a variable <code>c</code> is has the type of
<code>C</code> and a variable object <code>C</code> was created for variable
<code>c</code>. Then, we'll get this output:
<pre class="smallexample"> (gdb) -var-info-path-expression C.Base.public.m_size
^done,path_expr=((Base)c).m_size)
</pre>
<h4 class="subheading">The <code>-var-show-attributes</code> Command</h4>
<p><a name="index-g_t_002dvar_002dshow_002dattributes-3039"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-show-attributes <var>name</var>
</pre>
<p>List attributes of the specified variable object <var>name</var>:
<pre class="smallexample"> status=<var>attr</var> [ ( ,<var>attr</var> )* ]
</pre>
<p class="noindent">where <var>attr</var> is <code>{ { editable | noneditable } | TBD }</code>.
<h4 class="subheading">The <code>-var-evaluate-expression</code> Command</h4>
<p><a name="index-g_t_002dvar_002devaluate_002dexpression-3040"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-evaluate-expression [-f <var>format-spec</var>] <var>name</var>
</pre>
<p>Evaluates the expression that is represented by the specified variable
object and returns its value as a string. The format of the string
can be specified with the &lsquo;<samp><span class="samp">-f</span></samp>&rsquo; option. The possible values of
this option are the same as for <code>-var-set-format</code>
(see <a href="_002dvar_002dset_002dformat.html#g_t_002dvar_002dset_002dformat">-var-set-format</a>). If the &lsquo;<samp><span class="samp">-f</span></samp>&rsquo; option is not specified,
the current display format will be used. The current display format
can be changed using the <code>-var-set-format</code> command.
<pre class="smallexample"> value=<var>value</var>
</pre>
<p>Note that one must invoke <code>-var-list-children</code> for a variable
before the value of a child variable can be evaluated.
<h4 class="subheading">The <code>-var-assign</code> Command</h4>
<p><a name="index-g_t_002dvar_002dassign-3041"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-assign <var>name</var> <var>expression</var>
</pre>
<p>Assigns the value of <var>expression</var> to the variable object specified
by <var>name</var>. The object must be &lsquo;<samp><span class="samp">editable</span></samp>&rsquo;. If the variable's
value is altered by the assign, the variable will show up in any
subsequent <code>-var-update</code> list.
<h5 class="subsubheading">Example</h5>
<pre class="smallexample"> (gdb)
-var-assign var1 3
^done,value="3"
(gdb)
-var-update *
^done,changelist=[{name="var1",in_scope="true",type_changed="false"}]
(gdb)
</pre>
<h4 class="subheading">The <code>-var-update</code> Command</h4>
<p><a name="index-g_t_002dvar_002dupdate-3042"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-update [<var>print-values</var>] {<var>name</var> | "*"}
</pre>
<p>Reevaluate the expressions corresponding to the variable object
<var>name</var> and all its direct and indirect children, and return the
list of variable objects whose values have changed; <var>name</var> must
be a root variable object. Here, &ldquo;changed&rdquo; means that the result of
<code>-var-evaluate-expression</code> before and after the
<code>-var-update</code> is different. If &lsquo;<samp><span class="samp">*</span></samp>&rsquo; is used as the variable
object names, all existing variable objects are updated, except
for frozen ones (see <a href="_002dvar_002dset_002dfrozen.html#g_t_002dvar_002dset_002dfrozen">-var-set-frozen</a>). The option
<var>print-values</var> determines whether both names and values, or just
names are printed. The possible values of this option are the same
as for <code>-var-list-children</code> (see <a href="_002dvar_002dlist_002dchildren.html#g_t_002dvar_002dlist_002dchildren">-var-list-children</a>). It is
recommended to use the &lsquo;<samp><span class="samp">--all-values</span></samp>&rsquo; option, to reduce the
number of MI commands needed on each program stop.
<p>With the &lsquo;<samp><span class="samp">*</span></samp>&rsquo; parameter, if a variable object is bound to a
currently running thread, it will not be updated, without any
diagnostic.
<p>If <code>-var-set-update-range</code> was previously used on a varobj, then
only the selected range of children will be reported.
<p><code>-var-update</code> reports all the changed varobjs in a tuple named
&lsquo;<samp><span class="samp">changelist</span></samp>&rsquo;.
<p>Each item in the change list is itself a tuple holding:
<dl>
<dt>&lsquo;<samp><span class="samp">name</span></samp>&rsquo;<dd>The name of the varobj.
<br><dt>&lsquo;<samp><span class="samp">value</span></samp>&rsquo;<dd>If values were requested for this update, then this field will be
present and will hold the value of the varobj.
<br><dt>&lsquo;<samp><span class="samp">in_scope</span></samp>&rsquo;<dd><a name="g_t_002dvar_002dupdate"></a>This field is a string which may take one of three values:
<dl>
<dt><code>"true"</code><dd>The variable object's current value is valid.
<br><dt><code>"false"</code><dd>The variable object does not currently hold a valid value but it may
hold one in the future if its associated expression comes back into
scope.
<br><dt><code>"invalid"</code><dd>The variable object no longer holds a valid value.
This can occur when the executable file being debugged has changed,
either through recompilation or by using the <span class="sc">gdb</span> <code>file</code>
command. The front end should normally choose to delete these variable
objects.
</dl>
<p>In the future new values may be added to this list so the front should
be prepared for this possibility. See <a href="GDB_002fMI-Development-and-Front-Ends.html#GDB_002fMI-Development-and-Front-Ends"><span class="sc">GDB/MI</span> Development and Front Ends</a>.
<br><dt>&lsquo;<samp><span class="samp">type_changed</span></samp>&rsquo;<dd>This is only present if the varobj is still valid. If the type
changed, then this will be the string &lsquo;<samp><span class="samp">true</span></samp>&rsquo;; otherwise it will
be &lsquo;<samp><span class="samp">false</span></samp>&rsquo;.
<p>When a varobj's type changes, its children are also likely to have
become incorrect. Therefore, the varobj's children are automatically
deleted when this attribute is &lsquo;<samp><span class="samp">true</span></samp>&rsquo;. Also, the varobj's update
range, when set using the <code>-var-set-update-range</code> command, is
unset.
<br><dt>&lsquo;<samp><span class="samp">new_type</span></samp>&rsquo;<dd>If the varobj's type changed, then this field will be present and will
hold the new type.
<br><dt>&lsquo;<samp><span class="samp">new_num_children</span></samp>&rsquo;<dd>For a dynamic varobj, if the number of children changed, or if the
type changed, this will be the new number of children.
<p>The &lsquo;<samp><span class="samp">numchild</span></samp>&rsquo; field in other varobj responses is generally not
valid for a dynamic varobj &ndash; it will show the number of children that
<span class="sc">gdb</span> knows about, but because dynamic varobjs lazily
instantiate their children, this will not reflect the number of
children which may be available.
<p>The &lsquo;<samp><span class="samp">new_num_children</span></samp>&rsquo; attribute only reports changes to the
number of children known by <span class="sc">gdb</span>. This is the only way to
detect whether an update has removed children (which necessarily can
only happen at the end of the update range).
<br><dt>&lsquo;<samp><span class="samp">displayhint</span></samp>&rsquo;<dd>The display hint, if any.
<br><dt>&lsquo;<samp><span class="samp">has_more</span></samp>&rsquo;<dd>This is an integer value, which will be 1 if there are more children
available outside the varobj's update range.
<br><dt>&lsquo;<samp><span class="samp">dynamic</span></samp>&rsquo;<dd>This attribute will be present and have the value &lsquo;<samp><span class="samp">1</span></samp>&rsquo; if the
varobj is a dynamic varobj. If the varobj is not a dynamic varobj,
then this attribute will not be present.
<br><dt>&lsquo;<samp><span class="samp">new_children</span></samp>&rsquo;<dd>If new children were added to a dynamic varobj within the selected
update range (as set by <code>-var-set-update-range</code>), then they will
be listed in this attribute.
</dl>
<h5 class="subsubheading">Example</h5>
<pre class="smallexample"> (gdb)
-var-assign var1 3
^done,value="3"
(gdb)
-var-update --all-values var1
^done,changelist=[{name="var1",value="3",in_scope="true",
type_changed="false"}]
(gdb)
</pre>
<h4 class="subheading">The <code>-var-set-frozen</code> Command</h4>
<p><a name="index-g_t_002dvar_002dset_002dfrozen-3043"></a><a name="g_t_002dvar_002dset_002dfrozen"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-set-frozen <var>name</var> <var>flag</var>
</pre>
<p>Set the frozenness flag on the variable object <var>name</var>. The
<var>flag</var> parameter should be either &lsquo;<samp><span class="samp">1</span></samp>&rsquo; to make the variable
frozen or &lsquo;<samp><span class="samp">0</span></samp>&rsquo; to make it unfrozen. If a variable object is
frozen, then neither itself, nor any of its children, are
implicitly updated by <code>-var-update</code> of
a parent variable or by <code>-var-update *</code>. Only
<code>-var-update</code> of the variable itself will update its value and
values of its children. After a variable object is unfrozen, it is
implicitly updated by all subsequent <code>-var-update</code> operations.
Unfreezing a variable does not update it, only subsequent
<code>-var-update</code> does.
<h5 class="subsubheading">Example</h5>
<pre class="smallexample"> (gdb)
-var-set-frozen V 1
^done
(gdb)
</pre>
<h4 class="subheading">The <code>-var-set-update-range</code> command</h4>
<p><a name="index-g_t_002dvar_002dset_002dupdate_002drange-3044"></a><a name="g_t_002dvar_002dset_002dupdate_002drange"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-set-update-range <var>name</var> <var>from</var> <var>to</var>
</pre>
<p>Set the range of children to be returned by future invocations of
<code>-var-update</code>.
<p><var>from</var> and <var>to</var> indicate the range of children to report. If
<var>from</var> or <var>to</var> is less than zero, the range is reset and all
children will be reported. Otherwise, children starting at <var>from</var>
(zero-based) and up to and excluding <var>to</var> will be reported.
<h5 class="subsubheading">Example</h5>
<pre class="smallexample"> (gdb)
-var-set-update-range V 1 2
^done
</pre>
<h4 class="subheading">The <code>-var-set-visualizer</code> command</h4>
<p><a name="index-g_t_002dvar_002dset_002dvisualizer-3045"></a><a name="g_t_002dvar_002dset_002dvisualizer"></a>
<h5 class="subsubheading">Synopsis</h5>
<pre class="smallexample"> -var-set-visualizer <var>name</var> <var>visualizer</var>
</pre>
<p>Set a visualizer for the variable object <var>name</var>.
<p><var>visualizer</var> is the visualizer to use. The special value
&lsquo;<samp><span class="samp">None</span></samp>&rsquo; means to disable any visualizer in use.
<p>If not &lsquo;<samp><span class="samp">None</span></samp>&rsquo;, <var>visualizer</var> must be a Python expression.
This expression must evaluate to a callable object which accepts a
single argument. <span class="sc">gdb</span> will call this object with the value of
the varobj <var>name</var> as an argument (this is done so that the same
Python pretty-printing code can be used for both the CLI and MI).
When called, this object must return an object which conforms to the
pretty-printing interface (see <a href="Pretty-Printing-API.html#Pretty-Printing-API">Pretty Printing API</a>).
<p>The pre-defined function <code>gdb.default_visualizer</code> may be used to
select a visualizer by following the built-in process
(see <a href="Selecting-Pretty_002dPrinters.html#Selecting-Pretty_002dPrinters">Selecting Pretty-Printers</a>). This is done automatically when
a varobj is created, and so ordinarily is not needed.
<p>This feature is only available if Python support is enabled. The MI
command <code>-list-features</code> (see <a href="GDB_002fMI-Support-Commands.html#GDB_002fMI-Support-Commands">GDB/MI Support Commands</a>)
can be used to check this.
<h5 class="subsubheading">Example</h5>
<p>Resetting the visualizer:
<pre class="smallexample"> (gdb)
-var-set-visualizer V None
^done
</pre>
<p>Reselecting the default (type-based) visualizer:
<pre class="smallexample"> (gdb)
-var-set-visualizer V gdb.default_visualizer
^done
</pre>
<p>Suppose <code>SomeClass</code> is a visualizer class. A lambda expression
can be used to instantiate this class for a varobj:
<pre class="smallexample"> (gdb)
-var-set-visualizer V "lambda val: SomeClass()"
^done
</pre>
<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
</body></html>