執行程式碼時,中斷點會停止執行。如要建立中斷點,請使用
break
指令,並提供中斷位置。
舉例來說,如要在 main
函式上建立中斷點:
[zxdb] 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 中表示中斷點。例如:
函式名稱
你可以指定函式名稱,將函式名稱與以下項目的函式相符: 任何命名空間:
[zxdb] break main
成員職務
您可以指定特定命名空間中的成員函式或函式 或類別:
[zxdb] break my_namespace::MyClass::MyFunction
[zxdb] break ::OtherFunction
來源和線條
您也可以指定要在哪個來源檔案和行號中斷的地方:
[zxdb] break mymain.cc:22
行號
您可以在目前頁框的目前來源中指定行數 檔案。當您逐步執行程式碼時,這項功能非常實用:
[zxdb] break 23
記憶體位址
您可以指定記憶體位址:
[zxdb] break 0xf72419a01
運算式
您可以指定運算式,請參閱評估運算式。
,進一步瞭解 zxdb 中的運算式。前置字串 *
會將
運算式會比對輸入內容為特定地址
這在處理硬體中斷點時相當實用。
[zxdb] break --type=write *&foo
列出中斷點
如要查看所有中斷點,請使用 breakpoint
:
[zxdb] breakpoint
# scope stop enabled type #addrs hit-count location
▶ 3 global all false software 1 0 machine.h:7
移除中斷點
如要移除特定中斷點,請提供該中斷點索引,做為
breakpoint <index> rm
。
舉例來說,如要清除 breakpoint 3
:
[zxdb] breakpoint 3 rm
Removed Breakpoint 3 enabled=false @ machine.h:7
清除中斷點
如要移除特定位置中的所有中斷點,則無須指定 索引:
[zxdb] clear
當您在中斷點建立或停止時,該中斷點會成為預設中斷點
。在沒有特定索引的情況下執行 clear
時,下列指令:
就會清除您抵達的最新中斷點
clear
也可採用選用位置,就像使用 break
指令一樣。在本
此方法就會嘗試清除該位置的所有中斷點,並忽略
預設中斷點結構定義
停用中斷點
例如,如要停用中斷點 3
:
[zxdb] 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 };
如要停用目前的中斷點,請按照下列步驟操作:
[zxdb] 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
:
[zxdb] 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
屬性:
[zxdb] 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
:
[zxdb] 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 中,硬體中斷點會公開為中斷點類型,而不是 不同的觀察點
您可以設定在處理器讀取或寫入特定資料時,中斷執行 讓我們看看 DNS 解析 進一步探索內部和外部位址這有助於追蹤記憶體毀損情形。
您可以在使用下列任一值時建立硬體中斷點
針對 break
指令的 type
屬性提出新的要求。
execute
write
read-write
舉例來說,如要設定 execution
類型的中斷點:
[zxdb] break --type=execution myfile.rs:123
watch
與使用 break --type=read-write
相同。詳情請見
watch
指令。
watch
指令
做為捷徑,watch
指令會擷取變數內容或
並根據運算式的結果設定資料寫入中斷點:
[zxdb] watch i
[zxdb] watch foo[5]->bar
如果您在堆疊上 watch
變數,且沒有人輕觸該變數,經常會發生
重複使用堆疊記憶體後,即可看到這個程式碼在程式的另一部分發揮作用。
如果發生意外的中斷點命中,請確認執行作業是否仍在
不符合您的期望
程式輔助中斷點
在某些情況下,您可能想在程式碼中擷取特定條件。方法如下 您可以使用硬式編碼的中斷點
Clang 內建以下功能:
__builtin_debugtrap();
如果 zxdb 已附加到程序,它會像正常一樣停止
已成功關閉中斷點你可以接著選擇step
或continue
。如果
未附加偵錯工具,將導致當機。