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」表示,位於堆疊頂端。數字會逐漸退縮。
您可以使用 up
和 down
指令瀏覽影格清單:
[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