色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙實戰開發:【FaultLoggerd組件】講解

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-12 16:22 ? 次閱讀

簡介

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++運行時崩潰異常信號的處理:

信號值信號解釋觸發原因
4SIGILL非法指令執行了非法指令,通常是因為可執行文件本身出現錯誤,或者試圖執行數據段,堆棧溢出時也有可能產生這個信號。
5SIGTRAP斷點或陷阱異常由斷點指令或其它trap指令產生。
6SIGABRTabort發出的信號調用abort函數生成的信號。
7SIGBUS非法內存訪問非法地址,包括內存地址對齊(alignment)出錯。比如訪問一個四個字長的整數,但其地址不是4的倍數。它與SIGSEGV的區別在于后者是由于對合法存儲地址的非法訪問觸發的(如訪問不屬于自己存儲空間或只讀存儲空間)。
8SIGFPE浮點異常在發生致命的算術運算錯誤時發出,不僅包括浮點運算錯誤,還包括溢出及除數為0等其它所有的算術的錯誤。
11SIGSEGV無效內存訪問試圖訪問未分配給自己的內存,或試圖往沒有寫權限的內存地址寫數據。
16SIGSTKFLT棧溢出堆棧溢出。
31SIGSYS系統調用異常非法的系統調用。

目錄

faultloggerd/
├── OAT.xml
├── common                                 # 工具庫和公共定義
├── docs                                   # 文檔
├── example                                # 樣例代碼
├── frameworks                             # 主動抓棧實現
├── interfaces
│   ├── innerkits
│   │   ├── backtrace                      # 本地回棧庫
│   │   ├── dump_catcher                   # 抓取調用?;A庫
│   │   ├── faultloggerd_client            # 崩潰臨時日志管理服務客戶端接口
│   │   └── signal_handler                 # 異常信號處理器
│   └── rust
│       ├── panic_handler                  # Rust Panic 處理器
│       ├── panic_report                   # Rust Panic 故障上報庫
│       └── rustc_demangle                 # Rust demangle 庫
├── services                               # faultloggerd 常駐服務
├── test
│   ├── funchook                           # hook 工具測試用例
│   ├── fuzztest                           # 模糊測試用例
│   ├── moduletest                         # 模塊測試用例
│   ├── performancetest                    # 性能測試用例
│   ├── systemtest                         # 系統測試用例
│   └── unittest                           # 單元測試用例
└── tools
    ├── crasher_c                          # 崩潰構造器(C)
    ├── crasher_cpp                        # 崩潰構造器(C++)
    ├── dump_catcher                       # DumpCatcher 命令行工具
    ├── panic_maker                        # Rust Panic 故障構造器
    └── process_dump                       # 崩潰抓棧實現

使用說明

進程崩潰日志生成

目前已默認開啟,進程因上述異常信號崩潰將會在設備 /data/log/faultlog/temp 目錄下生成完整的崩潰日志,可基于該崩潰日志進行問題定位可分析。

DumpCatcher 接口

DumpCatcher是提供給第三方模塊使用的抓取調用?;A庫,其中包含了打印指定進程(或線程)的棧信息的接口函數。目前支持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 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("http://base/hiviewdfx/faultloggerd/faultloggerd.gni")
import("http://build/ohos.gni")

config("dumpcatcherdemo_config") {
  visibility = [ ":*" ]

  include_dirs = [
    ".",
    "http://utils/native/base/include",
    "http://base/hiviewdfx/faultloggerd/interfaces/innerkits/dump_catcher/include/",
  ]
}

ohos_executable("dumpcatcherdemo") {
  sources = [ "dump_catcher_demo.cpp" ]

  configs = [ ":dumpcatcherdemo_config" ]

  deps = [
    "http://base/hiviewdfx/faultloggerd/interfaces/innerkits/dump_catcher:libdfx_dumpcatcher",
    "http://utils/native/base:utils",
  ]

  external_deps = [ "hilog:libhilog" ]

  install_enable = true
  part_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

處理流程

進程崩潰抓棧處理流程

進程崩潰抓棧處理流程

  1. 進程運行時異常崩潰后會收到來自 Kernel 發送的崩潰信號,由進程在啟動加載的 SignalHandler 模塊進行信號處理;
  2. 進程接收到崩潰信號后,保存當前進程上下文,fork 出子進程執行 ProcessDump 二進制進行抓棧;
  3. ProcessDumpFaultloggerd 申請文件句柄用于存儲收集到的崩潰日志數據;
  4. ProcesDump 將完整崩潰日志數據寫入到 /data/log/faultlog/temp 目錄下進行臨時存儲;
  5. ProcessDump 收集完崩潰日志后,上報給 Hiview 進行后續處理;
  6. Hiview 接收到新增進程崩潰故障數據后,提取簡易的崩潰日志存儲到 /data/log/faultlog/faultlogger 目錄下,并生成 HiSysevent 故障事件。

DumpCatcher 接口/命令行工具 主動抓棧處理流程

DumpCatcher主動抓棧處理流程圖

  1. 進程A調用DumpCatcher庫提供的系列接口(1B),或通過 DumpCatcher 命令行工具(1A),申請dump指定進程和線程的堆棧信息;
  2. 如果目前進程是當前進程,則直接調用 BackTrace Local 提供的能力進行本地回棧輸出(2B);如果不是,則向 Faultloggerd 服務發送抓棧請求(2A);
  3. Faultloggerd 接收到抓棧請求,鑒通過權和管道申請等操作后,向目標進程發送 SIGDUMP(35) 信號觸發主動抓棧(3);
  4. 目前進程接收到 SIGDUMP(35) 抓棧信號后,保存當前進程上下文,fork出子進程執行 ProcessDump 二進制進行抓棧,通過 Faultloggerd 申請到的管道返回調用棧數據(4)。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 程序員
    +關注

    關注

    4

    文章

    952

    瀏覽量

    29807
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2634

    瀏覽量

    66364
  • HarmonyOS
    +關注

    關注

    79

    文章

    1977

    瀏覽量

    30227
  • OpenHarmony
    +關注

    關注

    25

    文章

    3723

    瀏覽量

    16335
收藏 人收藏

    評論

    相關推薦

    鴻蒙基礎開發實戰-(ArkTS)像素轉換

    的使用。通過像素轉換案例,向開發講解了如何使用像素單位設置組件的尺寸、字體的大小以及不同像素單位之間的轉換方法。更多鴻蒙4.0的學習,可以前往主頁學習或前往《
    發表于 01-11 16:53

    鴻蒙開發基礎-Web組件之cookie操作

    }) ... } ... 本文章主要是對鴻蒙開發當中ArkTS語言的基礎應用實戰,Web組件里的cookie操作。更多的鴻蒙應用
    發表于 01-14 21:31

    鴻蒙開發OpenHarmony組件復用案例

    ) } }, item => item) } } } 本文主要是對鴻蒙開發基礎當中的OpenHarmony技術組件復用示例, 更多鴻蒙開發
    發表于 01-15 17:37

    鴻蒙實戰項目開發:【短信服務】

    、OpenHarmony 多媒體技術、Napi組件、OpenHarmony內核、Harmony南向開發、鴻蒙項目實戰等等)鴻蒙(Harmon
    發表于 03-03 21:29

    HarmonyOS實戰開發-深度探索與打造個性化自定義組件

    今天分享一下 什么是自定義組件?及其自定義組件實戰。 做過前端或者android開發的都知道自定義組件,
    發表于 05-08 16:30

    鴻蒙Flutter實戰:07混合開發

    # 鴻蒙Flutter實戰:混合開發 鴻蒙Flutter混合開發主要有兩種形式。 ## 1.基于har 將flutter module
    發表于 10-23 16:00

    鴻蒙Flutter實戰:14-現有Flutter 項目支持鴻蒙 II

    分別安裝官方的3.22版本,以及鴻蒙社區的 3.22.0 版本 3.搭建 Flutter鴻蒙開發環境 參考文章《鴻蒙Flutter實戰:0
    發表于 12-26 14:59

    微信小程序如何開發?微信小程序教程視頻常用組件API開發項目實戰

    本文檔的主要內容介紹的是微信小程序如何開發?微信小程序教程視頻微信小程序入門與實戰 常用組件API開發技巧項目實戰詳細的介紹了
    發表于 08-28 14:41 ?88次下載

    鴻蒙官方開發板功能講解介紹

    鴻蒙官方開發板功能講解,不同設備的硬件和軟件差異比較。
    的頭像 發表于 12-01 17:58 ?4400次閱讀

    鴻蒙ArkUI開發-Tabs組件的使用

    鴻蒙ArkUI開發-Tabs組件的使用
    的頭像 發表于 01-19 16:01 ?1922次閱讀
    <b class='flag-5'>鴻蒙</b>ArkUI<b class='flag-5'>開發</b>-Tabs<b class='flag-5'>組件</b>的使用

    鴻蒙開發【設備開發基礎知識】

    鴻蒙開發基礎知識講解
    的頭像 發表于 01-29 18:44 ?1026次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>【設備<b class='flag-5'>開發</b>基礎知識】

    鴻蒙實戰開發Camera組件:【相機】

    相機組件支持相機業務的開發,開發者可以通過已開放的接口實現相機硬件的訪問、操作和新功能開發,最常見的操作如:預覽、拍照和錄像等。
    的頭像 發表于 03-08 16:20 ?627次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>實戰</b><b class='flag-5'>開發</b>Camera<b class='flag-5'>組件</b>:【相機】

    鴻蒙開發實戰:【性能調優組件

    性能調優組件包含系統和應用調優框架,旨在為開發者提供一套性能調優平臺,可以用來分析內存、性能等問題
    的頭像 發表于 03-13 15:12 ?445次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b><b class='flag-5'>實戰</b>:【性能調優<b class='flag-5'>組件</b>】

    鴻蒙開發實戰:【藍牙組件

    藍牙服務組件為設備提供接入與使用Bluetooth的相關接口,包括BLE設備gatt相關的操作,以及BLE廣播、掃描等功能。
    的頭像 發表于 03-13 17:27 ?766次閱讀

    鴻蒙實戰開發學習【FaultLoggerd組件

    Faultloggerd部件是OpenHarmony中C/C++運行時崩潰臨時日志的生成及管理模塊。面向基于 Rust 開發的部件,Faultloggerd 提供了Rust Panic故障日志生成能力。系統
    的頭像 發表于 03-17 20:39 ?516次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>實戰</b><b class='flag-5'>開發</b>學習【<b class='flag-5'>FaultLoggerd</b><b class='flag-5'>組件</b>】
    主站蜘蛛池模板: 成人五级毛片免费播放| 97综合久久| 24小时日本在线| 狠狠色丁香婷婷久久综合| 视频一区国产在线二区| 97伦理97伦理2018最新| 久久中文字幕乱码免费| 一本道久在线综合色色| 国语自产拍大学生在线观看| 午夜伦理一yy4480影院| 国产成人免费高清激情视频| 日产精品高潮呻吟AV久久| 边做边爱BD免费看片| 日本午夜精品一区二区三区电影| 99久久99久久精品| 欧美一道本一区二区三区| 扒开屁股眼往里面夹东西| 日韩做A爰片久久毛片A片毛茸茸| 成人在无码AV在线观看一| 色女仆影院| 国产午夜亚洲精品不卡电影| 亚洲精品久久久久一区二区三| 九九免费精品视频| 综合人妻久久一区二区精品| 麻豆精品无码久久久久久久久| 97国产揄拍国产精品人妻| 男人团apk| 成人毛片免费播放| 相声flash| 久久午夜伦理| yellow片高清视频免费看| 手机观看毛片| 精品无码国产污污污免费网站2| 1788vv视频| 日日啪无需播放器| 国产香蕉视频| 中文字幕不卡一区二区三区| 强奷表妺好紧2| 国产亚洲欧洲日韩在线三区| 中国字字幕在线播放2019| 青柠视频在线观看高清HD|