程式碼執行時,中斷點會停止執行作業。如要建立中斷點,請使用 break 指令,並提供要中斷的位置。
舉例來說,如要在 main 函式上建立中斷點,請執行下列操作:
break main
Breakpoint 3 (Software) on Global, Enabled, stop=All, @ main
180
◉ 181 int main(int argc, char**argv) {
182 fbl::unique_fd dirfd;
您可以在 zxdb 中透過多種方式表示中斷點。例如:
函式名稱
您可以指定與任何命名空間中名稱相符的函式名稱:
break main
成員職務
您可以在特定命名空間或類別中指定成員函式:
break my_namespace::MyClass::MyFunction
[zxdb] break ::OtherFunction
來源和行
您也可以指定要中斷的來源檔案和行號:
break mymain.cc:22
行號
您可以指定目前頁框目前來源檔案中的行號。逐行執行程式碼時,這項功能非常實用:
break 23
記憶體位址
您可以指定記憶體位址:
break 0xf72419a01
運算式
您可以指定運算式,詳情請參閱「評估運算式」,瞭解 zxdb 中的運算式。加上 * 前置字元,可將後續輸入內容視為運算式,並評估為特定位址。使用硬體中斷點時,這項功能非常實用。
break --type=write *&foo
列出中斷點
如要查看所有中斷點,請使用 breakpoint:
breakpoint
# scope stop enabled type #addrs hit-count location
▶ 3 global all false software 1 0 machine.h:7
移除中斷點
如要移除特定中斷點,請將該中斷點的索引做為 breakpoint <index> rm 的內容。
舉例來說,如要清除 breakpoint 3:
breakpoint 3 rm
Removed Breakpoint 3 enabled=false @ machine.h:7
清除中斷點
如要移除特定位置的所有中斷點,不必指定索引:
clear
當您建立或停止在斷點上時,該斷點會自動成為預設斷點。每當您執行 clear 時,如果沒有指定特定索引,指令就會清除您遇到的最新中斷點。
clear 也可以像 break 指令一樣,採用選用位置。這樣一來,系統會嘗試清除該位置的所有中斷點,並忽略預設中斷點環境。
停用中斷點
舉例來說,如要停用中斷點 3:
breakpoint 3 disable
Disabled Breakpoint 3 enabled=false @ machine.h:7
35 static constexpr SizeType InitialStackPointer(SizeType base, SizeType size) {
36 // Stacks grow down on most machines.
◯ 37 return (base + size) & -kStackAlignment<SizeType>;
38 }
39 };
如要停用目前的中斷點,請按照下列步驟操作:
disable
Disabled Breakpoint 2 enabled=false @ main.rs:5
24
25 enum Services {
◯ 26 ComponentRunner(frunner::ComponentRunnerRequestStream),
27 StarnixManager(fstarnixrunner::ManagerRequestStream),
28 AttributionProvider(fattribution::ProviderRequestStream),
啟用中斷點
停用中斷點後,您可能想重新啟用。
舉例來說,如要啟用中斷點 3:
breakpoint 3 enable
Enabled Breakpoint 3 @ machine.h:7
35 static constexpr SizeType InitialStackPointer(SizeType base, SizeType size) {
36 // Stacks grow down on most machines.
◉ 37 return (base + size) & -kStackAlignment<SizeType>;
38 }
39 };
設定及取得中斷點屬性
您也可以使用 get 和 set 指令修改中斷點屬性。
舉例來說,如要從中斷點 4 擷取 location 屬性:
breakpoint 4 get location
location (locations)
The location (symbol, line number, address, or expression) where this
breakpoint will be set. See "help break" for documentation on how to specify.
location = machine.h:7
舉例來說,如要將 location 屬性從中斷點 4 設為 machine.h:8:
breakpoint 4 set location = machine.h:8
Set breakpoint 4 location = machine.h:8
條件中斷點
您也可以設定中斷點的條件。條件是評估結果為 true 或 false 的運算式。設定條件後,除非條件為 true,否則中斷點不會觸發停止。
舉例來說,如果您要偵錯 cobalt.cm 元件:
舉例來說,如要新增 main.cc:352 的條件中斷點位置:
[zxdb] b main.cc:352 if command_line.has_argv0 == false
Created Breakpoint 1 condition="command_line.has_argv0 == false" @ ../../src/myapp/bin/app/main.cc:352
351 }
◉ 352 inspector.Health().Ok();
353 loop.Run();
354 FX_LOGS(INFO) << "Cobalt will now shut down.";
硬體資料中斷點
在 zxdb 中,硬體中斷點會以中斷點類型顯示,而不是以個別的觀察點顯示。
您可以設定處理器,在讀取或寫入特定位址時中斷執行作業。這有助於追蹤記憶體損毀情形。
當您為 break 指令的 type 屬性使用下列任一值時,即可建立硬體中斷點。
executewriteread-write
舉例來說,如要設定 execute 類型的中斷點:
break --type=execute myfile.rs:123
watch 與使用 break --type=read-write 相同。請參閱 watch 指令。
watch 指令
做為捷徑,watch 指令會擷取變數內容或運算式結果,並在其範圍內設定資料寫入中斷點:
watch i
[zxdb] watch foo[5]->bar
如果您在堆疊中watch變數,且無人觸碰該變數,當堆疊記憶體重複使用時,您通常會在程式的其他部分看到該變數。如果遇到出乎意料的斷點命中,請檢查執行作業是否仍在預期的影格中。
程式輔助中斷點
在某些情況下,您可能想在程式碼中找出特定條件。如要這麼做,您可以在程式碼中插入硬式編碼中斷點。
Clang 內建:
__builtin_debugtrap();
如果 zxdb 已附加至程序,系統會停止程序,就像遇到一般中斷點一樣。然後即可從該處step或continue。如果偵錯工具尚未附加,這會導致當機。