鸿蒙开发实战:【Faultloggerd部件】
theme: z-blue
简介
Faultloggerd部件是OpenHarmony中C/C++运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件,Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志,定位相关问题。
架构

-
Native InnerKits 接口
- SignalHandler:信号处理器,接收系统异常信号,触发抓取进程异常时的现场信息。
- BackTrace:本地回栈库,提供进程内本地回栈能力。
- DumpCatcher:堆栈信息抓取工具库,提供了抓取指定进程和线程的堆栈栈信息的能力。
- FaultloggerdClient:崩溃临时日志管理客户端,接收申请文件描述符、堆栈导出等请求。
-
Rust 接口
- PanicHandler:Rust PANIC故障处理器,封装faultloggerd回栈能力支持rust模块PANIC故障回栈。
- Rustc Demangle:Rust 符号demangle库,支持Rust模块mangled符号解析。
-
Faultlogger Daemon 服务
- FaultloggerdServer:核心服务处理模块,接收并处理客户端的请求。
- FaultloggerdSecure:权限校验模块,对运行时崩溃日志生成和抓取提供权限管理和校验能力。
- FaultloggerdConfig:崩溃临时日志管理模块。
- FaultloggerdPipe:数据管道传输管理模块,提供数据传输管道申请和管理能力。
-
工具
- DumpCatcher Command Tool:提供命令行形式的主动抓栈工具,仅在Debug版本提供。
- ProcessDump:进程信息抓取二进制工具,通过命令行方式提供抓取指定进程、线程堆栈信息的能力。
- crasher:崩溃构造器,提供了崩溃构造和模拟能力。
- Rust Panic Maker:Rust PANIC 故障构造器,提供了构造Rust模块的故障构造能力。
目前主要支持对以下C/C++运行时崩溃异常信号的处理:
| 信号值 | 信号 | 解释 | 触发原因 |
|---|---|---|---|
| 4 | SIGILL | 非法指令 | 执行了非法指令,通常是因为可执行文件本身出现错误,或者试图执行数据段,堆栈溢出时也有可能产生这个信号。 |
| 5 | SIGTRAP | 断点或陷阱异常 | 由断点指令或其它trap指令产生。 |
| 6 | SIGABRT | abort发出的信号 | 调用abort函数生成的信号。 |
| 7 | SIGBUS | 非法内存访问 | 非法地址,包括内存地址对齐(alignment)出错。比如访问一个四个字长的整数,但其地址不是4的倍数。它与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。 |
| 8 | SIGFPE | 浮点异常 | 在发生致命的算术运算错误时发出,不仅包括浮点运算错误,还包括溢出及除数为0等其它所有的算术的错误。 |
| 11 | SIGSEGV | 无效内存访问 | 试图访问未分配给自己的内存,或试图往没有写权限的内存地址写数据。 |
| 16 | SIGSTKFLT | 栈溢出 | 堆栈溢出。 |
| 31 | SIGSYS | 系统调用异常 | 非法的系统调用。 |
使用说明
进程崩溃日志生成
目前已默认开启,进程因上述异常信号崩溃将会在设备 /data/log/faultlog/temp 目录下生成完整的崩溃日志,可基于该崩溃日志进行问题定位可分析。
DumpCatcher 接口
DumpCatcher是提供给第三方模块使用的抓取调用栈基础库,其中包含了打印指定进程(或线程)的栈信息的接口函数。目前支持CPP调用栈和CPP-JS混合栈。
接口类名:DfxDumpCatcher
接口定义:
- 默认:
bool DumpCatch(int pid, int tid, std::string& msg); - 支持混合栈:
bool DumpCatchMix(int pid, int tid, std::string& msg); - 支持输出到指定文件:
bool DumpCatchFd(int pid, int tid, std::string& msg, int fd); - 支持批量抓栈:
bool DumpCatchMultiPid(const std::vector<int> pidV, std::string& msg);
接口参数说明:
-
接口返回值:
true:回栈成功,回栈信息存储在msg字符串对象中;false:回栈失败。
-
输入参数:
pid:希望回栈的进程号,如果需要回栈进程中的所有线程,则tid设定为0;tid:希望回栈的线程号;fd:指定写入回栈信息的文件句柄;
-
输出参数:
msg:如果回栈成功,则通过msg输出回栈后的信息。
注意:此接口需要调用者是管理员(system,root)用户,或者只抓取自己用户拥有的进程信息。
样例代码:
- dump_catcher_demo.h
#ifndef DUMP_CATCHER_DEMO_H
#define DUMP_CATCHER_DEMO_H#include <inttypes.h>#define NOINLINE __attribute__((noinline))#define GEN_TEST_FUNCTION(FuncNumA, FuncNumB) \__attribute__((noinline)) int TestFunc##FuncNumA() \{ \return TestFunc##FuncNumB(); \}// test functions for callstack depth test
int TestFunc0(void);
int TestFunc1(void);
int TestFunc2(void);
int TestFunc3(void);
int TestFunc4(void);
int TestFunc5(void);
int TestFunc6(void);
int TestFunc7(void);
int TestFunc8(void);
int TestFunc9(void);
int TestFunc10(void);#endif // DUMP_CATCHER_DEMO_H
- dump_catcher_demo.cpp
#include "dump_catcher_demo.h"#include <iostream>
#include <string>
#include <unistd.h>
#include "dfx_dump_catcher.h"
using namespace std;NOINLINE int TestFunc10(void)
{OHOS::HiviewDFX::DfxDumpCatcher dumplog;string msg = "";bool ret = dumplog.DumpCatch(getpid(), gettid(), msg);if (ret) {cout << msg << endl;}return 0;
}// auto gen function
GEN_TEST_FUNCTION(0, 1)
GEN_TEST_FUNCTION(1, 2)
GEN_TEST_FUNCTION(2, 3)
GEN_TEST_FUNCTION(3, 4)
GEN_TEST_FUNCTION(4, 5)
GEN_TEST_FUNCTION(5, 6)
GEN_TEST_FUNCTION(6, 7)
GEN_TEST_FUNCTION(7, 8)
GEN_TEST_FUNCTION(8, 9)
GEN_TEST_FUNCTION(9, 10)int main(int argc, char *argv[])
{TestFunc0();return 0;
}
- BUILD.gn:
import("//base/hiviewdfx/faultloggerd/faultloggerd.gni")
import("//build/ohos.gni")config("dumpcatcherdemo_config") {visibility = [ ":*" ]include_dirs = [".","//utils/native/base/include","//base/hiviewdfx/faultloggerd/interfaces/innerkits/dump_catcher/include/",]
}ohos_executable("dumpcatcherdemo") {sources = [ "dump_catcher_demo.cpp" ]configs = [ ":dumpcatcherdemo_config" ]deps = ["//base/hiviewdfx/faultloggerd/interfaces/innerkits/dump_catcher:libdfx_dumpcatcher","//utils/native/base:utils",]external_deps = [ "hilog:libhilog" ]install_enable = truepart_name = "faultloggerd"subsystem_name = "hiviewdfx"
}
- 执行结果:
# ./dumpcatcherdemo
#00 pc 0000000000000981(00000000004a8981) /data/test/dumpcatcherdemo
#01 pc 0000000000000a6d(00000000004a8a6d) /data/test/dumpcatcherdemo
#02 pc 0000000000000a63(00000000004a8a63) /data/test/dumpcatcherdemo
#03 pc 0000000000000a59(00000000004a8a59) /data/test/dumpcatcherdemo
#04 pc 0000000000000a4f(00000000004a8a4f) /data/test/dumpcatcherdemo
#05 pc 0000000000000a45(00000000004a8a45) /data/test/dumpcatcherdemo
#06 pc 0000000000000a3b(00000000004a8a3b) /data/test/dumpcatcherdemo
#07 pc 0000000000000a31(00000000004a8a31) /data/test/dumpcatcherdemo
#08 pc 0000000000000a27(00000000004a8a27) /data/test/dumpcatcherdemo
#09 pc 0000000000000a1d(00000000004a8a1d) /data/test/dumpcatcherdemo
#10 pc 0000000000000a13(00000000004a8a13) /data/test/dumpcatcherdemo
#11 pc 0000000000000a77(00000000004a8a77) /data/test/dumpcatcherdemo
#12 pc 00000000000c2b08(00000000b6fafb08) /system/lib/ld-musl-arm.so.1(__libc_start_main+116)
#13 pc 0000000000000938(00000000004a8938) /data/test/dumpcatcherdemo
#14 pc 00000000000008c4(00000000004a88c4) /data/test/dumpcatcherdemo
DumpCatcher 命令行工具
DumpCatcher 是指提供给用户的一个抓取调用栈命令行工具,由 DumpCatcher innerkits 接口封装实现,该工具通过 -p、-t 参数指定进程和线程,以及 [-c -m -k] 可选参数指定抓栈的类型,命令执行后在命令行窗口打印指定的进程的线程栈信息。
工具名称:dumpcatcher
位置:/system/bin
参数说明:
-p [pid]:打印指定进程下面的所有线程栈信息;-p [pid] -t [tid]:打印指定进程下面的指定线程信息。[-c -m -k]:可选参数, 指定打印-c(pp)C++调用栈、-m(ix)C++ JS混合调用栈、-k(ernel)调用栈类型。
返回打印说明:如果栈信息解析成功,则将信息显示到标准输出。
注意:使用此接口需要调用者是管理员(system,root)用户。
Rust Panic 故障处理器
TODO
处理流程
进程崩溃抓栈处理流程

- 进程运行时异常崩溃后会收到来自
Kernel发送的崩溃信号,由进程在启动加载的SignalHandler模块进行信号处理; - 进程接收到崩溃信号后,保存当前进程上下文,fork 出子进程执行
ProcessDump二进制进行抓栈; ProcessDump向Faultloggerd申请文件句柄用于存储收集到的崩溃日志数据;ProcesDump将完整崩溃日志数据写入到/data/log/faultlog/temp目录下进行临时存储;ProcessDump收集完崩溃日志后,上报给Hiview进行后续处理;Hiview接收到新增进程崩溃故障数据后,提取简易的崩溃日志存储到/data/log/faultlog/faultlogger目录下,并生成HiSysevent故障事件。
DumpCatcher 接口/命令行工具 主动抓栈处理流程

- 进程A调用
DumpCatcher库提供的系列接口(1B),或通过DumpCatcher命令行工具(1A),申请dump指定进程和线程的堆栈信息; - 如果目前进程是当前进程,则直接调用
BackTrace Local提供的能力进行本地回栈输出(2B);如果不是,则向Faultloggerd服务发送抓栈请求(2A); Faultloggerd接收到抓栈请求,鉴通过权和管道申请等操作后,向目标进程发送SIGDUMP(35)信号触发主动抓栈(3);- 目前进程接收到
SIGDUMP(35)抓栈信号后,保存当前进程上下文,fork出子进程执行ProcessDump二进制进行抓栈,通过Faultloggerd申请到的管道返回调用栈数据(4)。
qr23.cn/AKFP8k请前往←学习更多鸿蒙开发

Rust Panic 故障日志收集流程
// TODO
相关文章:
鸿蒙开发实战:【Faultloggerd部件】
theme: z-blue 简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件,Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志,定位相关问题。 架构 Native In…...
蓝桥杯刷题|03普及-真题
[蓝桥杯 2017 省 B] k 倍区间 题目描述 给定一个长度为 N 的数列,,,⋯,如果其中一段连续的子序列 ,,⋯ (i≤j) 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗? 输入格式 …...
【动态三维重建】Deformable 3D Gaussians 可变形3D GS用于单目动态场景重建(CVPR 2024)
主页:https://ingra14m.github.io/Deformable-Gaussians/ 代码:https://github.com/ingra14m/Deformable-3D-Gaussians 论文:https://arxiv.org/abs/2309.13101 文章目录 摘要一、前言二、相关工作2.1 动态场景的神经渲染2.2 神经渲染加速 三…...
智能驾驶域控制器行业介绍
汽车智能驾驶功能持续高速渗透,带来智能驾驶域控制器市场空间快速增 长。智驾域控制器是智能驾驶决策环节的重要零部件,主要功能为处理感知 信息、进行规划决策等。其核心部件主要为计算芯片,英伟达、地平线等芯 片厂商市场地位突出。随着消费…...
[数据集][目标检测]焊接件表面缺陷检测数据集VOC+YOLO格式2292张10类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2292 标注数量(xml文件个数):2292 标注数量(txt文件个数):2292 标注…...
微信小程序的页面制作---常用组件及其属性
微信小程序里的组件就是html里的标签,但其组件都自带UI风格和特定的功能效果 一、常用组件 view(视图容器)、text(文本)、button(按钮)、image(图片)、form(…...
什么样的网站不适合使用WordPress?
WordPress作为全球应用最广泛的CMS系统,很好很强大,被从多的网站使用。但是,也不是所有的网站。下面简站WP小编从自己多年WordPress建站经验的角度,给大家讲讲,有哪些网站不适合使用WordPress搭建。 1、功能特别多的功…...
vulhub中GitLab 任意文件读取漏洞复现(CVE-2016-9086)
GitLab是一款Ruby开发的Git项目管理平台。在8.9版本后添加的“导出、导入项目”功能,因为没有处理好压缩包中的软连接,已登录用户可以利用这个功能读取服务器上的任意文件。 环境运行后,访问http://your-ip:8080即可查看GitLab主页࿰…...
【爬虫】web自动化和接口自动化
专栏文章索引:爬虫 目录 一、介绍 二、推荐 1.接口自动化 2.Web自动化 一、介绍 爬虫技术一般可以分为两种类型:接口自动化和web自动化。下面是它们的简要介绍: 1.接口自动化 接口自动化技术的主要目的是通过模拟HTTP请求来实现自动化…...
哔哩哔哩后端Java一面
前言 作者:晓宜 个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者 最近各大公司的春招和实习招聘都开始了,这里分享下去年面试B站的的一些问题,希望对大家有所帮助…...
Vue.js前端开发零基础教学(二)
目录 前言 2.1 单文件组件 2.2 数据绑定 2.2.2 响应式数据绑定 2.3 指令 2.3.1 内容渲染指令 2.3.2 属性绑定指令 编辑 2.3.3 事件绑定指令 2.3.4 双向数据绑定指令 2.3.5 条件渲染指令 2.3.6 列表渲染指令 2.4 事件对象 2.5 事件修饰符 学习目标&am…...
Bert模型输出:last_hidden_state转换为pooler_output
1. BERT模型的输出 在BERT模型中,last_hidden_state和pooler_output是两个不同的输出。 (1) last_hidden_state: last_hidden_state是指BERT模型中最后一个隐藏层的隐藏状态。它是一个三维张量,其形状为[batch_size, sequence_length, hidden_size]。其…...
Docker Compose 基本语法
services 是顶级节点,也就是你要启动的服务全部放在这里。 MySOL就是我们预期中的一个服务。 mysql8:指的是我们这个服务叫 mysql8. image:我们这个服务里运行的是什么镜像,或者说跑的是什么。这里指定了使用 mysql:8.0.29 这个版本。 command:启动命令&…...
【算法集训】基础算法:贪心
1913. 两个数对之间的最大乘积差 void insertSort(int * a, int n) {for(int i 1; i < n; i) {int temp a[i];int j i - 1;while(j > 0 && temp < a[j]) {a[j 1] a[j];j--;}a[j 1] temp;} }int maxProductDifference(int* nums, int numsSize){insert…...
Centos7部署单节点MongoDB(V4.2.25)
🎈 作者:互联网-小啊宇 🎈 简介: CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作,擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…...
隐私计算笔记(1)
一、可信流通体系 建立数据来源可确认、使用范围可界定、流通过程可追溯、安全风险可防范的数据可流通体系。 二、产生信任的基石 身份可确认利益可依赖能力有预期行为有后果 三、数据流通不可信风险 内循环:在内部循环中,数据持有方在其自身的运维…...
查询方法需要使用事务吗?
当数据库隔离级别是默认的可重复读(Repeatable Read)时,如果查询语句只有一条则不需要事务. 当有多条查询sql语句且需要确保多条sql语句处于同一时间维度时则需要使用事务来确保多条SQL语句处于同一时间节点. 相关知识点 mysql查询当前事务隔…...
剑指offer面试题40 数组中只出现一次的数字
考察点 异或运算,与运算知识点 题目 分析 本题目要求数组中只出现一次的俩个数字,并且要求O(1)时间复杂度和空间复杂度。试想一下如果只有一个数字出现一次,那么针对全部元素做异或运算就可以了,因为相同元素异或为0。现在有俩…...
gitLab server version 13.12.1 is not supported
拉代码的时候,报的这个错,实际上就是因为gitLab 版本太低了,这里不准备升级版本,打算继续使用账号密码来拉取代码 在idea已经安装的插件中,去掉gitlab插件,如下: 之后再拉取代码,就…...
如何在 iPhone 上使用蓝牙鼠标
iPhone 不支持使用传统的鼠标指针。 然而,有一个名为“AssistiveTouch”的功能可以在屏幕上模拟类似光标的指针。 启用它的方法如下: 打开 iPhone 上的“设置”应用程序。转到“辅助功能”。向下滚动并选择“触摸”。点击“辅助触控”。切换开关以打开 …...
机器学习赋能6G近场通信:从信道估计到波束赋形的智能革命
1. 项目概述:当6G遇见近场,为何机器学习成为破局关键?如果你关注过5G到6G的技术演进路线,会发现一个核心趋势:天线阵列的规模正在从“大规模”走向“极大规模”。这不仅仅是数量的堆砌,更是通信物理原理的一…...
小米MIMO最新邀请码
欢迎使用,各得10元体验金...
为什么92%的团队用DeepSeek生成方案仍需人工重写?揭秘缺失的2个元认知层与1套校验协议
更多请点击: https://intelliparadigm.com 第一章:为什么92%的团队用DeepSeek生成方案仍需人工重写?揭秘缺失的2个元认知层与1套校验协议 当团队将DeepSeek-R1或DeepSeek-VL模型用于技术方案生成时,表面看响应迅速、逻辑连贯&…...
在多轮对话应用中观察Taotoken计费对成本的影响
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在多轮对话应用中观察Taotoken计费对成本的影响 效果展示类,结合一个需要维护长上下文的多轮对话应用案例,…...
Web渗透测试能力成长地图:从工具使用到漏洞认知跃迁
1. 这不是工具清单,而是一张Web渗透测试的“能力成长地图”你刚点开这篇文章,大概率正站在两个路口之间:一边是网上铺天盖地的“十大免费扫描器推荐”,点进去全是截图下载链接一句“一键扫漏洞”,结果装完跑两下&#…...
基于Netburner NANO54415构建工业级嵌入式Web服务器:从硬件选型到广域监控实战
1. 项目概述:一个为广域与本地监控而生的嵌入式Web服务器如果你正在寻找一个能部署在野外、工厂角落或者任何需要远程数据采集与控制场景下的嵌入式Web服务器方案,并且对市面上那些要么性能孱弱、要么开发门槛极高的开发板感到厌倦,那么这个基…...
【python】ImportError: DLL load failed while importing QtWidgets: 找不到指定的程序。重新安装后搞定
文章目录前言一、PyQt6引用后报错二、使用步骤总结前言 想做个好看的界面,引用了PyQt6,却产生了新问题。 pip install pyqt6-tools,优先做这个动作进行修复。 一、PyQt6引用后报错 python里引用: from PyQt6.QtWidgets import…...
uWSGI目录穿越漏洞CVE-2018-7490深度利用与防御实战
1. 这不是“读文件”那么简单:uWSGI目录穿越在真实攻防链中的定位与误判代价你刚在Vulfocus靶场里跑通了CVE-2018-7490的PoC,用curl "http://target:8080/?p../../../../etc/passwd"成功读出了root:x:0:0:root:/root:/bin/bash,截…...
别再乱建索引了!用Explain的key_len字段,一眼看穿你的MySQL联合索引到底生效了几个字段
解密MySQL联合索引:用key_len精准判断索引生效范围 在数据库性能优化领域,联合索引的使用一直是个既基础又容易踩坑的话题。很多开发者虽然知道"最左匹配原则"这个名词,但在实际业务场景中,面对复杂的查询条件组合时&a…...
CentOS 8/Stream 8系统DNF换源后,安装软件还是慢?试试这几个排查命令和优化技巧
CentOS 8/Stream 8系统DNF换源后安装缓慢的深度排查与优化指南当你已经按照教程将CentOS 8/Stream 8的DNF源切换为国内镜像,却发现软件安装速度依然不尽如人意时,这种体验确实令人沮丧。作为长期使用CentOS系统的技术专家,我完全理解这种&quo…...
