Faultloggerd — это компонент, который создаёт и управляет временными логами аварийного завершения процесса на языках C/C++ в OpenHarmony. Вы можете найти логи аварийного завершения в предустановленной директории для поиска ошибок.
* SignalHandler: обработчик сигналов, который получает системные исключения и запускает захват информации об исключениях процесса.
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;
}
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
114 ? 00:00:00 hiview
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

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

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