harmony 鸿蒙使用HiCollie监控函数执行时间超长问题(C/C++)

  • 2025-06-12
  • 浏览 (5)

使用HiCollie监控函数执行时间超长问题(C/C++)

HiCollie模块对外提供函数执行时间超长的检测机制。

接口说明

接口名 描述
OH_HiCollie_SetTimer 注册定时器,用于检测函数或代码块执行是否超过自定义时间。
结合OH_HiCollie_CancelTimer接口配套使用,应在调用耗时的函数之前使用。
OH_HiCollie_CancelTimer 取消定时器。
结合OH_HiCollie_SetTimer接口配套使用,执行函数或代码块后使用,OH_HiCollie_CancelTimer通过id将该任务取消;
若未在自定义时间内取消,则执行回调函数,在特定自定义超时动作下,生成故障日志。
  • API接口的具体使用说明(参数使用限制、具体取值范围等)请参考HiCollie
  • 函数执行时间超长故障日志以syswarning-开头,生成在”设备/data/log/faultlog/faultlogger/”路径下。文件名格式为“syswarning-应用包名-应用UID-秒级时间.log”。

开发步骤

下文将展示如何在应用内增加一个按钮,并单击该按钮以调用HiCollie Ndk接口。

  1. 新建Native C++工程,目录结构如下:
   entry:
     src:
       main:
         cpp:
           - types:
               libentry:
                 - index.d.ts
           - CMakeLists.txt
           - napi_init.cpp
         ets:
           - entryability:
               - EntryAbility.ts
           - pages:
               - Index.ets
  1. 编辑”CMakeLists.txt”文件,添加源文件及动态库:
   # 依赖动态库libhilog_ndk.z.so(日志输出),libohhicollie.so(HiCollie对外检测接口)
   target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so libohhicollie.so)
  1. 编辑”napi_init.cpp”文件,导入依赖头文件、定义LOG_TAG与测试方法以及注册TestHiCollieTimerNdk为ArkTS接口:
   #include "napi/native_api.h"
   #include "hicollie/hicollie.h"
   #include "hilog/log.h"

   #include <unistd.h>

   #undef LOG_TAG
   #define LOG_TAG "testTag"

   //定义回调函数
   void CallBack(void*)
   {
     OH_LOG_INFO(LogType::LOG_APP, "HiCollieTimerNdk callBack");  // 回调函数中打印日志
   }

   static napi_value TestHiCollieTimerNdk(napi_env env, napi_callback_info info)
   {
     int id;
     HiCollie_SetTimerParam param = {"testTimer", 1, CallBack, nullptr, HiCollie_Flag::HICOLLIE_FLAG_LOG};  // 设置HiCollieTimer 参数(Timer任务名,超时时间,回调函数,回调函数参数,超时发生后行为)
     HiCollie_ErrorCode errorCode = OH_HiCollie_SetTimer(param, &id);  // 注册HiCollieTimer函数执行时长超时检测一次性任务
     if (errorCode == HICOLLIE_SUCCESS) {  // HiCollieTiimer任务注册成功
       OH_LOG_INFO(LogType::LOG_APP, "HiCollieTimer taskId: %{public}d", id); // 打印任务id
       sleep(2);  // 模拟执行耗时函数,在这里简单的将线程阻塞2s
       OH_HiCollie_CancelTimer(id);  // 根据id取消已注册任务
     }
     return 0;
   }

   EXTERN_C_START
   static napi_value Init(napi_env env, napi_value exports)
   {
       napi_property_descriptor desc[] = {
           { "TestHiCollieTimerNdk", nullptr, TestHiCollieTimerNdk, nullptr, nullptr, nullptr, napi_default, nullptr }      // 将TestHiCollieTimerNdk注册为ArkTS接口
      };
       napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
       return exports;
   }
   EXTERN_C_END

   static napi_module demoModule = {
       .nm_version = 1,
       .nm_flags = 0,
       .nm_filename = nullptr,
       .nm_register_func = Init,
       .nm_modname = "entry",
       .nm_priv = ((void*)0),
       .reserved = { 0 },
   };

   extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
   {
       napi_module_register(&demoModule);
   }
  1. 编辑”index.d.ts”文件,定义ArkTS接口:
   export const TestHiCollieTimerNdk: () => void;
  1. 编辑”Index.ets”文件:
   import testNapi from 'libentry.so';
   
   @Entry
   @Component
   struct Index {
     @State message: string = 'Hello World';
   
     build() {
       Row() {
         Column() {
           Button("TestHiCollieTimerNdk")
             .fontSize(50)
             .fontWeight(FontWeight.Bold)
             .onClick(testNapi.TestHiCollieTimerNdk);  //添加点击事件,触发TestHiCollieTimerNdk方法。
         }
         .width('100%')
       }
       .height('100%')
     }
   }
  1. 点击DevEco Studio界面中的运行按钮,运行应用工程:

  2. 在DevEco Studio的底部,切换到“Log->HiLog”窗口,设置日志的过滤条件为“testTag”:

点击“testHiCollieTimerNdk”按钮执行程序,日志窗口打印任务id:

   .../testTag ... HiCollieTimer taskId: x

等待2s后,执行回调函数,日志窗口打印:

   .../testTag ... HiCollieTimerNdk CallBack

获取故障文件信息相关内容可参考订阅任务执行超时事件(C/C++) 订阅获取。

你可能感兴趣的鸿蒙文章

harmony 鸿蒙Performance Analysis Kit(性能分析服务)

harmony 鸿蒙分析AppFreeze(应用无响应)

harmony 鸿蒙应用恢复开发指导

harmony 鸿蒙分析CppCrash(进程崩溃)

harmony 鸿蒙错误管理开发指导

harmony 鸿蒙hdc

harmony 鸿蒙事件上报

harmony 鸿蒙HiAppEvent介绍

harmony 鸿蒙订阅踩内存事件(ArkTS)

harmony 鸿蒙订阅踩内存事件(C/C++)

0  赞