對駕駛使用檢查功能

必要條件

如果您尚未熟悉「檢查」功能,建議您詳閱 下列頁面:

簡介

駕駛人可以使用檢查功能。不過,你需要考量 因為驅動程式並非元件

請參考以下系統拓撲圖:

圖 1:拓撲範例

圖表圖例:

灰色:元件。 藍色:顯示輸出/診斷目錄內容的元件命名空間。 紫色out/diagnostics/* 檢查檔案的內容。

元件可透過下列方式公開檢查資料:

  • VMO 檔案:通常稱為 root.inspect
  • 樹狀結構服務:fuchsia.inspect.Tree 通訊協定的服務檔案

元件可公開一或多個這類檔案。在上圖中,元件 fooecho 會公開單一檔案。不過,driver_manager 會公開多個檔案,一個 VMO 檔案 每個裝置。

這是因為每部裝置並非元件,因此 driver_manager 會匯總 檢查並發布 VMO這是公開檢查 來自元件和驅動程式庫的資料,其對資料查詢方式的影響 透過選取器程式碼

如要查詢 fooecho 元件的資料,您可以在 特定選取器例如 core/foo:root/child1:prop1core/echo:root/child1:prop1。個人中心 都有獨特的查詢方式,即使屬性和節點的呼叫方式相同 方便你使用對方的路徑名稱 明確識別對方身分

不過,就驅動因素而言,我們建議所有裝置都公開檢查階層 根層級包含一個子項,這個子項使用裝置名稱,就能在 kubectl 指令內 選擇器查詢其資料。其他所有屬性和節點都是這個子項的子項。

在上圖中,您可以查詢:bootstrap/driver_manager:root/device_a:failuresbootstrap/driver_manager:root/device_b:failures 不得重複。如果 device_adevice_b 都不是 公開所有屬性都所在的 root/{device name} 節點公開檢查 VMO, 即使兩者不同 bootstrap/driver_manager:root:failures 會比對兩者。

包括駕駛人進行檢測

下列步驟將逐步說明如何在驅動程式中加入檢查功能。查看驅動程式庫的完整範例 內含檢查項目,請參考下列測試驅動程式範例

  1. 在 BUILD.gn 中將 zircon 檢查程式庫新增至驅動程式庫依附元件:

    deps = [
        ...
        "//zircon/system/ulib/inspect",
    ],
    
  2. 請在驅動程式中加入這個標頭:

    #include <lib/inspect/cpp/inspect.h>
    
  3. 在裝置類別中建立檢查器執行個體:

    class TestDevice {
     
     private:
         inspect::Inspector inspect_;
    }
    

    請使用此功能建立屬性和子項,以建構檢查樹狀結構:

    TestDevice::TestDevice() {
        state_ = inspect_.GetRoot().CreateString("state","invalid");
        // inspect is a tree; You can add children and structure your data.
        performance_ = inspect_.GetRoot().CreateChild("performance");
        call_count_ = performance_.CreateUint("call_count",0);
        total_time_ = performance_.CreateUint("total_time(ms)",0);
        ...
    }
    
    TestDevice::SetState(State s) {
      call_count_.Add(1);
      ...
        case kActive:
          state_.Set("active");
    }
    

    檢查功能目前支援多種屬性類型,例如整數、字串、 陣列、布林值、雙精度數和直方圖。

    檢查是 RAII,因此,請記得保留您將更新屬性的參照,否則 系統就會從檢查 VMO 中移除

    class TestDevice {
     
     private:
         inspect::Inspector inspect_;
         inspect::StringProperty state_;
         inspect::Node performance_;
         inspect::UintProperty call_count_;
         inspect::UintProperty total_time_;
    }
    

    您可以在 inspect::ValueList 中新增屬性和節點,而不必保留對這些項目的參照。 這會將屬性和節點的生命週期與 inspect::ValueList。請注意,為方便起見,inspect::Inspector 必須是 ValueList。

    inspect_.GetRoot().CreateString("name","test device",&inspect_);
    inspect_.GetRoot().CreateString("config_params",config,&inspect_);
    
  4. 將檢查 VMO 匯出至驅動程式管理器。

    zx_status Bind() {
      
        DdkAdd(ddk::DeviceAddArgs("test").set_inspect_vmo(inspect_.DuplicateVmo()));
    }
    

    每部裝置只能發布一項檢查 VMO。

  5. 讓你處理事務現在,您可以查看驅動程式庫的「檢查」資料。

    • 裝置檢查檔案代管於 class/<protocol>/xxx.inspect
    • 使用 iquery 查看檢查資料
    ,瞭解如何調查及移除這項存取權。
    fx iquery show bootstrap/driver_manager --file class/ethernet/000.inspect
    
    // To view all of driver_manager and driver host
    fx iquery show bootstrap/driver_manager
    
  6. 執行 fx snapshot,並檢查 inspect.json 中是否顯示檢查資料。請注意, 意見回饋元件並非啟動的一部分,因此在工作時拍攝快照並不是很實用的功能 但應用程式只有在啟動作業中才會如此在這種情況下,建議您使用啟動檔案系統提供的 iquery (快速上所述,如果你正在使用其他產品,請參閱下文)。

在啟動檔案系統中加入 iquery

bringup 產品和所有 *_eng 產品已將 iquery 包含在啟動檔案系統中,因此 可以跳過此章節。

如果你正在處理其他產品,且需要將 iquery 提供給 然後將下列內容新增至 fx set

fx set core.x64 --args='product_bootfs_labels+=["//bundles:diagnostics-eng"]'