• Home
Name Date Size #Lines LOC

..--

figures/12-May-2024-

interfaces/native/12-May-2024-258162

BUILD.gnD12-May-20241 KiB3330

LICENSED12-May-202410.1 KiB178150

README_zh.mdD12-May-20246.6 KiB201139

blackbox_adapter.cD12-May-20243 KiB11282

blackbox_core.cD12-May-202410.4 KiB333281

blackbox_detector.cD12-May-20241,017 3417

blackbox_detector.hD12-May-2024828 246

bundle.jsonD12-May-2024868 3635

README_zh.md

1# hiviewdfx_blackbox
2
3-   [简介](#简介)
4-   [目录](#目录)
5-   [运行流程](#运行流程)
6-   [系统调用接口定义](#系统调用接口定义)
7-   [重写接口](#重写接口)
8-   [相关仓](#相关仓)
9
10## 简介
11
12blackbox是帮助系统抓取保存LitOS死机重启故障现场信息的功能模块。
13blackbox功能包括故障信息获取,故障日志保存,死机重启等功能
14
15## 目录
16
17blackbox源代码目录结构如下:
18
19```
20/base/hiviewdfx/blackbox.
21├── blackbox_adapter.c                          #平台适配
22├── blackbox_core.c                             #blackbox核心代码
23├── blackbox_detector.c
24├── blackbox_detector.h
25└── interfaces                                  #公共接口
26    └── native
27        ├── innerkits
28        │   ├── blackbox.h
29        │   └── blackbox_adapter.h
30        └── kits
31            ├── blackbox.h
32            └── blackbox_adapter.h
33```
34
35## 运行流程
36
37blackbox运行流程如下:
38
39![](figures/zh-cn_image_0000001644475773.png)
40
41blackbox在开机的时候由内核启动,运行SaveErrorLog线程检测是否有日志需要储存在日志文件中。
42
43当开机以后BBoxInit和BBoxAdapterInit相继被初始化,重写的适配层函数被加载到blackbox_core。
44
45当内核初始化完成以后线程函数SaveErrorLog启动,SaveErrorLog通过重写的适配层函数进行日志信息查询和日志存储操作。当日志存储完成SaveErrorLog线程结束。
46
47在Hi3816芯片中,系统已经提供获取故障的接口hi_syserr_get,适配层函数SystemModuleGetLastLogInfo去芯片接口获得当前是否有故障信息。适配层函数SystemModuleSaveLastLog进行日志存储。具体详见[重写接口](#重写接口)
48
49## 系统调用接口定义
50
51### struct ErrorInfo
52
53```
54struct ErrorInfo {
55    char event[EVENT_MAX_LEN];
56    char module[MODULE_MAX_LEN];
57    char errorDesc[ERROR_DESC_MAX_LEN];
58};
59```
60
61故障信息结构体
62
63- 参数:
64  | 成员 | 类型 | 必填 | 说明 |
65  | -------- | -------- | -------- | -------- |
66  | event | char[] | 是 | 输入故障事件名称。 |
67  | module | char[] | 是 | 输入故障模式 |
68  | errorDesc | char[] | 是 | 故障信息描述 |
69
70### BBoxNotifyError
71
72```
73int BBoxNotifyError(const char event[EVENT_MAX_LEN], const char module[MODULE_MAX_LEN],
74    const char errorDesc[ERROR_DESC_MAX_LEN], int needSysReset);
75```
76
77该方法可以放在故障中断上下文中,当故障发生时,传入信息到,并且调用适配层函数SystemModuleDump获取故障数据,然后选择是否重启
78
79- 参数:
80  | 参数名 | 类型 | 必填 | 说明 |
81  | -------- | -------- | -------- | -------- |
82  | event | const char[] | 是 | 输入故障事件名称。 |
83  | module | const char[] | 是 | 输入故障模式,与BBoxAdapterInit注册的模式相匹配才能才能继续 |
84  | errorDesc | const char[] | 是 | 故障信息描述 |
85  | needSysReset | int | 是 | 是否重启,0:不重启;1:重启 |
86
87- 示例:
88
89在LitOS_A内核中OsUserExcHandle用户异常中断和OsExcHandleEntry系统异常中断中加入BBoxNotifyError通知blackbox进行相应处理
90
91对应位置kernel/liteos_a/arch/arm/arm/src/los_exc.c 577行和1212行。
92
93## 重写接口
94
95实例可以参考hi3861芯片的重写,对应位置为device/soc/hisilicon/hi3861v100/sdk_liteos/app/wifiiot_app/src/blackbox_adapter_impl.c
96
97### SystemModuleDump
98
99```
100void SystemModuleDump(const char *logDir, struct ErrorInfo *info);
101```
102
103重写系统dump函数,当系统出现异常调用BBoxNotifyError函数时,会被调用。可以进行数据的预处理:将异常栈信息等故障数据存储在特定内存区域中开机重启以后在生成日志;也可以选择在不重启的情况下保存故障数据到日志文件中。
104
105- 参数:
106  | 参数名 | 类型 | 必填 | 说明 |
107  | -------- | -------- | -------- | -------- |
108  | logDir | const char* | 是 | 日志路径。 |
109  | info | struct ErrorInfo* | 是 | 输入的故障信息 |
110
111### SystemModuleReset
112
113```
114void SystemModuleReset(struct ErrorInfo *info);
115```
116
117重写系统重启函数,当系统出现异常调用BBoxNotifyError函数时,会被调用。在重启之前进行相应的操作。
118
119- 参数:
120  | 参数名 | 类型 | 必填 | 说明 |
121  | -------- | -------- | -------- | -------- |
122  | info | struct ErrorInfo* | 是 | 输入的故障信息 |
123
124### SystemModuleGetLastLogInfo
125
126```
127int SystemModuleGetLastLogInfo(struct ErrorInfo *info);
128```
129
130重写获得日志信息函数,当重启之后的SaveErrorLog线程中,调用此接口判断是否有日志需要保存。
131
132- 参数:
133  | 参数名 | 类型 | 必填 | 说明 |
134  | -------- | -------- | -------- | -------- |
135  | info | struct ErrorInfo* | 是 | 输入的故障信息 |
136
137### SystemModuleSaveLastLog
138
139```
140int SystemModuleSaveLastLog(const char *logDir, struct ErrorInfo *info);
141```
142
143重写日志保存函数,当重启之后的SaveErrorLog线程中,调用此接口进行日志保存。
144
145- 参数:
146  | 参数名 | 类型 | 必填 | 说明 |
147  | -------- | -------- | -------- | -------- |
148  | logDir | const char* | 是 | 日志路径。 |
149  | info | struct ErrorInfo* | 是 | 输入的故障信息 |
150
151### FullWriteFile
152
153```
154int FullWriteFile(const char *filePath, const char *buf, unsigned int bufSize, int isAppend);
155```
156
157重写日志文件写操作函数。
158
159- 参数:
160  | 参数名 | 类型 | 必填 | 说明 |
161  | -------- | -------- | -------- | -------- |
162  | logDir | const char* | 是 | 日志路径。 |
163  | buf | const char* | 是 | 需要写入文件的数据 |
164  | bufSize | unsigned int | 是 | 需要写入数据大小 |
165  | isAppend | int | 是 | 是否为追加模式:0是覆写模式,清空当前文件全部内容:1是追加模式,向日志中追加数据 |
166
167### GetFaultLogPath
168
169```
170char *GetFaultLogPath(void);
171```
172
173返回需要保存的日志路径。
174
175- 返回值:
176  | 类型 | 说明 |
177  | -------- | -------- |
178  | char * | 返回日志存储的路径 |
179
180### RebootSystem
181
182```
183void RebootSystem(void);
184```
185
186调用系统重启函数
187
188## 相关仓
189
190[DFX子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/DFX%E5%AD%90%E7%B3%BB%E7%BB%9F.md)
191
192**hiviewdfx\_blackbox**
193
194[hiviewdfx\_hidumper\_lite](https://gitee.com/openharmony/hiviewdfx_hidumper_lite/blob/master/README_zh.md)
195
196[hiviewdfx\_hilog\_lite](https://gitee.com/openharmony/hiviewdfx_hilog_lite/blob/master/README_zh.md)
197
198[hiviewdfx\_hievent\_lite](https://gitee.com/openharmony/hiviewdfx_hievent_lite/blob/master/README_zh.md)
199
200[hiviewdfx\_hiview\_lite](https://gitee.com/openharmony/hiviewdfx_hiview_lite/blob/master/README_zh.md)
201