控制執行緒執行作業

使用 zxdb 時,您可以控管執行緒的執行作業,以便偵錯。 偵錯時,您可以利用以下方法控制執行作業:

  • 執行緒

    執行緒是程序中的執行單位。代表了 可獨立執行的指示序列。

    如要透過 zxdb 中的執行緒控制執行作業,請參閱「執行緒」。

  • 堆疊框架

    堆疊框架是函式時所分配的呼叫堆疊的一部分 方法。儲存執行函式所需的資訊,例如:

    • 本機變數:函式中宣告的變數。
    • 參數:傳送至函式的值。
    • 退貨地址:代碼中要返回的位置 函式完成。

    如要透過 zxdb 中的堆疊框架控制執行作業,請參閱 堆疊框架

執行緒

在 zxdb 中,thread 是可與 zxdb 搭配使用的名詞 動詞

如要列出目前程序中的執行緒:

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

在某些情況下,您可能會注意到執行緒標示為 Blocked,這表示 執行緒在系統呼叫中停止。通常在偵錯作業中 非同步應用程式,也可能表示等待時間。

執行緒控制指令僅適用於已暫停的執行緒,不適用於已封鎖或執行中的執行緒 。您可以透過下列幾種方式暫停執行緒:

對執行緒pause

舉例來說,如要使用 pause 指令暫停執行緒 2

[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

執行緒暫停時,zxdb 會顯示目前的原始碼位置。如果執行緒 就像上方範例一樣,原始碼位置會解析 複製到系統產生系統的組合語言巨集檔案中 呼叫。

如果您在執行 pause 時沒有提供其他背景資訊,zxdb 就會暫停 目前附加的所有程序

例如:

[zxdb] pause
   508                 const zx_port_packet_t* packet))
   509
 ▶ 510 BLOCKING_SYSCALL(port_wait, zx_status_t, /* no attributes */, 3, (handle, deadline, packet),
   511                  (_ZX_SYSCALL_ANNO(use_handle("Fuchsia")) zx_handle_t handle, zx_time_t deadline,
   512                   zx_port_packet_t* packet))
🛑 $elf(SYSCALL_zx_port_wait) + 0x7 • syscalls.inc:510

對執行緒continue

暫停執行緒並開始對問題進行偵錯後,您可能需要 continue:執行緒。「繼續」表示在程式前繼續執行 正常運作。

例如,前往 continue 執行緒 1

[zxdb] thread 1 continue

如果您在 continue 沒有提供其他背景資訊的情況下執行 ,zxdb 就會繼續執行 處理所有附加程序的執行緒記錄。

例如:

[zxdb] continue

離開執行緒

您可以控管執行緒的執行作業。您可以使用下列任一種 指令:

  • finish (fi)

    退出函式,並在呼叫後立即停止。

    [zxdb] finish
    
  • next (n)

    跳到下一行,跳過函式呼叫。

    [zxdb] next
    
  • nexti

    會跳到下一個指示,但逐步完成通話說明 目標架構

    [zxdb] nexti
    
  • ss

    列出目前行的函式呼叫,並逐步執行選取的呼叫。這個 自動完成任何初次發生的其他呼叫。

    [zxdb] ss
      1 std::string::string
      2 MyClass::MyClass
      3 HelperFunctionCall
      4 MyClass::~MyClass
      5 std::string::~string
      quit
    >
    
  • step (s)

    導向下一行程式碼。如果函式呼叫在 線條,函式就會進入並停止執行 這個函式的開頭

    您也可以提供引數子字串來比對特定函式呼叫。 系統會略過不含引數子字串的函式名稱, 只會處理相符的函式

    [zxdb] step
    [zxdb] step MyFunction
    
  • stepi

    僅對一個機器指令進行對應。

    [zxdb] stepi
    
  • until (u)

    如果指定行位置,繼續處理執行緒,直到出現位置為止。適用對象 例如,在目前檔案的第 45 行前執行:

    [zxdb] until 45
    

    您也可以執行直到執行作業回到指定的堆疊框架:

    [zxdb] frame 2 until
    

堆疊框架

堆疊框架是一種函式呼叫當函式呼叫另一個函式時, 列出執行緒的框架會傳回呼叫堆疊。

如要列出目前執行緒中的堆疊框架:

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

使用堆疊框架時,0 代表堆疊頂端, 表示執行結束。堆疊的底部 最高堆疊框架編號 ,表示執行時間。

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

例如,使用 up 從目前頁框0前往頁框1

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

例如,使用 down 從目前頁框1前往頁框0

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

您也可以使用 frame 指令, 畫面編號:

[zxdb] frame 1

使用 backtrace 取得更多詳細資料

在某些情況下,您可能會想查看另一個地址資訊 堆疊框架就無法取得backtrace 指令與 frame 相同,但 可提供更詳細的地址資訊以及函式參數。

列出目前執行緒中的堆疊框架,並提供更多詳細資訊 請使用 backtrace

[zxdb] backtrace
▶ 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 查看原始碼

每個堆疊框架都有程式碼位置。使用 list 指令查看 Cloud Build 觸發條件 會在您變更原始碼時自動啟動建構作業

您可以在特定堆疊框架的指示指標周圍列出程式碼。

例如,為 list 堆疊指示指標周圍的原始碼 畫面 3

[zxdb] frame 3 list

當您在沒有結構定義的情況下使用 list 時,zxdb 會列出原始碼 目前堆疊框架的指示指標周圍:

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

list 的其他用途

此外,您可以使用 list 列出特定項目:

函式

使用 list 列出函式:

[zxdb] list MyClass::MyFunc

檔案

使用 list 列出特定檔案:

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

含有行號的檔案

使用 list 列出含有特定行號的特定檔案:

[zxdb] list foo.cc:43