1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openharmony-hiviewdfx_faultloggerd

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

FaultLoggerd

  • Введение
  • Архитектура
  • Структура директорий
  • Как использовать
    • DumpCatcher
    • ProcessDump
  • Процесс сервиса
    • Процесс сервиса SDK DumpCatcher
    • Процесс сервиса ProcessDump
    • Процесс сервиса аварийного завершения процесса
  • Вовлечённые репозитории

Введение

Faultloggerd — это компонент, который создаёт и управляет временными логами аварийного завершения процесса на языках C/C++ в OpenHarmony. Вы можете найти логи аварийного завершения в предустановленной директории для поиска ошибок.

Архитектура

Архитектура* SignalHandler: обработчик сигналов, который получает системные исключения и запускает захват информации об исключениях процесса.

  • DumpCatcher: инструмент захвата стека, который предоставляет функцию захвата информации о стеке для указанного процесса и потока.
  • FaultloggerdClient: клиент управления временными логами аварийного завершения, который получает запросы на файловые дескрипторы и экспорт стека.
  • ProcessDump: двоичный инструмент захвата информации о процессе, который предоставляет функцию захвата информации о стеке для указанного процесса и потока в командной строке.
  • Crasher: конструктор аварийного завершения, который создаёт и имитирует аварийное завершение.
  • FaultloggerdServer: модуль обработки основных сервисов, который получает и обрабатывает запросы от FaultloggerdClient.
  • FaultloggerdSecure: модуль проверки прав доступа, который предоставляет управление и проверку прав доступа для создания и захвата логов аварийного завершения.
  • FaultloggerdConfig: модуль управления временными логами аварийного завершения.Таблица ниже описывает обрабатываемые исключительные сигналы. | Значение сигнала | Сигнал | Описание | Причина | | ------ | --------- | --------------- | ------------------------------------------------------------ | | 4 | SIGILL | Недопустимая инструкция | Выполняемый файл содержит ошибку или пытается выполнить сегмент данных. Этот сигнал также может быть сгенерирован при переполнении стека. | | 5 | SIGTRAP | Остановка или ловушка | Выполняется инструкция остановки или любая другая инструкция ловушки. | | 6 | SIGABRT | Сигнал завершения | Вызывается функцией завершения. | | 7 | SIGBUS | Недопустимый доступ к памяти | Определяется недопустимый адрес, включая ошибку выравнивания памяти. Например, доступ к целочисленному значению из четырех байт по адресу, не делящемуся на четыре. Разница между SIGBUS и SIGSEGV заключается в том, что SIGSEGV активируется при несанкционированном доступе к допустимому адресу памяти (например, доступ к области памяти, которая только для чтения или не принадлежит процессу). | | 8 | SIGFPE | Исключение с плавающей запятой | Произошла фатальная арифметическая ошибка, например, ошибка вычисления с плавающей запятой, переполнение деления или деление на ноль. || 11 | SIGSEGV | Недопустимый доступ к памяти | Процесс пытается получить доступ к памяти, не выделенной ему, или записать данные по адресу памяти, не имеющему разрешения на запись. | | 16 | SIGSTKFLT | Переполнение стека | Стек переполняется. | | 31 | SIGSYS | Исключение системного вызова | Инициируется недопустимый системный вызов. |

Структура директорий```txt

faultloggerd/ ├── OAT.xml ├── common # Common definitions ├── faultloggerd.gni ├── interfaces # API │ └── innerkits │ ├── dump_catcher # Tool for capturing stack information │ ├── faultloggerd_client # Temporary client for managing crash logs │ └── signal_handler # Signal handler ├── ohos.build ├── services # FaultLoggerd services │ ├── BUILD.gn │ ├── config # Launch configuration │ ├── fault_logger_config.cpp # Log file management │ ├── fault_logger_config.h # Log file management │ ├── fault_logger_daemon.cpp # FaultLoggerd service implementation │ ├── fault_logger_daemon.h # FaultLoggerd service implementation │ ├── fault_logger_secure.cpp # Permission management and verification │ ├── fault_logger_secure.h # Permission management and verification │ ├── main.cpp │ └── test ├── test # Test resources │ ├── BUILD.gn │ ├── fuzztest # Fuzz testing with random data │ └── systemtest # System function testing └── tools # Tools ├── crasher_c # Crash constructor (C) ├── crasher_cpp # Crash constructor (C++) └── process_dump # Tool for capturing process information


## Как использовать### DumpCatcher

DumpCatcher позволяет приложению захватывать информацию стека вызовов. Он предоставляет API для вывода информации стека для указанного процесса и потока.

Класс интерфейса: `DfxDumpCatcher`

Метод интерфейса: `bool DumpCatch(const int pid, const int tid, std::string& msg);`

Параметры:
* Возвращаемое значение:
  * `true`: Успешное дампирование информации о стеке. Связанная информация сохраняется в объекте строки `msg`.
  * `false`: Дампирование информации о стеке не удалось.
* Входные параметры:
  * `pid`: Идентификатор процесса для дампирования информации о стеке. Если необходимо дампировать все потоки в процессе, установите `tid` в **0**.
  * `tid`: Идентификатор потока для дампирования информации о стеке.
* Выходные параметры:
  * `msg`: результат дампирования.

Примечание: Только администратор (**system** или **root**) имеет право получать все сведения о процессах. Обычные пользователи могут получать информацию только о своих процессах. Чтобы получить информацию о стеке вызовов процесса, который не принадлежит текущей группе пользователей, убедитесь, что у вас есть разрешение на чтение **/proc/pid/maps** и реализуйте **ptrace** для целевого процесса.

Пример кода

* dump_catcher_demo.h

```c++
#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();                   \
    }

// Тестовые функции для тестирования глубины стека вызовов 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

```c++
#include "dump_catcher_dump.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;
}

// автоматически сгенерированные функции
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" ]
}
  • Результат выполнения:
* Результат выполнения:
``````txt
# ./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
```### ProcessDump

ProcessDump — это утилита командной строки, предоставляемая для пользователей для захвата информации о стеке вызовов. Эта утилита использует параметры `-p` и `-t` для указания целевого процесса и потока. После выполнения команды она отображает информацию о стеке потока указанного процесса в окне командной строки.

Имя утилиты: `processdump`

Расположение: `/system/bin`

Параметры:

* `-p [pid]`: выводит информацию о стеке всех потоков указанного процесса.
* `-p [pid] -t [tid]`: выводит информацию о указанном потоке процесса.

Результат выполнения: Обработанная информация о стеке.

> Примечание: Использовать этот API могут только администраторы (**system** или **root**).

Пример: запрос информации о стеке вызовов основного потока Hiview

ps -A | grep hiview

114 ? 00:00:00 hiview

processdump -p 114 -t 114

Tid:114, Name:hiview #00 pc 0000000000089824(00000000b6f44824) /system/lib/ld-musl-arm.so.1(ioctl+68) #01 pc 000000000002a709(00000000b6c56709) /system/lib/libipc_core.z.so(_ZN4OHOS15BinderConnector11WriteBinderEmPv+16) #02 pc 000000000002ba75(00000000b6c57a75) /system/lib/libipc_core.z.so(_ZN4OHOS13BinderInvoker18TransactWithDriverEb+224) #03 pc 000000000002bb37(00000000b6c57b37) /system/lib/libipc_core.z.so(_ZN4OHOS13BinderInvoker13StartWorkLoopEv+22) #04 pc 000000000002c211(00000000b6c58211) /system/lib/libipc_core.z.so(_ZN4OHOS13BinderInvoker10JoinThreadEb+36) #05 pc 0000000000038d07(00000000004bcd07) /system/bin/hiview(_ZNSt3__h6vectorINS_9sub_matchINS_11__wrap_iterIPKcEEEENS_9allocatorIS6_EEE8__appendEj+596) #06 pc 0000000000028655(00000000004ac655) /system/bin/hiview #07 pc 00000000000c2b08(00000000b6f7db08) /system/lib/ld-musl-arm.so.1(__libc_start_main+116) #08 pc 00000000000285f4(00000000004ac5f4) /system/bin/hiview #09 pc 0000000000028580(00000000004ac580) /system/bin/hiview


## Процесс работы сервиса DumpCatcher### Процесс работы SDK сервиса DumpCatcher

![Процесс работы сервиса DumpCatcher](figures/dumpcatcher-process.png)

1. Процесс A вызывает API `DumpCatch()` от `DumpCatcher`, чтобы запросить дамп стека для указанного процесса и потока.
2. После получения запроса на дамп от процесса A, `DumpCatcher` запускает `ProcessDump` для получения информации стека.
3. `ProcessDump` запрашивает проверку разрешений у `Faultloggerd`.
4. Если проверка разрешений успешна, `Faultloggerd` возвращает дескриптор файла `ProcessDump`. `ProcessDump` затем отправляет результат дампа в `DumpCatcher`.

### Процесс работы сервиса ProcessDump

![Процесс работы сервиса ProcessDump](figures/processdump-process.png)

1. `Shell` запускает команду `processdump -p [pid] -t [tid]`, чтобы запросить дамп стека для указанного процесса и потока.
2. `ProcessDump` запрашивает проверку разрешений у `Faultloggerd`.
3. Если проверка разрешений успешна, `Faultloggerd` возвращает дескриптор файла `ProcessDump`. `ProcessDump` затем записывает результат дампа в стандартный вывод.

### Процесс работы сервиса Faultloggerd

![Процесс работы сервиса Faultloggerd](figures/faultloggerd-process.png)1. Процесс B вызывает функцию `DFX_SignalHandler`, чтобы обнаружить сигналы исключения краха от `SignalHandler`.
2. При обнаружении сигнала исключения краха, `SignalHandler` создает дочерний процесс и запускает `ProcessDump` для дампа информации стека для крашенного процесса и потока.
3. После чтения информации стека, `ProcessDump` записывает логи в временное хранилище в `Faultloggerd`.
4. `Faultloggerd` вызывает `AddFaultLog()` для отчета о неисправности в `Hiview` для последующей обработки.## Вовлечённые репозитории

[DFX Подсистема](https://gitee.com/openharmony/docs/blob/master/en/readme/dfx.md)

[hiviewdfx\_hiview](https://gitee.com/openharmony/hiviewdfx_hiview/blob/master/README.md)

[hiviewdfx\_hilog](https://gitee.com/openharmony/hiviewdfx_hilog/blob/master/README.md)

[hiviewdfx\_hiappevent](https://gitee.com/openharmony/hiviewdfx_hiappevent/blob/master/README.md)

[hiviewdfx\_hisysevent](https://gitee.com/openharmony/hiviewdfx_hisysevent/blob/master/README.md)

**hiviewdfx\_faultloggerd**

[hiviewdfx\_hilog\_lite](https://gitee.com/openharmony/hiviewdfx_hilog_lite/blob/master/README.md)

[hiviewdfx\_hievent\_lite](https://gitee.com/openharmony/hiviewdfx_hievent_lite/blob/master/README.md)

[hiviewdfx\_hiview\_lite](https://gitee.com/openharmony/hiviewdfx_hiview_lite/blob/master/README.md)

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Реализация сервиса логирования сбоев C/C++ | Сервис генерации журналов сбоев C/C++. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/openharmony-hiviewdfx_faultloggerd.git
git@api.gitlife.ru:oschina-mirror/openharmony-hiviewdfx_faultloggerd.git
oschina-mirror
openharmony-hiviewdfx_faultloggerd
openharmony-hiviewdfx_faultloggerd
master