跟著小白一起學鴻蒙—DFX工具HiDumper
作者:左翼風發
本章我們講了Hidumper,作為開發者的查詢工具,通過此工具可以查詢系統信息,服務信息,進程棧等信息。
HiDumper
簡介
HiDumper是OpenHarmony中為開發、測試人員,IDE工具提供統一的系統信息獲取工具,幫助使用者分析,定位問題。
HiDumper主要包括以下幾個主要模塊:
- hidumper:可執行程序,工具入口,在板上可通過hidumper執行對應命令。
- hidumperclient:動態庫,提供framework層接口。
- lib_dump_usage:動態庫,提供framework層功能實現。
- hidumperservice:動態庫,sa服務,提供service層功能實現。
結構分析
.
├── BUILD.gn
├── bundle.json
├── client
│ └── native
│ ├── dump_client_main.cpp
│ └── main.cpp //可執行文件入口
├── figures
├── frameworks //框架實現
│ └── native
│ ├── BUILD.gn
│ ├── common.h
│ ├── dump_controller.h
│ ├── dump_utils.cpp
│ ├── dump_utils.h
│ ├── include
│ └── src
├── hidumper.gni
├── interfaces
│ ├── innerkits
│ │ ├── BUILD.gn
│ │ ├── dump_usage.cpp
│ │ └── include
│ └── native
│ └── innerkits
├── LICENSE
├── OAT.xml
├── README.md
├── README_zh.md
├── sa_profile
├── services //服務實現
│ ├── BUILD.gn
│ ├── hidumper.map
│ ├── native
│ │ ├── etc
│ │ ├── include
│ │ └── src
│ └── zidl
│ ├── include
│ └── src
├── test
└── utils
- usage
"usage:\n"
" -h |help text for the tool\n"
" -lc |a list of system information clusters\n"
" -ls |a list of system abilities\n"
" -c |all system information clusters\n"
" -c [base system] |system information clusters labeled \"base\" and \"system\"\n"
" -s |all system abilities\n"
" -s [SA0 SA1] |system abilities labeled \"SA0\" and \"SA1\"\n"
" -s [SA] -a ['-h'] |system ability labeled \"SA\" with arguments \"-h\" specified\n"
" -e |faultlogs of crash history\n"
" --net |dump network information\n"
" --storage |dump storage information\n"
" -p |processes information, include list and infromation of processes"
" and threads\n"
" -p [pid] |dump threads under pid, includes smap, block channel,"
" execute time, mountinfo\n"
" --cpuusage [pid] |dump cpu usage by processes and category; if PID is specified,"
" dump category usage of specified pid\n"
" --cpufreq |dump real CPU frequency of each core\n"
" --mem [pid] |dump memory usage of total; dump memory usage of specified"
" pid if pid was specified\n"
" --zip |compress output to /data/log/hidumper\n";
如上,我們可以看出hidumper能查看幾乎OpenHarmony里內的所有信息,比如:
- 查看系統ability信息,其中也包括HiDumperService
# hidumper -ls
System ability list:
RenderService AbilityManagerService DataObserverMgr
UriPermissionMgr AccountMgr BundleMgr
FormMgr ApplicationManagerService Installd
AccessibilityManagerService UserIdmService UserAuthService
AuthExecutorMgrService PinAuthService FaceAuthService
WifiDevice WifiHotspot WifiP2p
WifiScan BluetoothHost NetConnManager
NetPolicyManager NetStatsManager NetTetheringManager
EthernetManager NetsysNative HiviewService
HiviewFaultLogger HiviewSysEventService HiDumperService
DistributedKvData DistributedSched EnterpriseDeviceManagerService
ResourceSched BackgroundTaskManager WorkSchedule
SocPerfService DeviceUsageStatistics MemoryManagerService
LocationGeoConvert LocationLocator LocationGnss
LocationNetworkLocating LocationNopowerLocating DeviceStatusService
AudioDistributed PlayerDistributedService CameraService
AudioPolicyService AVSessionService MultimodalInput
DistributedNotificationService CommonEventService PowerManagerService
BatteryService ThermalService BatteryStatisticsService
DisplayPowerManagerService AccessTokenManagerService PrivacyManagerService
KeystoreService CertManagerService SensorService
MiscDeviceService PasteboardService TimeService
InputMethodService ScreenlockService WallpaperManagerService
ParamWatcher SysParamDevice TelephonyCellularCall
TelephonyCellularData TelephonySmsMms TelephonyStateRegistry
TelephonyCoreService UsbService WindowManagerService
DisplayManagerService DSoftbus DeviceAuthService
DeviceManagerService StorageDaemon StorageManager
HdfDeviceServiceManager DistributedFileDaemon devattest_service
DistributedDeviceProfile UiService
- 查看系統ability信息,其中也包括HiDumperService
-------------------------------[ability]-------------------------------
----------------------------------RenderService---------------------------------
------Graphic2D--RenderSerice ------
Usage:
h |help text for the tool
screen |dump all screen infomation in the system
surface |dump all surface information
composer fps |dump the fps info of composer
[surface name] fps |dump the fps info of surface
composer fpsClear |clear the fps info of composer
[surface name] fpsClear |clear the fps info of surface
nodeNotOnTree |dump nodeNotOnTree info
allSurfacesMem |dump surface mem info
RSTree |dump RSTree info
EventParamList |dump EventParamList info
allInfo |dump all info
...后面有好多
- 查看系統網絡信息
#hidumper --net
-------------------------------[net]-------------------------------
cmd is: netstat -nW
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 127.0.0.1:44451 127.0.0.1:9877 ESTABLISHED
udp 0 0 127.0.0.1:37649 127.0.0.1:9877 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 1675 /dev/unix/socket/fd_holder
unix 74 [ ] DGRAM 344 /dev/unix/socket/hilogInput
unix 2 [ ] DGRAM 1719 /dev/unix/socket/hisysevent
unix 2 [ ] SEQPACKET 24844 /dev/unix/socket/hdcd
...后面還有好多
- 查看系統進程信息
#hidumper -p
-------------------------------[processes]-------------------------------
cmd is: ps -efT
UID PID TID PPID TCNT STIME TTY TIME CMD
root 1 1 0 1 15:55:05 ? 00:00:03 init --second-stage
root 2 2 0 1 15:55:05 ? 00:00:00 [kthreadd]
root 3 3 2 1 15:55:05 ? 00:00:00 [rcu_gp]
root 4 4 2 1 15:55:05 ? 00:00:00 [rcu_par_gp]
root 8 8 2 1 15:55:05 ? 00:00:00 [mm_percpu_wq]
root 9 9 2 1 15:55:05 ? 00:00:00 [rcu_tasks_rude_]
...后面還有好多
- 查看系統內存信息
#hidumper --mem
-------------------------------[memory]-------------------------------
Total Memory Usage by PID:
PID Name Total Pss(xxx in SwapPss) Total Vss Total Rss Total Uss GL Graph
1 init 1217(0 in SwapPss) kB 4612 kB 3600 kB 828 kB 0 kB 0 kB
241 watchdog_servic 260(0 in SwapPss) kB 3160 kB 2320 kB 232 kB 0 kB 0 kB
253 hilogd 2414(0 in SwapPss) kB 5968 kB 4576 kB 2252 kB 0 kB 0 kB
254 hdf_devmgr 600(0 in SwapPss) kB 6440 kB 3320 kB 496 kB 0 kB 0 kB
255 hiview 4780(0 in SwapPss) kB 79168 kB 14752 kB 3148 kB 0 kB 0 kB
256 storage_daemon 1539(0 in SwapPss) kB 11404 kB 7024 kB 932 kB 0 kB 0 kB
...后面有好多
- 查看系統錯誤
#hidumper -e
-------------------------------[faultlog]-------------------------------
/data/log/faultlog/faultlogger/jscrash-ohos.samples.videoplayer-20010040-20230328160126
Generated by HiviewDFX@OpenHarmony
================================================================
Device info:OpenHarmony 3.2
Build info:OpenHarmony 3.2.11.2
Module name:ohos.samples.videoplayer
Version:1.0.0
Pid:1763
Uid:20010040
Lifetime: 0.000000s
Js-Engine: ark
page: pages/Player.js
Error message: assertion (false) failed: type mismatch
Stacktrace:
at clearVideoPlayer (/ets/pages/Player.ets:213:7)
at onPageHide (/ets/pages/Player.ets:200:5)
...后面還有好多
從上面列舉的一些命令可以看出hidumper是個集成入口,有些用了Linux下的常規命令,如ps,netstat,有些用OH內特制的內容,如systemability,faultlog。
基本原理
- hidumper同OHOS里的其他服務一樣都提供framework和service架構,通過IPC方式通過hidumperservice服務執行具體命令。
- 功能定義:
在下面的問題提供三部分內容:
base/hiviewdfx/hidumper/frameworks/native/src/util/config_data.cpp
1. 功能定義
const std::string ConfigData::CONFIG_NAME_SPLIT = "_";
const std::string ConfigData::CONFIG_GROUP = "group";
...
const std::string ConfigData::CONFIG_DUMPER_LIST_SYSTEM_ABILITY = ConfigData::CONFIG_DUMPER_LIST_ + "system_ability";
...
const std::string ConfigData::STR_ABILITY = "ability";
const std::string ConfigData::STR_BASE = "base";
const std::string ConfigData::STR_SERVICE = "service";
const std::string ConfigData::STR_SYSTEM = "system";
2. dumper方法
const ConfigData::ItemCfg ConfigData::baseInfoDumper_[] = {
{
.name_ = "dumper_base_info",
.desc_ = "Base Information",
.target_ = "",
.section_ = "",
.class_ = DumperConstant::API_DUMPER,
.level_ = DumperConstant::NONE,
.loop_ = DumperConstant::NONE,
.filterCfg_ = "",
},
{
.name_ = "",
.desc_ = "",
.target_ = "",
.section_ = "",
.class_ = DumperConstant::FD_OUTPUT,
.level_ = DumperConstant::NONE,
.loop_ = DumperConstant::NONE,
.filterCfg_ = "",
},
};
3. 功能組定義
...
const std::string ConfigData::testGroup_[] = {
"dumper_test",
};
const ConfigData::GroupCfg ConfigData::groups_[] = {
{
.name_ = ConfigData::CONFIG_GROUP_CPU_FREQ,
.desc_ = "group of cpu freq dumper",
.list_ = cpuFreqGroup_,
.size_ = ARRAY_SIZE(cpuFreqGroup_),
.type_ = DumperConstant::GROUPTYPE_CPUID,
.expand_ = true,
},
...
- 簡單調用流程:
graph LR
main --> DumpManagerClient --> DumpManagerService --> DumpImplement
- 功能實現流程:
graph LR
CmdParse --> GetDumperConfigs --> GetExecutorConfigList --> setExecutorList --> SetProgressEnabled --> DumpDatas
- CmdParse: 解析命令。
- GetDumperConfigs: 獲取配置。
- GetExecutorConfigList: 根據配置獲取執行命令。
- setExecutorList: 生成執行命令列表,通過ptrExecutorFactoryMap_獲得對應executor。
- SetProgressEnabled: 設置執行開關。
- DumpDatas: 執行命令,獲取輸出信息。
- executor實現:
//命令調用
popen 對應 dumper里.class_ = DumperConstant::CMD_DUMPER,
//文件讀取
fdopen 對應 dumper里 .class_ = DumperConstant::FILE_DUMPER,
//api接口讀取
提供對應的API調用,如GetDisplayVersion, 對應 dumper里 .class_ = DumperConstant::API_DUMPER,
小結
本章我們講了hidumper,作為開發者的查詢工具,通過此工具可以查詢系統信息,服務信息,進程棧等信息。通過此工具可以協助開發者發現一些系統運行信息,比如進程,線程,內存,CPU等信息;當然也可自己根據具體內容實現實現自己的對應查看工具。
責任編輯:jianghua
來源:
51CTO 開源基礎軟件社區