Zxdb 可以从简单的 C、C++ 和 Rust 求值和输出值
表达式。在 zxdb 中对表达式求值的最常见用例是
print
动词。表达式也可用于获取内存的命令
location 作为参数,例如 stack
或 mem-read
。
对表达式求值时,需要一个堆栈帧,而堆栈帧又需要 有一个处于暂停线程的进程如果该进程当前正在运行,您可以使用 使用 pause 动词来暂停线程。
您可以使用输出命令在 当前堆栈帧:
例如,如需查看变量 i
的值,请使用以下代码:
[zxdb] print i
34
您还可以在另一个堆栈帧的上下文中对表达式求值 而无需切换到该帧。
例如,如需查看堆栈帧 2
中 argv[0]
的值,请使用以下代码:
[zxdb] frame 2 print argv[0]
"/bin/cowsay"
使用表达式进行输出
print
命令接受以下参数:
--max-array=<number>
:指定要输出的数组大小上限。修改者 默认为 256指定较大的值会减慢表达式的执行速度 评估。--raw
或-r
:绕过美观打印机并显示原始类型信息。--types
或-t
:强制开启类型打印功能。输出的每个值的类型 明确显示。隐含了-v
。--verbose
或-v
:请勿省略类型名称。显示参考地址和 指针类型。
如需编写以连字符开头的表达式,请使用 --
标记以
参数。--
后面的连字符会被视为表达式的一部分:
[zxdb] print -- -i
数字格式选项
print
命令接受以下选项来强制显示数值
为特定类型的:
-b
:二进制文件-c
:字符-d
:带符号的小数-u
:无符号十进制数-x
:无符号十六进制
特殊变量
当您在 zxdb 中使用变量时
无法在当前语言中解析。这种情况通常发生在
由编译器生成的符号请务必将此类字符串包含在 $(<symbols>)
中。
转义内容中的圆括号可以是字面量,但前提是
均衡型;否则,在前面加反斜杠进行转义。包含任一项
带有两个反斜杠的文字。
以下均为有效示例:
$(something with spaces)
$({{impl}})
$(some_closure(data))
$(line\)noise\\)
此外,zxdb 还支持:
CPU 寄存器
您可以使用 $reg(register name)
语法引用 CPU 寄存器。对于
例如,显示 ARM 寄存器 v3
:
[zxdb] print $reg(v3)
0x573a420f128
CPU 寄存器也可不转义,只要当前 范围的名称相同。寄存器也可以像 更复杂的表达式:
[zxdb] print -x rax + rbx
0x2108aa0032a
向量寄存器
根据以下设置,矢量寄存器可被视为数组
vector-format
。
[zxdb] print ymm1
{3.141593, 1.0, 0, 0}
[zxdb] print ymm[0] * 2
6.28319
列出矢量寄存器
您可以使用 regs
列出矢量寄存器。
例如,要列出所有向量寄存器:
[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".)
使用 display
在逐步执行某个函数时,自动输出一个函数非常有用
或多个表达式。display
命令会将
添加到此列表的指定表达式:
[zxdb] display status
Added to display for every stop: status
[zxdb] next
🛑 main(…) • main.cc:48
[code dump]
status = 5;
使用 locals
locals
命令会显示当前堆栈帧中的所有局部变量。它
接受与 print
相同的参数(请参阅使用表达式进行打印):
[zxdb] locals
argc = 1
argv = (const char* const*) 0x59999ec02dc0