合肥蜀山网站开发,双语网站开发,Wordpress的高级版,wordpress图片投票插件theme: z-blue
简介
Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志#xff0c;定位相关问题。
架构 Native In…
theme: z-blue
简介
Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志定位相关问题。
架构 Native InnerKits 接口 SignalHandler信号处理器接收系统异常信号触发抓取进程异常时的现场信息。BackTrace本地回栈库提供进程内本地回栈能力。DumpCatcher堆栈信息抓取工具库提供了抓取指定进程和线程的堆栈栈信息的能力。FaultloggerdClient崩溃临时日志管理客户端接收申请文件描述符、堆栈导出等请求。 Rust 接口 PanicHandlerRust PANIC故障处理器封装faultloggerd回栈能力支持rust模块PANIC故障回栈。Rustc DemangleRust 符号demangle库支持Rust模块mangled符号解析。 Faultlogger Daemon 服务 FaultloggerdServer核心服务处理模块接收并处理客户端的请求。FaultloggerdSecure权限校验模块对运行时崩溃日志生成和抓取提供权限管理和校验能力。FaultloggerdConfig崩溃临时日志管理模块。FaultloggerdPipe数据管道传输管理模块提供数据传输管道申请和管理能力。 工具 DumpCatcher Command Tool提供命令行形式的主动抓栈工具仅在Debug版本提供。ProcessDump进程信息抓取二进制工具通过命令行方式提供抓取指定进程、线程堆栈信息的能力。crasher崩溃构造器提供了崩溃构造和模拟能力。Rust Panic MakerRust PANIC 故障构造器提供了构造Rust模块的故障构造能力。
目前主要支持对以下C/C运行时崩溃异常信号的处理
信号值信号解释触发原因4SIGILL非法指令执行了非法指令通常是因为可执行文件本身出现错误或者试图执行数据段堆栈溢出时也有可能产生这个信号。5SIGTRAP断点或陷阱异常由断点指令或其它trap指令产生。6SIGABRTabort发出的信号调用abort函数生成的信号。7SIGBUS非法内存访问非法地址包括内存地址对齐alignment出错。比如访问一个四个字长的整数但其地址不是4的倍数。它与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的如访问不属于自己存储空间或只读存储空间。8SIGFPE浮点异常在发生致命的算术运算错误时发出不仅包括浮点运算错误还包括溢出及除数为0等其它所有的算术的错误。11SIGSEGV无效内存访问试图访问未分配给自己的内存或试图往没有写权限的内存地址写数据。16SIGSTKFLT栈溢出堆栈溢出。31SIGSYS系统调用异常非法的系统调用。
使用说明
进程崩溃日志生成
目前已默认开启进程因上述异常信号崩溃将会在设备 /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::vectorint pidV, std::string msg);
接口参数说明 接口返回值 true回栈成功回栈信息存储在msg字符串对象中false回栈失败。 输入参数 pid希望回栈的进程号如果需要回栈进程中的所有线程则tid设定为0tid希望回栈的线程号fd指定写入回栈信息的文件句柄 输出参数 msg如果回栈成功则通过msg输出回栈后的信息。 注意此接口需要调用者是管理员systemroot用户或者只抓取自己用户拥有的进程信息。 样例代码
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_Hdump_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 faultloggerdsubsystem_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_main116)
#13 pc 0000000000000938(00000000004a8938) /data/test/dumpcatcherdemo
#14 pc 00000000000008c4(00000000004a88c4) /data/test/dumpcatcherdemoDumpCatcher 命令行工具
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)调用栈类型。
返回打印说明如果栈信息解析成功则将信息显示到标准输出。 注意使用此接口需要调用者是管理员systemroot用户。 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 服务发送抓栈请求2AFaultloggerd 接收到抓栈请求鉴通过权和管道申请等操作后向目标进程发送 SIGDUMP(35) 信号触发主动抓栈3目前进程接收到 SIGDUMP(35) 抓栈信号后保存当前进程上下文fork出子进程执行 ProcessDump 二进制进行抓栈通过 Faultloggerd 申请到的管道返回调用栈数据4。
qr23.cn/AKFP8k请前往←学习更多鸿蒙开发 Rust Panic 故障日志收集流程
// TODO