Zxdb 主控台指令和互動模型

## 次

Zxdb 內建說明系統:

[zxdb] help

如要取得特定指令或主題的說明 (本例中為 step 指令):

[zxdb] help step

互動模式

大多數的指令列偵錯工具都使用專屬模型做為輸入內容:您與偵錯程序的 stdin 和 stdout 互動,或者您正在與偵錯工具互動。相對地,zxdb 擁有與大多數 GUI 偵錯工具類似的非同步模型。在這個模型中,使用者在執行或停止任何程序或執行緒時,只會與偵錯工具互動。

偵錯工具自行啟動程式時,會將程式的 stdout 和 stderr 列印至控制台。當您附加 (使用篩選器或 attach 指令) 時,檔案會移至原始位置。目前沒有方法能與程序的 stdin 互動。

Zxdb 擁有適用於型別指令的一般名詞/動詞模型。本節其餘部分會概略介紹所有指令適用的語法。下方的「工作指南」一節會介紹特定指令。

名詞

可能的名詞 (及縮寫) 為:

  • process (pr)
  • thread (t)
  • frame (f)
  • breakpoint (bp)

列出名詞

如果單獨輸入名詞,便會列出該類型的可用物件:

  • 列出附加的程序

    [zxdb] process
      # State       Koid Name
    ▶ 1 Not running 3471 debug_agent_unit_tests.cm
    
  • 列出目前程序中的執行緒:

    [zxdb] thread
      # State   Koid Name
    ▶ 1 Blocked 1348 initial-thread
      2 Blocked 1356 some-other-thread
    
  • 列出目前執行緒中的堆疊框架 (必須停止執行緒,請參閱下方的 pause):

    [zxdb] frame
    ▶ 0 fxl::CommandLineFromIterators<const char *const *>() • command_line.h:203
      1 fxl::CommandLineFromArgcArgv() • command_line.h:224
      2 main() • main.cc:174
    

選取預設設定

如果您輸入名詞及其索引,選取該值做為後續指令的預設選項。同時還會顯示有關新預設值的統計資料。

  • 選取執行緒 3 做為日後指令的預設選項:

    [zxdb] thread 3
    Thread 3 Blocked koid=9940 worker-thread
    
  • 選取中斷點 2 做為預設:

    [zxdb] breakpoint 2
    Breakpoint 2 (Software) on Global, Enabled, stop=All, @ MyFunction
    

動詞

根據預設,動詞 (runnextprint 等) 會套用至目前的預設值。因此,如要在目前的堆疊框架內容中評估運算式,只需輸入 print 即可:

[zxdb] print argv[1]
"--foo=bar"

您可以在動詞前面加上名詞及其索引,藉此覆寫預設結構定義。因此,如要在特定堆疊框架 (本例中是目前執行緒的影格 2) 中評估運算式:

[zxdb] frame 2 print argv[1]
"--foo=bar"

因此您可以繼續新增不同類型的背景資訊。這會指定列印指令的程序、執行緒和影格:

[zxdb] process 1 thread 1 frame 2 print argv[1]
"--foo=bar"

屬性和設定

Debugger 物件具有相關聯的設定。使用「get」動詞列出特定物件的設定:

[zxdb] breakpoint 1 get
  enabled  true
  location main
  one-shot false
  scope    global
  stop     all
  type     software

具有特定屬性的「get」指令會列出該屬性及相關聯的說明:

[zxdb] breakpoint 1 get scope

  ... help text here ...

scope = global

「set」指令會設定一個值:

[zxdb] breakpoint 1 set scope="process 1 thread 2"
[zxdb] breakpoint 1 set enabled=false

部分設定採階層式架構。執行緒會沿用其程序的設定,進而沿用全域範圍的設定。沒有結構定義或參數的「get」指令會列出全域設定,以及目前程序和執行緒的全域設定。您可以設定全域設定,套用至沒有特定覆寫的執行緒和程序,或是覆寫特定背景資訊:

[zxdb] set show-stdout = false            # Applies to all processes with no override.
[zxdb] process 2 set show-stdout = true   # Overrides a specific process.

有些設定為清單,您可以使用 += 來附加,或以「=」指定新值。清單元素會以空格分隔 (含空格的引號字串)。

[zxdb] set symbol-paths = /foo/bar/baz "/home/Dr. Strangelove/cache"
[zxdb] set symbol-paths += /tmp
[zxdb] get symbol-paths
  ... help text ...

symbol-paths =
  • /foo/bar/baz
  • "/home/Dr. Strangelove/cache"
  • /tmp