1# hicollie.h 2 3## 概述 4 5HiCollie模块对外提供检测业务线程卡死、卡顿,以及上报卡死事件的能力。 6 7**引用文件:** <hicollie/hicollie.h> 8 9**库:** libohhicollie.so 10 11**系统能力:** SystemCapability.HiviewDFX.HiCollie 12 13**起始版本:** 12 14 15**相关模块:** [HiCollie](capi-hicollie.md) 16 17## 汇总 18 19### 结构体 20 21| 名称 | typedef关键字 | 描述 | 22| -- | -- | -- | 23| [HiCollie_DetectionParam](capi-hicollie-hicollie-detectionparam.md) | HiCollie_DetectionParam | 检测业务线程卡顿的相关参数。请注意,API 12及以上支持。 | 24| [HiCollie_SetTimerParam](capi-hicollie-hicollie-settimerparam.md) | HiCollie_SetTimerParam | 定义OH_HiCollie_SetTimer函数的输入参数。 | 25 26### 枚举 27 28| 名称 | typedef关键字 | 描述 | 29| -- | -- | -- | 30| [HiCollie_ErrorCode](#hicollie_errorcode) | HiCollie_ErrorCode | 错误码定义。 | 31| [HiCollie_Flag](#hicollie_flag) | HiCollie_Flag | 定义函数执行超时时发生的动作。 | 32 33### 函数 34 35| 名称 | typedef关键字 | 描述 | 36| -- | -- | -- | 37| [typedef void (\*OH_HiCollie_Task)(void)](#oh_hicollie_task) | OH_HiCollie_Task | 在业务线程卡死检测中,通过实现该函数来检测业务线程是否卡住。<br> HiCollie将在独立线程中每3秒调用一次该函数。<br> 例如:该函数可实现向业务线程发送消息,在业务线程接收到消息之后,设置一个标记,检查这个标记,确定业务线程是否卡住。 | 38| [typedef void (\*OH_HiCollie_BeginFunc)(const char* eventName)](#oh_hicollie_beginfunc) | OH_HiCollie_BeginFunc | 卡顿检测中,函数用于记录业务线程处理事件的开始时间。<br> 检查处理事件的执行时间,HiCollie将检查每个事件的持续时间。如果超过预设阈值,上报jank事件。<br> 该函数是在每个事件处理之前插入的回调函数。 | 39| [typedef void (\*OH_HiCollie_EndFunc)(const char* eventName)](#oh_hicollie_endfunc) | OH_HiCollie_EndFunc | 卡顿检测中, 该函数用于检测业务线程处理事件是否卡顿。<br> 检查处理事件的执行时间,HiCollie将检查每个事件的持续时间。如果超过预设阈值,上报jank事件。<br> 该函数是在每个事件处理之后插入的回调函数。 | 40| [HiCollie_ErrorCode OH_HiCollie_Init_StuckDetection(OH_HiCollie_Task task)](#oh_hicollie_init_stuckdetection) | - | 注册应用业务线程卡死的周期性检测任务。用户实现回调函数, 用于定时检测业务线程卡死情况。<br> 默认检测时间:3s上报BUSSINESS_THREAD_BLOCK_3S告警事件,6s上报BUSSINESS_THREAD_BLOCK_6S卡死事件。 | 41| [HiCollie_ErrorCode OH_HiCollie_Init_StuckDetectionWithTimeout(OH_HiCollie_Task task, uint32_t stuckTimeout)](#oh_hicollie_init_stuckdetectionwithtimeout) | - | 注册应用业务线程卡死的周期性检测任务。用户实现回调函数, 用于定时检测业务线程卡死情况。<br> 开发者可以设置卡死检测时间,可设置的时间范围:[3, 15],单位:秒。 | 42| [HiCollie_ErrorCode OH_HiCollie_Init_JankDetection(OH_HiCollie_BeginFunc* beginFunc,OH_HiCollie_EndFunc* endFunc, HiCollie_DetectionParam param)](#oh_hicollie_init_jankdetection) | - | 注册应用业务线程卡顿检测的回调函数。<br> 线程卡顿监控功能需要开发者实现两个卡顿检测回调函数, 分别放在业务线程处理事件的前后。作为插桩函数,监控业务线程处理事件执行情况。 | 43| [HiCollie_ErrorCode OH_HiCollie_Report(bool* isSixSecond)](#oh_hicollie_report) | - | 上报应用业务线程卡死事件,生成卡死故障日志,辅助定位应用卡死问题。<br> 先调用OH_HiCollie_Init_StuckDetection或OH_HiCollie_Init_StuckDetectionWithTimeout接口,初始化检测的task;<br> 如果task任务超时,结合业务逻辑,调用OH_HiCollie_Report接口上报卡死事件。 | 44| [typedef void (\*OH_HiCollie_Callback)(void*)](#oh_hicollie_callback) | OH_HiCollie_Callback | 当用户调用[OH_HiCollie_SetTimer](capi-hicollie-h.md#oh_hicollie_settimer)后,未在其自定义的任务超时时间阈值内调用[OH_HiCollie_CancelTimer](capi-hicollie-h.md#oh_hicollie_canceltimer),回调函数将被执行。 | 45| [HiCollie_ErrorCode OH_HiCollie_SetTimer(HiCollie_SetTimerParam param, int *id)](#oh_hicollie_settimer) | - | 注册定时器,用于检测函数或代码块执行是否超过自定义时间。<br> 结合OH_HiCollie_CancelTimer接口配套使用,应在调用耗时的函数之前使用。 | 46| [void OH_HiCollie_CancelTimer(int id)](#oh_hicollie_canceltimer) | - | 取消定时器。<br> 结合OH_HiCollie_SetTimer接口配套使用,执行函数或代码块后使用,OH_HiCollie_CancelTimer通过id将该任务取消;<br> 若未在自定义时间内取消,则执行回调函数,在特定自定义超时动作下,生成故障日志。 | 47 48## 枚举类型说明 49 50### HiCollie_ErrorCode 51 52``` 53enum HiCollie_ErrorCode 54``` 55 56**描述** 57 58错误码定义。 59 60**起始版本:** 12 61 62| 枚举项 | 描述 | 63| -- | -- | 64| HICOLLIE_SUCCESS = 0 | 成功。 | 65| HICOLLIE_INVALID_ARGUMENT = 401 | 无效参数。 | 66| HICOLLIE_WRONG_THREAD_CONTEXT = 29800001 | 调用线程错误。 | 67| HICOLLIE_REMOTE_FAILED = 29800002 | 远程调用错误。 | 68| HICOLLIE_INVALID_TIMER_NAME = 29800003 | 无效的函数执行超时检测器名称。<br>**起始版本:** 18 | 69| HICOLLIE_INVALID_TIMEOUT_VALUE = 29800004 | 无效的函数执行超时时间阈值。<br>**起始版本:** 18 | 70| HICOLLIE_WRONG_PROCESS_CONTEXT = 29800005 | 函数执行超时检测接入进程错误。<br>**起始版本:** 18 | 71| HICOLLIE_WRONG_TIMER_ID_OUTPUT_PARAM = 29800006 | 用于保存返回的计时器id的指针不应为NULL。<br>**起始版本:** 18 | 72 73### HiCollie_Flag 74 75``` 76enum HiCollie_Flag 77``` 78 79**描述** 80 81定义函数执行超时时发生的动作。 82 83**起始版本:** 18 84 85| 枚举项 | 描述 | 86| -- | -- | 87| HICOLLIE_FLAG_DEFAULT = (~0) | 默认动作,生成日志及查杀恢复。 | 88| HICOLLIE_FLAG_NOOP = (0) | 仅执行回调函数。 | 89| HICOLLIE_FLAG_LOG = (1 << 0) | 生成日志。 | 90| HICOLLIE_FLAG_RECOVERY = (1 << 1) | 执行查杀恢复。 | 91 92 93## 函数说明 94 95### OH_HiCollie_Task() 96 97``` 98typedef void (*OH_HiCollie_Task)(void) 99``` 100 101**描述** 102 103在业务线程卡死检测中,通过实现该函数来检测业务线程是否卡住。<br> HiCollie将在独立线程中每3秒调用一次该函数。<br> 例如:该函数可实现向业务线程发送消息,在业务线程接收到消息之后,设置一个标记,检查这个标记,确定业务线程是否卡住。 104 105**起始版本:** 12 106 107### OH_HiCollie_BeginFunc() 108 109``` 110typedef void (*OH_HiCollie_BeginFunc)(const char* eventName) 111``` 112 113**描述** 114 115卡顿检测中,函数用于记录业务线程处理事件的开始时间。<br> 检查处理事件的执行时间,HiCollie将检查每个事件的持续时间。如果超过预设阈值,上报jank事件。<br> 该函数是在每个事件处理之前插入的回调函数。 116 117**起始版本:** 12 118 119 120**参数:** 121 122| 参数项 | 描述 | 123| -- | -- | 124| const char* eventName | 业务线程处理事件的名字。 | 125 126### OH_HiCollie_EndFunc() 127 128``` 129typedef void (*OH_HiCollie_EndFunc)(const char* eventName) 130``` 131 132**描述** 133 134卡顿检测中, 该函数用于检测业务线程处理事件是否卡顿。<br> 检查处理事件的执行时间,HiCollie将检查每个事件的持续时间。如果超过预设阈值,上报jank事件。<br> 该函数是在每个事件处理之后插入的回调函数。 135 136**起始版本:** 12 137 138 139**参数:** 140 141| 参数项 | 描述 | 142| -- | -- | 143| const char* eventName | 业务线程处理事件的名字。 | 144 145### OH_HiCollie_Init_StuckDetection() 146 147``` 148HiCollie_ErrorCode OH_HiCollie_Init_StuckDetection(OH_HiCollie_Task task) 149``` 150 151**描述** 152 153注册应用业务线程卡死的周期性检测任务。用户实现回调函数, 用于定时检测业务线程卡死情况。<br> 默认检测时间:3s上报BUSSINESS_THREAD_BLOCK_3S告警事件,6s上报BUSSINESS_THREAD_BLOCK_6S卡死事件。 154 155**起始版本:** 12 156 157 158**参数:** 159 160| 参数项 | 描述 | 161| -- | -- | 162| [OH_HiCollie_Task](capi-hicollie-h.md#oh_hicollie_task) task | 每3秒执行一次的周期性检测任务,用于检测业务线程是否卡住。 | 163 164**返回:** 165 166| 类型 | 说明 | 167| -- | -- | 168| [HiCollie_ErrorCode](capi-hicollie-h.md#hicollie_errorcode) | [HICOLLIE_SUCCESS](capi-hicollie-h.md#hicollie_errorcode) 0 - 成功。<br> [HICOLLIE_WRONG_THREAD_CONTEXT](capi-hicollie-h.md#hicollie_errorcode) 29800001 - 调用线程错误。在非主线程中调用该函数。<br> 具体可参考[HiCollie_ErrorCode](capi-hicollie-h.md#hicollie_errorcode)。 | 169 170### OH_HiCollie_Init_StuckDetectionWithTimeout() 171 172``` 173HiCollie_ErrorCode OH_HiCollie_Init_StuckDetectionWithTimeout(OH_HiCollie_Task task, uint32_t stuckTimeout) 174``` 175 176**描述** 177 178注册应用业务线程卡死的周期性检测任务。用户实现回调函数, 用于定时检测业务线程卡死情况。<br> 开发者可以设置卡死检测时间,可设置的时间范围:[3, 15],单位:秒。 179 180**起始版本:** 18 181 182 183**参数:** 184 185| 参数项 | 描述 | 186| -- | -- | 187| [OH_HiCollie_Task](capi-hicollie-h.md#oh_hicollie_task) task | 每stuckTimeout时间执行一次的周期性检测任务,用于检测业务线程是否卡住。 | 188| uint32_t stuckTimeout | 检测业务线程卡死时间。任务执行超过stuckTimeout时间上报卡死告警事件;任务超过stuckTimeout * 2时间上报卡死事件。<br> 单位:s。规定:最大值15s,最小值3s。 | 189 190**返回:** 191 192| 类型 | 说明 | 193| -- | -- | 194| [HiCollie_ErrorCode](capi-hicollie-h.md#hicollie_errorcode) | [HICOLLIE_SUCCESS](capi-hicollie-h.md#hicollie_errorcode) 0 - 成功。<br> [HICOLLIE_INVALID_ARGUMENT](capi-hicollie-h.md#hicollie_errorcode) 401 - 卡死检测时间设置错误。<br> [HICOLLIE_WRONG_THREAD_CONTEXT](capi-hicollie-h.md#hicollie_errorcode) 29800001 - 调用线程错误。在非主线程中调用该函数。<br> 具体可参考[HiCollie_ErrorCode](capi-hicollie-h.md#hicollie_errorcode)。 | 195 196### OH_HiCollie_Init_JankDetection() 197 198``` 199HiCollie_ErrorCode OH_HiCollie_Init_JankDetection(OH_HiCollie_BeginFunc* beginFunc,OH_HiCollie_EndFunc* endFunc, HiCollie_DetectionParam param) 200``` 201 202**描述** 203 204注册应用业务线程卡顿检测的回调函数。<br> 线程卡顿监控功能需要开发者实现两个卡顿检测回调函数, 分别放在业务线程处理事件的前后。作为插桩函数,监控业务线程处理事件执行情况。 205 206**起始版本:** 12 207 208 209**参数:** 210 211| 参数项 | 描述 | 212| -- | -- | 213| [OH_HiCollie_BeginFunc](capi-hicollie-h.md#oh_hicollie_beginfunc)* beginFunc | 检测业务线程处理事件前的函数。 | 214| [OH_HiCollie_EndFunc](capi-hicollie-h.md#oh_hicollie_endfunc)* endFunc | 检测业务线程处理事件后的函数。 | 215| [HiCollie_DetectionParam](capi-hicollie-hicollie-detectionparam.md) param | 扩展参数以供将来使用。 | 216 217**返回:** 218 219| 类型 | 说明 | 220| -- | -- | 221| [HiCollie_ErrorCode](capi-hicollie-h.md#hicollie_errorcode) | [HICOLLIE_SUCCESS](capi-hicollie-h.md#hicollie_errorcode) 0 - 成功。<br> [HICOLLIE_INVALID_ARGUMENT](capi-hicollie-h.md#hicollie_errorcode) 401 - 开始函数和结束函数两者都必须有值或为空,否则将返回该错误值。<br> [HICOLLIE_WRONG_THREAD_CONTEXT](capi-hicollie-h.md#hicollie_errorcode) 29800001 - 调用线程错误。在非主线程中调用该函数。<br> 具体可参考[HiCollie_ErrorCode](capi-hicollie-h.md#hicollie_errorcode)。 | 222 223### OH_HiCollie_Report() 224 225``` 226HiCollie_ErrorCode OH_HiCollie_Report(bool* isSixSecond) 227``` 228 229**描述** 230 231上报应用业务线程卡死事件,生成卡死故障日志,辅助定位应用卡死问题。<br> 先调用OH_HiCollie_Init_StuckDetection或OH_HiCollie_Init_StuckDetectionWithTimeout接口,初始化检测的task;<br> 如果task任务超时,结合业务逻辑,调用OH_HiCollie_Report接口上报卡死事件。 232 233**起始版本:** 12 234 235 236**参数:** 237 238| 参数项 | 描述 | 239| -- | -- | 240| bool* isSixSecond | 布尔指针。布尔指针的值。如果卡住6秒,则为真。如果卡住3秒,则为False。 | 241 242**返回:** 243 244| 类型 | 说明 | 245| -- | -- | 246| [HiCollie_ErrorCode](capi-hicollie-h.md#hicollie_errorcode) | [HICOLLIE_SUCCESS](capi-hicollie-h.md#hicollie_errorcode) 0 - 成功。<br> [HICOLLIE_INVALID_ARGUMENT](capi-hicollie-h.md#hicollie_errorcode) 401 - 开始函数和结束函数两者都必须有值或为空,否则将返回该错误值。<br> [HICOLLIE_WRONG_THREAD_CONTEXT](capi-hicollie-h.md#hicollie_errorcode) 29800001 - 调用线程错误。在非主线程中调用该函数。<br> [HICOLLIE_REMOTE_FAILED](capi-hicollie-h.md#hicollie_errorcode) 29800002 - 远程调用错误。请求IPC远程服务失败。<br> 具体可参考[HiCollie_ErrorCode](capi-hicollie-h.md#hicollie_errorcode)。 | 247 248### OH_HiCollie_Callback() 249 250``` 251typedef void (*OH_HiCollie_Callback)(void*) 252``` 253 254**描述** 255 256当用户调用[OH_HiCollie_SetTimer](capi-hicollie-h.md#oh_hicollie_settimer)后,未在其自定义的任务超时时间阈值内调用[OH_HiCollie_CancelTimer](capi-hicollie-h.md#oh_hicollie_canceltimer),回调函数将被执行。 257 258**起始版本:** 18 259 260### OH_HiCollie_SetTimer() 261 262``` 263HiCollie_ErrorCode OH_HiCollie_SetTimer(HiCollie_SetTimerParam param, int *id) 264``` 265 266**描述** 267 268注册定时器,用于检测函数或代码块执行是否超过自定义时间。<br> 结合OH_HiCollie_CancelTimer接口配套使用,应在调用耗时的函数之前使用。 269 270**起始版本:** 18 271 272 273**参数:** 274 275| 参数项 | 描述 | 276| -- | -- | 277| [HiCollie_SetTimerParam](capi-hicollie-hicollie-settimerparam.md) param | 定义输入参数。 | 278| int *id | 用于保存返回的计时器id的指针,它不应为NULL。 | 279 280**返回:** 281 282| 类型 | 说明 | 283| -- | -- | 284| [HiCollie_ErrorCode](capi-hicollie-h.md#hicollie_errorcode) | [HICOLLIE_SUCCESS](capi-hicollie-h.md#hicollie_errorcode) 0 - 成功。<br> [HICOLLIE_INVALID_TIMER_NAME](capi-hicollie-h.md#hicollie_errorcode) 29800003 - 无效的计时器名称,不应为NULL或空字符串。<br> [HICOLLIE_INVALID_TIMEOUT_VALUE](capi-hicollie-h.md#hicollie_errorcode) 29800004 - 无效的超时值。<br> [HICOLLIE_WRONG_PROCESS_CONTEXT](capi-hicollie-h.md#hicollie_errorcode) 29800005 - 无效的接入检测进程上下文,appspawn与nativespawn进程中不可调用。<br> [HICOLLIE_WRONG_TIMER_ID_OUTPUT_PARAM](capi-hicollie-h.md#hicollie_errorcode) 29800006 - 用于保存返回的计时器id的指针,不应该为NULL。<br> 具体可参考[HiCollie_ErrorCode](capi-hicollie-h.md#hicollie_errorcode)。 | 285 286### OH_HiCollie_CancelTimer() 287 288``` 289void OH_HiCollie_CancelTimer(int id) 290``` 291 292**描述** 293 294取消定时器。<br> 结合OH_HiCollie_SetTimer接口配套使用,执行函数或代码块后使用,OH_HiCollie_CancelTimer通过id将该任务取消;<br> 若未在自定义时间内取消,则执行回调函数,在特定自定义超时动作下,生成故障日志。 295 296**起始版本:** 18 297 298 299**参数:** 300 301| 参数项 | 描述 | 302| -- | -- | 303| int id | 执行[OH_HiCollie_SetTimer](capi-hicollie-h.md#oh_hicollie_settimer)函数后更新的计时器id。 | 304 305 306