HarmonyOS鸿蒙Next中如何捕获 Native 层(C++)的崩溃日志?
HarmonyOS鸿蒙Next中如何捕获 Native 层(C++)的崩溃日志? 我们的 NAPI 模块偶发 crash,但拿不到堆栈。系统会记录 native crash 吗?
【解决方案】
开发者您好,FaultLog日志由系统自动从设备进行收集,HiAppEvent提供的C/C++接口订阅应用崩溃事件,参考文档:订阅崩溃事件(C/C++)。
【背景知识】
在HarmonyOS开发中,ErrorManager、HiAppEvent和FaultLogger三种崩溃收集方式存在显著差异,主要从作用范围、触发机制、使用场景和崩溃表现四方面区分:
| 方式 | 作用范围 | 触发方式 | 场景 | 崩溃表现 |
|---|---|---|---|---|
| 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++)崩溃日志主要有以下方式:
-
系统日志定位:系统默认会记录native崩溃信息,可通过
hilog工具查看。关键标签为CRASH,使用命令:hilog | grep CRASH可筛选崩溃事件,其中会包含进程ID、信号类型等基础信息。
-
生成崩溃转储文件:系统在崩溃时会生成
/data/log/faultlog/faultlogger/目录下的临时日志,但需主动触发保存。建议在应用启动时调用:#include <faultloggerd_client.h> FaultLoggerdClient::StartService(); // 初始化崩溃捕获服务崩溃后可在指定路径找到包含堆栈的完整报告。
-
自定义信号处理:针对信号类崩溃(如SIGSEGV),可在native代码中注册处理函数捕获堆栈:
#include <csignal> #include <unwind.h> void SignalHandler(int sig) { // 通过_unwind_backtrace等函数获取堆栈 SaveStackTraceToFile(); } signal(SIGSEGV, SignalHandler); -
使用开发工具:DevEco Studio的Profiler工具支持连接设备后实时捕获native崩溃事件,可视化显示堆栈调用关系。
注意:需在应用配置文件中声明ohos.permission.FAULT_LOG权限,并确保测试设备为debug版本以获取完整堆栈符号。

