HarmonyOS鸿蒙Next中如何捕获 Native 层(C++)的崩溃日志?

HarmonyOS鸿蒙Next中如何捕获 Native 层(C++)的崩溃日志? 我们的 NAPI 模块偶发 crash,但拿不到堆栈。系统会记录 native crash 吗?

3 回复

【解决方案】

开发者您好,FaultLog日志由系统自动从设备进行收集,HiAppEvent提供的C/C++接口订阅应用崩溃事件,参考文档:订阅崩溃事件(C/C++)

【背景知识】

在HarmonyOS开发中,ErrorManagerHiAppEventFaultLogger三种崩溃收集方式存在显著差异,主要从作用范围、触发机制、使用场景和崩溃表现四方面区分:

方式 作用范围 触发方式 场景 崩溃表现
ErrorManager JS崩溃、应用冻结 主动查询 错误通知(进程内处理) 抛出错误信息,进程不退出
FaultLogger JS崩溃、C++崩溃、应用冻结 观察者模式回调 主动查询近期故障日志(可实时) 抛出错误日志,进程不退出
HiAppEvent JS崩溃、C++崩溃、应用冻结 观察者模式回调 事件记录和监听(下次启动处理) 进程退出,下次进入应用时处理崩溃信息

注意:[@ohos.faultLogger (故障日志获取)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-faultlogger)接口从API version 18开始废弃使用,不再维护。后续版本推荐使用[@ohos.hiviewdfx.hiAppEvent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-hiviewdfx-hiappevent)订阅崩溃事件。

更多关于HarmonyOS鸿蒙Next中如何捕获 Native 层(C++)的崩溃日志?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,捕获Native层(C++)崩溃日志需使用鸿蒙NDK的崩溃信号处理机制。主要步骤包括:通过signal()sigaction()函数注册信号处理器(如SIGSEGV、SIGABRT),在处理器中调用backtrace()等函数获取堆栈信息,将信息写入文件或日志系统。可使用<csignal><unwind.h>等头文件。需在CMakeLists.txt中正确链接libunwind等库。

在HarmonyOS Next中,捕获Native层(C++)崩溃日志主要有以下方式:

  1. 系统日志定位:系统默认会记录native崩溃信息,可通过hilog工具查看。关键标签为CRASH,使用命令:

    hilog | grep CRASH
    

    可筛选崩溃事件,其中会包含进程ID、信号类型等基础信息。

  2. 生成崩溃转储文件:系统在崩溃时会生成/data/log/faultlog/faultlogger/目录下的临时日志,但需主动触发保存。建议在应用启动时调用:

    #include <faultloggerd_client.h>
    FaultLoggerdClient::StartService(); // 初始化崩溃捕获服务
    

    崩溃后可在指定路径找到包含堆栈的完整报告。

  3. 自定义信号处理:针对信号类崩溃(如SIGSEGV),可在native代码中注册处理函数捕获堆栈:

    #include <csignal>
    #include <unwind.h>
    
    void SignalHandler(int sig) {
      // 通过_unwind_backtrace等函数获取堆栈
      SaveStackTraceToFile();
    }
    signal(SIGSEGV, SignalHandler);
    
  4. 使用开发工具:DevEco Studio的Profiler工具支持连接设备后实时捕获native崩溃事件,可视化显示堆栈调用关系。

注意:需在应用配置文件中声明ohos.permission.FAULT_LOG权限,并确保测试设备为debug版本以获取完整堆栈符号。

回到顶部