Zxdb 可評估簡單的 C、C++ 和 Rust 運算式。在 Zxdb 中評估運算式最常見的就是使用 print
指令。運算式也可用於大多數將記憶體位置做為引數,例如 stack
或 mem-read
。
評估運算式需要堆疊框架,而堆疊框架則需要有暫停的執行緒。如果程序目前正在執行,請使用 pause 指令。
最基本的列印指令會顯示目前堆疊框架中變數目前的值:
[zxdb] print i
34
系統也支援更複雜的運算式:
[zxdb] print &foo->bar[baz]
(const MyStruct*) 0x59f4e1268f70
運算式可在其他堆疊頁框的內容中評估,而無需切換,方法是將所需的堆疊框架指定為前置字串 (請參閱「互動模型」一節):
[zxdb] frame 2 print argv[0]
"/bin/cowsay"
語言
運算式評估會從目前的堆疊框架取得運算式程式設計語言。如果目前影格的語言不同,Zxdb 會預設為 C++。
您可以使用 lauguage
設定覆寫預設語言,該設定可接受 auto
(使用目前影格的語言)、rust
和 c++
的值:
[zxdb] set language rust
切換按鈕
print
指令接受這些切換按鈕。如要編寫以連字號開頭的運算式,請使用 --
標示切換鈕的結尾。以下連字號會視為運算式的一部分:
[zxdb] print -- -i
--max-array=<number>
:指定列印的陣列大小上限。預設值為 256。指定較大的值會使運算式評估速度變慢,並使輸出內容更難以讀取,但預設值有時不足。這也適用於字串。--raw
或-r
:略過美化印表機並顯示原始類型資訊。--types
或-t
:強制開啟類型列印功能。輸出的每個值的類型會明確顯示。隱含 -v.--verbose
或-v
:不要省略類型名稱。顯示參照地址和指標類型。
特殊變數
CPU 暫存器可使用 $reg(register name)
語法參照。例如,如要顯示 ARM 註冊 v3
:
[zxdb] print $reg(v3)
0x573a420f128
如果目前範圍中沒有任何變數的名稱相同,則 CPU 註冊也可以以未逸出的形式使用。登錄作業也可以和複雜運算式中的任何其他變數一樣使用:
[zxdb] print rax + rbx
根據 vector-format
設定,向量暫存器可視為陣列。
[zxdb] print ymm1
{3.141593, 1.0, 0, 0}
[zxdb] print ymm[0] * 2
6.28319
有時,ID 名稱在目前語言中無法剖析。而這通常是編譯器產生的符號。將這些字串置於「$(...)」中。逸出內容內的括號可以是常值,只要其為平衡狀態即可,否則請在前面加上反斜線來逸出這些字串。加入含有兩個反斜線的常值反斜線:
$(something with spaces)
$({{impl}})
$(some_closure(data))
$(line\)noise\\)
設定變數
print
指令也可以修改資料,以便透過運算式設定變數。例如:
[zxdb] print done_flag = true
true
[zddb] print i = 56
56
其他資料顯示指令
locals
指令
locals
指令會顯示目前堆疊框架中的所有本機變數。其接受與 print
相同的切換按鈕:
[zxdb] locals
argc = 1
argv = (const char* const*) 0x59999ec02dc0
display
指令
逐一查看函式時,建議在每次程式停止時自動列印一或多個運算式。display
指令會將指定運算式加入這份清單:
[zxdb] display status
Added to display for every stop: status
[zxdb] next
🛑 main(…) • main.cc:48
[code dump]
status = 5;