| # Evaluate expressions | |
| Zxdb can evaluate and print values from simple C, C++, and Rust | |
| expressions. The most common use case to evaluate an expression in zxdb is with | |
| the `print` verb. Expressions can also be used for commands that take a memory | |
| location as an argument such as `stack` or `mem-read`. | |
| When you evaluate an expression you need a stack frame, which in turn requires | |
| a process with a paused thread. If the process is currently running, you can use | |
| the [pause](execution.md) verb to pause the thread. | |
| You can use the print command to show the current value of a variable in the | |
| current stack frame: | |
| For example, to see the value of a variable `i`: | |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } | |
| print i | |
| 34 | |
| ``` | |
| You can also evaluate expressions in the context of another stack frame | |
| without switching to that frame. | |
| For example, to see the value of `argv[0]` in stack frame `2`: | |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } | |
| frame 2 print argv[0] | |
| "/bin/cowsay" | |
| ``` | |
| ## Print with expressions {#print-expressions} | |
| The `print` command accepts the following arguments: | |
| * *`--max-array=<number>`*: Specifies the maximum array size to print. By | |
| default this is 256. Specifying large values slows down expression | |
| evaluation. | |
| * *`--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. | |
| To write an expression beginning with a hyphen, use `--` to mark the end of | |
| arguments. Hyphens after `--` are treated as part of the expression: | |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } | |
| print -- -i | |
| ``` | |
| ## Number formatting options {#number-formatting-options} | |
| The `print` command accepts the following options to force numeric values | |
| to be of specific types: | |
| * `-b`: Binary | |
| * `-c`: Character | |
| * `-d`: Signed decimal | |
| * `-u`: Unsigned decimal | |
| * `-x`: Unsigned hexadecimal | |
| ## Special variables | |
| When you work with variables in zxdb you may have an identifier name that is | |
| not parseable in the current language. This is often the case for | |
| compiler-generated symbols. Make sure to enclose such strings in `$(<symbols>)`. | |
| Parentheses inside the escaped contents can be literal as long as they are | |
| balanced, otherwise, escape them by preceding with a backslash. Include any | |
| literal backslash with two backslashes. | |
| These are all valid examples: | |
| * `$(something with spaces)` | |
| * `{% verbatim %}$({{impl}}){% endverbatim %}` {# The verbatim block is to avoid issues with the fuchsia.dev template engine #} | |
| * `$(some_closure(data))` | |
| * `$(line\)noise\\)` | |
| Additionally, zxdb also supports: | |
| * [CPU registers](#cpu-registers) | |
| * [Vector registers](#vector-registers) | |
| ### CPU registers {#cpu-registers} | |
| You can refer to CPU registers with the `$reg(register name)` syntax. For | |
| example, to display the ARM register `v3`: | |
| ```none {: .devsite-terminal data-terminal-prefix="[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: | |
| Note: You can use the `-x` option to display the unsigned hexadecimal value. For | |
| additional options, see [Number formatting options](#number-formatting-options). | |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } | |
| print -x rax + rbx | |
| 0x2108aa0032a | |
| ``` | |
| ### Vector registers {#vector-registers} | |
| Vector registers can be treated as arrays based on the setting of | |
| `vector-format`. | |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } | |
| print ymm1 | |
| {3.141593, 1.0, 0, 0} | |
| [zxdb] print ymm[0] * 2 | |
| 6.28319 | |
| ``` | |
| #### List vector registers | |
| You can list the vector registers with `regs`. | |
| For example, to list all of the vector registers: | |
| Note: You can also use `-v` instead of `--vector`. | |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } | |
| regs --vector | |
| (Use "print $registername" to show a single one, or | |
| "print $registername = newvalue" to set.) | |
| Vector Registers | |
| mxcsr 0x1fa0 = 8096 | |
| Name [3] [2] [1] [0] | |
| ymm0 0 0 -3.72066e-103 -3.72066e-103 | |
| ymm1 0 0 3.79837e-312 2.63127e-312 | |
| ymm2 0 0 0 -3.72066e-103 | |
| ymm3 0 0 1.26218e-311 1.26218e-311 | |
| ymm4 0 0 1.26218e-311 1.26218e-311 | |
| ymm5 0 0 1.26218e-311 1.26218e-311 | |
| ymm6 0 0 5.96337e-321 5.87938e-321 | |
| ymm7 0 0 2.56125e-311 2.4891e-311 | |
| ymm8 0 0 0 0 | |
| ymm9 0 0 0 0 | |
| ymm10 0 0 0 0 | |
| ymm11 0 0 0 0 | |
| ymm12 0 0 0 0 | |
| ymm13 0 0 0 0 | |
| ymm14 0 0 0 0 | |
| ymm15 0 0 0 0 | |
| (Use "get/set vector-format" to control vector register interpretation. | |
| Currently showing vectors of "double".) | |
| ``` | |
| ## Use `display` | |
| 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: | |
| Note: This example uses a variable named `status` and its value is returned | |
| when the program stops. | |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } | |
| display status | |
| Added to display for every stop: status | |
| [zxdb] next | |
| 🛑 main(…) • main.cc:48 | |
| [code dump] | |
| status = 5; | |
| ``` | |
| ## Use `locals` | |
| The `locals` command shows all local variables in the current stack frame. It | |
| accepts the same arguments as `print` (see [Print with expressions](#print-expressions)): | |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } | |
| locals | |
| argc = 1 | |
| argv = (const char* const*) 0x59999ec02dc0 | |
| ``` |