控管 zxdb 中的執行緒執行

Threads

如何列出目前的程序的執行緒 (詳情請參閱上方的「互動模型」):

[zxdb] thread
  # State   Koid Name
▶ 1 Blocked 1323 initial-thread
  2 Running 3462 worker-thread

通常,當您附加至執行緒時,系統會將執行緒「封鎖」,也就是說,系統會在系統呼叫時停止執行緒。對於非同步程式,這通常為某種等待狀態。

大多數執行緒控制和自我檢查指令只能在執行緒暫停 (未遭到封鎖或執行) 的情況下運作。當執行緒在中斷點或當機時,便會暫停。您可以使用 pause 指令明確暫停執行緒:

[zxdb] thread 2 pause
🛑 syscalls-x86-64.S:67
   65 m_syscall zx_port_create 60 2 1
   66 m_syscall zx_port_queue 61 2 1
 ▶ 67 m_syscall zx_port_wait 62 3 0
   68 m_syscall zx_port_cancel 63 3 1
   69 m_syscall zx_timer_create 64 3 1

執行緒暫停時,偵錯工具會顯示目前的原始碼位置。通常,執行緒會進行系統呼叫,該呼叫會解析為產生系統呼叫的組合語言巨集檔案中的位置,如上例所示。

單獨執行 pause 且沒有結構定義,將暫停目前附加的所有程序執行緒:

[zxdb] pause

取消暫停與 continue 的執行緒。和先前一樣,沒有結構定義的 continue 將恢復所有執行緒:

[zxdb] continue

或繼續特定執行緒:

[zxdb] thread 1 continue

堆疊框架

堆疊框架是一種函式呼叫。當函式呼叫另一個函式時,就會建立新的巢狀框架。因此,列出執行緒的影格會顯示呼叫堆疊。只有在執行緒暫停時,您只能查看堆疊框架 (請參閱上方「使用執行緒」一節)。

列出目前執行緒的堆疊框架 (也可以使用 f 縮寫)。

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

選取特定影格做為預設畫面:

[zxdb] frame 2

影格的編號是以「0」表示,位於堆疊頂端。數字會逐漸退縮。

您可以使用 updown 指令瀏覽影格清單:

[zxdb] up
  1 fxl::CommandLineFromIterators<const char *const *>() • command_line.h:204

[zxdb] down
  0 fxl::CommandLineFromIteratorsFindFirstPositionalArg<const char *const *>() • command_line.h:185

如需更多背景資訊,您可以使用 backtrace 指令。這與 frame 相同,但提供更多地址資訊和函式參數。這個指令可以縮寫 bt

[zxdb] bt
▶ 0 fxl::CommandLineFromIteratorsFindFirstPositionalArg<const char *const *>() • command_line.h:185
      IP = 0x10f982cf2ad0, BP = 0x66b45a01af50, SP = 0x66b45a01af38
      first = (const char* const*) 0x59f4e1268dc0
      last = (const char* const*) 0x59f4e1268dc8
      first_positional_arg = (const char* const**) 0x0
  1 fxl::CommandLineFromIterators<const char *const *>() • command_line.h:204
      IP = 0x10f982cf2ac0, BP = 0x66b45a01af50, SP = 0x66b45a01af40
      first = <'first' is not available at this address. >
      last = <'last' is not available at this address. >
...

每個堆疊框架都有一個程式碼位置。使用 list 指令查看原始碼。而是在目前堆疊框架的操作說明指標周圍列出原始碼:

[zxdb] list
   183 inline CommandLine CommandLineFromIteratorsFindFirstPositionalArg(
   184     InputIterator first, InputIterator last,
 ▶ 185     InputIterator* first_positional_arg) {
   186   if (first_positional_arg)
   187     *first_positional_arg = last;

您可以對其他堆疊框架目前的指示指標列出程式碼:

[zxdb] frame 3 list

也可以列出函式等特定項目:

[zxdb] list MyClass::MyFunc

檔案/行號:

[zxdb] list foo.cc:43

或整個檔案:

[zxdb] list --all myfile.cc:1

堆疊執行緒

當執行緒暫停時 (請參閱上方的「執行緒」),您可以控制執行緒的執行作業:

next / n:跳至下一行,對函式呼叫執行進階操作。

[zxdb] n

step / s:跳至下一行。如果函式呼叫在下一行之前發生,系統會進入該函式,並在該函式的開頭停止執行。您也可以提供引數,這個引數用來比對特定函式呼叫。未包含此子字串的函式名稱會略過,只有相符的函式會進入以下程序:

[zxdb] s
[zxdb] s MyFunction

ss:列出目前行上的函式呼叫,並進入所選呼叫的步驟,自動完成先前發生的任何任何其他呼叫。

[zxdb] ss
  1 std::string::string
  2 MyClass::MyClass
  3 HelperFunctionCall
  4 MyClass::~MyClass
  5 std::string::~string
  quit
>

finish / fi:離開函式並在呼叫後立即停止。

[zxdb] finish

until / u:指定位置 (與上述中斷點相同),繼續執行緒,直到執行作業前往該位置。例如,若要執行至目前檔案的第 45 行:

[zxdb] u 45

jump:將操作說明指標移到新的地址。

[zxdb] jump 22  // Line number
[zxdb] jump 0x87534123  // Address

如要在執行作業返回特定堆疊框架之前執行這項作業:

[zxdb] frame 2 until