鸿蒙开发实战:【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 上的“设置”应用程序。转到“辅助功能”。向下滚动并选择“触摸”。点击“辅助触控”。切换开关以打开 …...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...