blob: 51c91d7ca59ff9008fd8ed5f229de3386f3ba6a3 [file] [log] [blame] [view]
# 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;
```