使用中斷點

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

設定及取得中斷點屬性

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

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

條件中斷點

您也可以設定中斷點的條件。條件是評估結果為 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 中,硬體中斷點會以中斷點類型顯示,而不是以個別的觀察點顯示。

您可以設定處理器,在讀取或寫入特定位址時中斷執行作業。這有助於追蹤記憶體損毀情形。

當您為 break 指令的 type 屬性使用下列任一值時,即可建立硬體中斷點。

  • execute
  • write
  • read-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 已附加至程序,系統會停止程序,就像遇到一般中斷點一樣。然後即可從該處stepcontinue。如果偵錯工具尚未附加,這會導致當機。