必要條件
如果您尚未熟悉「檢查」功能,建議您詳閱 下列頁面:
簡介
駕駛人可以使用檢查功能。不過,你需要考量 因為驅動程式並非元件
請參考以下系統拓撲圖:
圖表圖例:
灰色:元件。
藍色:顯示輸出/診斷目錄內容的元件命名空間。
紫色:out/diagnostics/*
檢查檔案的內容。
元件可透過下列方式公開檢查資料:
- VMO 檔案:通常稱為
root.inspect
- 樹狀結構服務:
fuchsia.inspect.Tree
通訊協定的服務檔案
元件可公開一或多個這類檔案。在上圖中,元件 foo
和
echo
會公開單一檔案。不過,driver_manager
會公開多個檔案,一個 VMO 檔案
每個裝置。
這是因為每部裝置並非元件,因此 driver_manager
會匯總
檢查並發布 VMO這是公開檢查
來自元件和驅動程式庫的資料,其對資料查詢方式的影響
透過選取器程式碼
如要查詢 foo
和 echo
元件的資料,您可以在
特定選取器例如 core/foo:root/child1:prop1
、core/echo:root/child1:prop1
。個人中心
都有獨特的查詢方式,即使屬性和節點的呼叫方式相同
方便你使用對方的路徑名稱
明確識別對方身分
不過,就驅動因素而言,我們建議所有裝置都公開檢查階層 根層級包含一個子項,這個子項使用裝置名稱,就能在 kubectl 指令內 選擇器查詢其資料。其他所有屬性和節點都是這個子項的子項。
在上圖中,您可以查詢:bootstrap/driver_manager:root/device_a:failures
和
bootstrap/driver_manager:root/device_b:failures
不得重複。如果 device_a
和 device_b
都不是
公開所有屬性都所在的 root/{device name}
節點公開檢查 VMO,
即使兩者不同
bootstrap/driver_manager:root:failures
會比對兩者。
包括駕駛人進行檢測
下列步驟將逐步說明如何在驅動程式中加入檢查功能。查看驅動程式庫的完整範例 內含檢查項目,請參考下列測試驅動程式範例。
在 BUILD.gn 中將 zircon 檢查程式庫新增至驅動程式庫依附元件:
deps = [ ... "//zircon/system/ulib/inspect", ],
請在驅動程式中加入這個標頭:
#include <lib/inspect/cpp/inspect.h>
在裝置類別中建立檢查器執行個體:
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_);
將檢查 VMO 匯出至驅動程式管理器。
zx_status Bind() { … DdkAdd(ddk::DeviceAddArgs("test").set_inspect_vmo(inspect_.DuplicateVmo())); }
每部裝置只能發布一項檢查 VMO。
讓你處理事務現在,您可以查看驅動程式庫的「檢查」資料。
- 裝置檢查檔案代管於
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
- 裝置檢查檔案代管於
執行
fx snapshot
,並檢查inspect.json
中是否顯示檢查資料。請注意, 意見回饋元件並非啟動的一部分,因此在工作時拍攝快照並不是很實用的功能 但應用程式只有在啟動作業中才會如此在這種情況下,建議您使用啟動檔案系統提供的iquery
(快速上所述,如果你正在使用其他產品,請參閱下文)。
在啟動檔案系統中加入 iquery
bringup
產品和所有 *_eng
產品已將 iquery
包含在啟動檔案系統中,因此
可以跳過此章節。
如果你正在處理其他產品,且需要將 iquery
提供給
然後將下列內容新增至 fx set
:
fx set core.x64 --args='product_bootfs_labels+=["//bundles:diagnostics-eng"]'