評估及列印 zxdb 中的運算式

Zxdb 可評估簡單的 C、C++ 和 Rust 運算式。在 Zxdb 中評估運算式最常見的就是使用 print 指令。運算式也可用於大多數將記憶體位置做為引數,例如 stackmem-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 (使用目前影格的語言)、rustc++ 的值:

[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;