使用中斷點

執行程式碼時,中斷點會停止執行。如要建立中斷點,請使用 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 };

設定及取得中斷點屬性

您也可以使用 getset 指令修改中斷點屬性。

例如,如要從中斷點 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

條件中斷點

您也可以設定中斷點具有條件,條件式指的是 評估為 truefalse 的運算式。設定 除非符合條件,否則中斷點不會觸發停止 為 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 已附加到程序,它會像正常一樣停止 已成功關閉中斷點你可以接著選擇stepcontinue。如果 未附加偵錯工具,將導致當機。