# Evaluating and printing expressions in zxdb

Zxdb can evaluates simple C, C++, and Rust expressions. The most common place to evaluate an
expression in Zxdb is with the `print` command.  Expressions can also be used for most commands that
take a memory location as an argument such as `stack` or `mem-read`.

Evaluating an expression requires a stack frame, which in turn requires a process with a paused
thread. If the process is currently running, use the [pause](execution.md) command.

The most basic print command shows the current value of a variable in the current stack frame:

```none {:.devsite-disable-click-to-copy}
[zxdb] print i
34
```

More complex expressions are also supported:

```none {:.devsite-disable-click-to-copy}
[zxdb] print &foo->bar[baz]
(const MyStruct*) 0x59f4e1268f70
```

Expressions can be evaluated in the context of other stack frames without switching to them by
specifying the desired stack frame as a prefix (see [Interaction model](commands.md)):

```none {:.devsite-disable-click-to-copy}
[zxdb] frame 2 print argv[0]
"/bin/cowsay"
```

## Languages

Note: C++ and Rust are supported.

Expression evaluation takes the expression programming language from the current stack frame. If the
current frame's language is different, Zxdb defaults to C++.

The default language can be overridden with the `lauguage` setting, which can take the values `auto`
(use the current frame's language), `rust`, and `c++`:

```none {:.devsite-disable-click-to-copy}
[zxdb] set language rust
```

## Switches

The `print` command accepts these switches. To write an expression beginning with a hyphen, use
`--` to mark the end of switches. Following hyphens are treated as part of the expression:

```none {:.devsite-disable-click-to-copy}
[zxdb] print -- -i
```

  * *`--max-array=<number>`*: Specifies the maximum array size to print. By default this is 256.
    Specifying large values slows down expression evaluation and makes the output harder to read,
    but the default is sometimes insufficient. This also applies to strings.

  * *`--raw` or `-r`*: Bypass pretty-printers and show the raw type information.

  * *`--types` or `-t`*: Force type printing on. The type of every value printed is explicitly
    shown. Implies -v.

  * *`--verbose` or `-v`*: Don't omit type names. Show reference addresses and pointer types.

## Special variables

CPU registers can be referred to with the `$reg(register name)` syntax. For example, to display the
ARM register `v3`:

```none {:.devsite-disable-click-to-copy}
[zxdb] print $reg(v3)
0x573a420f128
```

CPU registers can also be used unescaped as long as no variable in the current scope has the same
name. Registers can also be used like any other variable in more complex expressions:

```none {:.devsite-disable-click-to-copy}
[zxdb] print rax + rbx
```

Vector registers can be treated as arrays according to the `vector-format` setting.

```none {:.devsite-disable-click-to-copy}
[zxdb] print ymm1
{3.141593, 1.0, 0, 0}

[zxdb] print ymm[0] * 2
6.28319
```

Sometimes an identifier may have a name that is not parseable in the current language. This is often
the case for compiler-generated symbols. Enclose such strings in "$(...)". Parentheses inside the
escaped contents can be literal as long as they are balanced, otherwise, escape them by preceding
with a backslash. Include a literal backslash with two backslashes:

  * `$(something with spaces)`
  * `{% verbatim %}$({{impl}}){% endverbatim %}`  {# note: the verbatim block is to avoid issues with the fuchsia.dev template engine #}
  * `$(some_closure(data))`
  * `$(line\)noise\\)`

## Setting variables

The `print` command can also mutate data, allowing variables to be set from expressions. For
example:

```none {:.devsite-disable-click-to-copy}
[zxdb] print done_flag = true
true
[zddb] print i = 56
56
```

## Other data display commands

  * Memory display commands are covered in the [memory](memory.md) section.
  * Register display commands are covered in the [assembly](assembly.md) section.

### The `locals` command

The `locals` command shows all local variables in the current stack frame. It accepts the same
switches as `print`:

```none {:.devsite-disable-click-to-copy}
[zxdb] locals
argc = 1
argv = (const char* const*) 0x59999ec02dc0
```

### The `display` command

When stepping through a function, it can be useful to automatically print one or more expressions
each time the program stops. The `display` command adds a given expression to this list:

```none {:.devsite-disable-click-to-copy}
[zxdb] display status
Added to display for every stop: status

[zxdb] next
🛑 main(…) • main.cc:48

    [code dump]

status = 5;
```
