估算運算式

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