使用 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
代表堆疊頂端,
表示執行結束。堆疊的底部
最高堆疊框架編號 ,表示執行時間。
瀏覽堆疊框架
您可以使用 up
和 down
指令瀏覽影格清單。
例如,使用 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