147c9fbaeSopenharmony_ci# hiviewdfx_blackbox_lite
247c9fbaeSopenharmony_ci
347c9fbaeSopenharmony_ci-   [简介](#简介)
447c9fbaeSopenharmony_ci-   [目录](#目录)
547c9fbaeSopenharmony_ci-   [运行流程](#运行流程)
647c9fbaeSopenharmony_ci-   [系统调用接口定义](#系统调用接口定义)
747c9fbaeSopenharmony_ci-   [重写接口](#重写接口)
847c9fbaeSopenharmony_ci-   [相关仓](#相关仓)
947c9fbaeSopenharmony_ci
1047c9fbaeSopenharmony_ci## 简介
1147c9fbaeSopenharmony_ci
1247c9fbaeSopenharmony_ciblackbox_lite是帮助系统抓取保存LitOS死机重启故障现场信息的功能模块。
1347c9fbaeSopenharmony_ciblackbox_lite功能包括故障信息获取,故障日志保存,死机重启等功能
1447c9fbaeSopenharmony_ci
1547c9fbaeSopenharmony_ci## 目录
1647c9fbaeSopenharmony_ci
1747c9fbaeSopenharmony_ciblackbox_lite源代码目录结构如下:
1847c9fbaeSopenharmony_ci
1947c9fbaeSopenharmony_ci```
2047c9fbaeSopenharmony_ci/base/hiviewdfx/blackbox_lite.
2147c9fbaeSopenharmony_ci├── blackbox_adapter.c                          #平台适配
2247c9fbaeSopenharmony_ci├── blackbox_core.c                             #blackbox核心代码
2347c9fbaeSopenharmony_ci├── blackbox_detector.c
2447c9fbaeSopenharmony_ci├── blackbox_detector.h
2547c9fbaeSopenharmony_ci└── interfaces                                  #公共接口
2647c9fbaeSopenharmony_ci    └── native
2747c9fbaeSopenharmony_ci        ├── innerkits
2847c9fbaeSopenharmony_ci        │   ├── blackbox.h
2947c9fbaeSopenharmony_ci        │   └── blackbox_adapter.h
3047c9fbaeSopenharmony_ci        └── kits
3147c9fbaeSopenharmony_ci            ├── blackbox.h
3247c9fbaeSopenharmony_ci            └── blackbox_adapter.h
3347c9fbaeSopenharmony_ci```
3447c9fbaeSopenharmony_ci
3547c9fbaeSopenharmony_ci## 运行流程
3647c9fbaeSopenharmony_ci
3747c9fbaeSopenharmony_ciblackbox_lite运行流程如下:
3847c9fbaeSopenharmony_ci
3947c9fbaeSopenharmony_ci![](figures/zh-cn_image_0000001644475773.png)
4047c9fbaeSopenharmony_ci
4147c9fbaeSopenharmony_ciblackbox_lite在开机的时候由内核启动,运行SaveErrorLog线程检测是否有日志需要储存在日志文件中。
4247c9fbaeSopenharmony_ci
4347c9fbaeSopenharmony_ci当开机以后BBoxInit和BBoxAdapterInit相继被初始化,重写的适配层函数被加载到blackbox_core。
4447c9fbaeSopenharmony_ci
4547c9fbaeSopenharmony_ci当内核初始化完成以后线程函数SaveErrorLog启动,SaveErrorLog通过重写的适配层函数进行日志信息查询和日志存储操作。当日志存储完成SaveErrorLog线程结束。
4647c9fbaeSopenharmony_ci
4747c9fbaeSopenharmony_ci在Hi3816芯片中,系统已经提供获取故障的接口hi_syserr_get,适配层函数SystemModuleGetLastLogInfo去芯片接口获得当前是否有故障信息。适配层函数SystemModuleSaveLastLog进行日志存储。具体详见[重写接口](#重写接口)
4847c9fbaeSopenharmony_ci
4947c9fbaeSopenharmony_ci## 系统调用接口定义
5047c9fbaeSopenharmony_ci
5147c9fbaeSopenharmony_ci### struct ErrorInfo
5247c9fbaeSopenharmony_ci
5347c9fbaeSopenharmony_ci```
5447c9fbaeSopenharmony_cistruct ErrorInfo {
5547c9fbaeSopenharmony_ci    char event[EVENT_MAX_LEN];
5647c9fbaeSopenharmony_ci    char module[MODULE_MAX_LEN];
5747c9fbaeSopenharmony_ci    char errorDesc[ERROR_DESC_MAX_LEN];
5847c9fbaeSopenharmony_ci};
5947c9fbaeSopenharmony_ci```
6047c9fbaeSopenharmony_ci
6147c9fbaeSopenharmony_ci故障信息结构体
6247c9fbaeSopenharmony_ci
6347c9fbaeSopenharmony_ci- 参数:
6447c9fbaeSopenharmony_ci  | 成员 | 类型 | 必填 | 说明 |
6547c9fbaeSopenharmony_ci  | -------- | -------- | -------- | -------- |
6647c9fbaeSopenharmony_ci  | event | char[] | 是 | 输入故障事件名称。 |
6747c9fbaeSopenharmony_ci  | module | char[] | 是 | 输入故障模式 |
6847c9fbaeSopenharmony_ci  | errorDesc | char[] | 是 | 故障信息描述 |
6947c9fbaeSopenharmony_ci
7047c9fbaeSopenharmony_ci### BBoxNotifyError
7147c9fbaeSopenharmony_ci
7247c9fbaeSopenharmony_ci```
7347c9fbaeSopenharmony_ciint BBoxNotifyError(const char event[EVENT_MAX_LEN], const char module[MODULE_MAX_LEN],
7447c9fbaeSopenharmony_ci    const char errorDesc[ERROR_DESC_MAX_LEN], int needSysReset);
7547c9fbaeSopenharmony_ci```
7647c9fbaeSopenharmony_ci
7747c9fbaeSopenharmony_ci该方法可以放在故障中断上下文中,当故障发生时,传入信息到,并且调用适配层函数SystemModuleDump获取故障数据,然后选择是否重启
7847c9fbaeSopenharmony_ci
7947c9fbaeSopenharmony_ci- 参数:
8047c9fbaeSopenharmony_ci  | 参数名 | 类型 | 必填 | 说明 |
8147c9fbaeSopenharmony_ci  | -------- | -------- | -------- | -------- |
8247c9fbaeSopenharmony_ci  | event | const char[] | 是 | 输入故障事件名称。 |
8347c9fbaeSopenharmony_ci  | module | const char[] | 是 | 输入故障模式,与BBoxAdapterInit注册的模式相匹配才能才能继续 |
8447c9fbaeSopenharmony_ci  | errorDesc | const char[] | 是 | 故障信息描述 |
8547c9fbaeSopenharmony_ci  | needSysReset | int | 是 | 是否重启,0:不重启;1:重启 |
8647c9fbaeSopenharmony_ci
8747c9fbaeSopenharmony_ci- 示例:
8847c9fbaeSopenharmony_ci
8947c9fbaeSopenharmony_ci在LitOS_A内核中OsUserExcHandle用户异常中断和OsExcHandleEntry系统异常中断中加入BBoxNotifyError通知blackbox进行相应处理
9047c9fbaeSopenharmony_ci
9147c9fbaeSopenharmony_ci对应位置kernel/liteos_a/arch/arm/arm/src/los_exc.c 577行和1212行。
9247c9fbaeSopenharmony_ci
9347c9fbaeSopenharmony_ci## 重写接口
9447c9fbaeSopenharmony_ci
9547c9fbaeSopenharmony_ci实例可以参考hi3861芯片的重写,对应位置为device/soc/hisilicon/hi3861v100/sdk_liteos/app/wifiiot_app/src/blackbox_adapter_impl.c
9647c9fbaeSopenharmony_ci
9747c9fbaeSopenharmony_ci### SystemModuleDump
9847c9fbaeSopenharmony_ci
9947c9fbaeSopenharmony_ci```
10047c9fbaeSopenharmony_civoid SystemModuleDump(const char *logDir, struct ErrorInfo *info);
10147c9fbaeSopenharmony_ci```
10247c9fbaeSopenharmony_ci
10347c9fbaeSopenharmony_ci重写系统dump函数,当系统出现异常调用BBoxNotifyError函数时,会被调用。可以进行数据的预处理:将异常栈信息等故障数据存储在特定内存区域中开机重启以后在生成日志;也可以选择在不重启的情况下保存故障数据到日志文件中。
10447c9fbaeSopenharmony_ci
10547c9fbaeSopenharmony_ci- 参数:
10647c9fbaeSopenharmony_ci  | 参数名 | 类型 | 必填 | 说明 |
10747c9fbaeSopenharmony_ci  | -------- | -------- | -------- | -------- |
10847c9fbaeSopenharmony_ci  | logDir | const char* | 是 | 日志路径。 |
10947c9fbaeSopenharmony_ci  | info | struct ErrorInfo* | 是 | 输入的故障信息 |
11047c9fbaeSopenharmony_ci
11147c9fbaeSopenharmony_ci### SystemModuleReset
11247c9fbaeSopenharmony_ci
11347c9fbaeSopenharmony_ci```
11447c9fbaeSopenharmony_civoid SystemModuleReset(struct ErrorInfo *info);
11547c9fbaeSopenharmony_ci```
11647c9fbaeSopenharmony_ci
11747c9fbaeSopenharmony_ci重写系统重启函数,当系统出现异常调用BBoxNotifyError函数时,会被调用。在重启之前进行相应的操作。
11847c9fbaeSopenharmony_ci
11947c9fbaeSopenharmony_ci- 参数:
12047c9fbaeSopenharmony_ci  | 参数名 | 类型 | 必填 | 说明 |
12147c9fbaeSopenharmony_ci  | -------- | -------- | -------- | -------- |
12247c9fbaeSopenharmony_ci  | info | struct ErrorInfo* | 是 | 输入的故障信息 |
12347c9fbaeSopenharmony_ci
12447c9fbaeSopenharmony_ci### SystemModuleGetLastLogInfo
12547c9fbaeSopenharmony_ci
12647c9fbaeSopenharmony_ci```
12747c9fbaeSopenharmony_ciint SystemModuleGetLastLogInfo(struct ErrorInfo *info);
12847c9fbaeSopenharmony_ci```
12947c9fbaeSopenharmony_ci
13047c9fbaeSopenharmony_ci重写获得日志信息函数,当重启之后的SaveErrorLog线程中,调用此接口判断是否有日志需要保存。
13147c9fbaeSopenharmony_ci
13247c9fbaeSopenharmony_ci- 参数:
13347c9fbaeSopenharmony_ci  | 参数名 | 类型 | 必填 | 说明 |
13447c9fbaeSopenharmony_ci  | -------- | -------- | -------- | -------- |
13547c9fbaeSopenharmony_ci  | info | struct ErrorInfo* | 是 | 输入的故障信息 |
13647c9fbaeSopenharmony_ci
13747c9fbaeSopenharmony_ci### SystemModuleSaveLastLog
13847c9fbaeSopenharmony_ci
13947c9fbaeSopenharmony_ci```
14047c9fbaeSopenharmony_ciint SystemModuleSaveLastLog(const char *logDir, struct ErrorInfo *info);
14147c9fbaeSopenharmony_ci```
14247c9fbaeSopenharmony_ci
14347c9fbaeSopenharmony_ci重写日志保存函数,当重启之后的SaveErrorLog线程中,调用此接口进行日志保存。
14447c9fbaeSopenharmony_ci
14547c9fbaeSopenharmony_ci- 参数:
14647c9fbaeSopenharmony_ci  | 参数名 | 类型 | 必填 | 说明 |
14747c9fbaeSopenharmony_ci  | -------- | -------- | -------- | -------- |
14847c9fbaeSopenharmony_ci  | logDir | const char* | 是 | 日志路径。 |
14947c9fbaeSopenharmony_ci  | info | struct ErrorInfo* | 是 | 输入的故障信息 |
15047c9fbaeSopenharmony_ci
15147c9fbaeSopenharmony_ci### FullWriteFile
15247c9fbaeSopenharmony_ci
15347c9fbaeSopenharmony_ci```
15447c9fbaeSopenharmony_ciint FullWriteFile(const char *filePath, const char *buf, unsigned int bufSize, int isAppend);
15547c9fbaeSopenharmony_ci```
15647c9fbaeSopenharmony_ci
15747c9fbaeSopenharmony_ci重写日志文件写操作函数。
15847c9fbaeSopenharmony_ci
15947c9fbaeSopenharmony_ci- 参数:
16047c9fbaeSopenharmony_ci  | 参数名 | 类型 | 必填 | 说明 |
16147c9fbaeSopenharmony_ci  | -------- | -------- | -------- | -------- |
16247c9fbaeSopenharmony_ci  | logDir | const char* | 是 | 日志路径。 |
16347c9fbaeSopenharmony_ci  | buf | const char* | 是 | 需要写入文件的数据 |
16447c9fbaeSopenharmony_ci  | bufSize | unsigned int | 是 | 需要写入数据大小 |
16547c9fbaeSopenharmony_ci  | isAppend | int | 是 | 是否为追加模式:0是覆写模式,清空当前文件全部内容:1是追加模式,向日志中追加数据 |
16647c9fbaeSopenharmony_ci
16747c9fbaeSopenharmony_ci### GetFaultLogPath
16847c9fbaeSopenharmony_ci
16947c9fbaeSopenharmony_ci```
17047c9fbaeSopenharmony_cichar *GetFaultLogPath(void);
17147c9fbaeSopenharmony_ci```
17247c9fbaeSopenharmony_ci
17347c9fbaeSopenharmony_ci返回需要保存的日志路径。
17447c9fbaeSopenharmony_ci
17547c9fbaeSopenharmony_ci- 返回值:
17647c9fbaeSopenharmony_ci  | 类型 | 说明 |
17747c9fbaeSopenharmony_ci  | -------- | -------- |
17847c9fbaeSopenharmony_ci  | char * | 返回日志存储的路径 |
17947c9fbaeSopenharmony_ci
18047c9fbaeSopenharmony_ci### RebootSystem
18147c9fbaeSopenharmony_ci
18247c9fbaeSopenharmony_ci```
18347c9fbaeSopenharmony_civoid RebootSystem(void); 
18447c9fbaeSopenharmony_ci```
18547c9fbaeSopenharmony_ci
18647c9fbaeSopenharmony_ci调用系统重启函数
18747c9fbaeSopenharmony_ci
18847c9fbaeSopenharmony_ci## 相关仓
18947c9fbaeSopenharmony_ci
19047c9fbaeSopenharmony_ci[DFX子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/DFX%E5%AD%90%E7%B3%BB%E7%BB%9F.md)
19147c9fbaeSopenharmony_ci
19247c9fbaeSopenharmony_ci**hiviewdfx\_blackbox\_lite**
19347c9fbaeSopenharmony_ci
19447c9fbaeSopenharmony_ci[hiviewdfx\_hidumper\_lite](https://gitee.com/openharmony/hiviewdfx_hidumper_lite/blob/master/README_zh.md)
19547c9fbaeSopenharmony_ci
19647c9fbaeSopenharmony_ci[hiviewdfx\_hilog\_lite](https://gitee.com/openharmony/hiviewdfx_hilog_lite/blob/master/README_zh.md)
19747c9fbaeSopenharmony_ci
19847c9fbaeSopenharmony_ci[hiviewdfx\_hievent\_lite](https://gitee.com/openharmony/hiviewdfx_hievent_lite/blob/master/README_zh.md)
19947c9fbaeSopenharmony_ci
20047c9fbaeSopenharmony_ci[hiviewdfx\_hiview\_lite](https://gitee.com/openharmony/hiviewdfx_hiview_lite/blob/master/README_zh.md)
201