Name | Date | Size | #Lines | LOC | ||
---|---|---|---|---|---|---|
.. | - | - | ||||
figures/ | 12-May-2024 | - | ||||
interfaces/native/ | 12-May-2024 | - | 258 | 162 | ||
BUILD.gn | D | 12-May-2024 | 1 KiB | 33 | 30 | |
LICENSE | D | 12-May-2024 | 10.1 KiB | 178 | 150 | |
README_zh.md | D | 12-May-2024 | 6.6 KiB | 201 | 139 | |
blackbox_adapter.c | D | 12-May-2024 | 3 KiB | 112 | 82 | |
blackbox_core.c | D | 12-May-2024 | 10.4 KiB | 333 | 281 | |
blackbox_detector.c | D | 12-May-2024 | 1,017 | 34 | 17 | |
blackbox_detector.h | D | 12-May-2024 | 828 | 24 | 6 | |
bundle.json | D | 12-May-2024 | 868 | 36 | 35 |
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