Zxdb 可以評估並輸出簡單 C、C++ 和 Rust 運算式的值。在 zxdb 中評估運算式最常見的用途是使用 print 動詞。運算式也可用於接受記憶體位置做為引數的指令,例如 stack 或 mem-read。
評估運算式時,您需要堆疊框架,而這需要執行緒暫停的程序。如果程序目前正在執行,您可以使用 pause 動詞暫停執行緒。
您可以使用 print 指令,顯示目前堆疊框架中變數的目前值:
舉例來說,如要查看變數 i 的值,請執行以下指令:
print i
34
您也可以在其他堆疊框架的內容中評估運算式,而不必切換至該框架。
舉例來說,如要查看堆疊框架 2 中 argv[0] 的值,請執行以下指令:
frame 2 print argv[0]
"/bin/cowsay"
使用運算式輸出
print 指令接受下列引數:
--max-array=<number>:指定要列印的陣列大小上限。預設值為 256。指定較大的值會減慢運算式評估速度。--raw或-r:略過美化排版工具,顯示原始類型資訊。--types或-t:強制開啟類型列印。系統會明確顯示每個輸出值的類型。暗示-v。--verbose或-v:請勿省略類型名稱。顯示參照位址和指標類型。
如要編寫以連字號開頭的運算式,請使用 -- 標示引數結尾。-- 後方的連字號會視為運算式的一部分:
print -- -i
數字格式設定選項
print 指令接受下列選項,可強制將數值設為特定類型:
-b:二進位-c:角色-d:有正負號的十進位-u:無符號十進制-x:無正負號十六進位
特殊變數
在 zxdb 中使用變數時,您可能會遇到無法在目前語言中剖析的 ID 名稱。編譯器產生的符號通常會發生這種情況。請務必將這類字串括在 $(<symbols>) 中。逸出內容中的括號只要成對,就可以是常值,否則請在括號前加上反斜線來逸出。請在任何常值反斜線中加入兩個反斜線。
以下都是有效範例:
$(something with spaces)$({{impl}})$(some_closure(data))$(line\)noise\\)
此外,zxdb 也支援:
CPU 暫存器
您可以使用 $reg(register name) 語法參照 CPU 暫存器。例如,如要顯示 ARM 暫存器 v3:
print $reg(v3)
0x573a420f128
只要目前範圍內沒有任何變數具有相同名稱,CPU 暫存器也可以不逸出使用。在更複雜的運算式中,暫存器也可以像其他變數一樣使用:
print -x rax + rbx
0x2108aa0032a
在支援可擴充向量擴充功能 (SVE) 的 ARM64 目標上,您也可以在運算式中參照 SVE 暫存器 (z0-z31、p0-p15、ffr 和 vg)。
向量暫存器
根據 vector-format 的設定,向量暫存器可視為陣列。
print ymm1
{3.141593, 1.0, 0, 0}
[zxdb] print ymm[0] * 2
6.28319
列出向量暫存器
您可以使用 regs 列出向量暫存器。
舉例來說,如要列出所有向量暫存器,請輸入:
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 指令會將指定運算式新增至這份清單:
display status
Added to display for every stop: status
[zxdb] next
🛑 main(…) • main.cc:48
[code dump]
status = 5;
使用 locals
locals 指令會顯示目前堆疊框架中的所有本機變數。它接受與 print 相同的引數 (請參閱「使用運算式列印」):
locals
argc = 1
argv = (const char* const*) 0x59999ec02dc0