估算運算式

Zxdb 可以從簡單的 C、C++ 和 Rust 運算式評估及輸出值。在 zxdb 中評估運算式最常見的用途是使用 print 動詞。運算式也可用於將記憶體位置做為引數的指令,例如 stackmem-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 中使用變數時,可能會有一個 ID 名稱,無法以目前語言剖析。這通常是編譯器產生的符號。請務必在 $(<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