33 auto database = crashpad::CrashReportDatabase::Initialize(reportsDir);
34 if (database ==
nullptr)
36 throw std::ios_base::failure(
"Can't initialize crash report database");
40 auto *settings = database->GetSettings();
41 if (settings ==
nullptr)
43 throw std::ios_base::failure(
"Can't get crash report database settings");
45 settings->SetUploadsEnabled(
true);
51 throw std::ios_base::failure(
"Can't start crash handler");
54 _thread = std::make_unique<std::jthread>([
this](
const std::stop_token &sToken) {
threadFunc(sToken); });
93 socklen_t len =
sizeof(error);
96 const int result = getsockopt(sockId, SOL_SOCKET, SO_ERROR, &error, &len);
97 return result == 0 && error == 0 && recv(sockId, &buff, 1, MSG_PEEK | MSG_DONTWAIT) != 0;
102 std::array<char, FILENAME_MAX> pathBuffer{
'\0'};
103 auto bytes = readlink(
"/proc/self/exe", pathBuffer.data(),
sizeof(pathBuffer));
105 auto path = std::string(pathBuffer.data(), bytes == -1 ? 0 :
static_cast<size_t>(bytes));
106 auto lastDelimPos = path.find_last_of(
'/');
107 return (lastDelimPos == std::string::npos) ?
"" : path.substr(0, lastDelimPos);
131Tracer::Tracer(std::shared_ptr<std::atomic_flag> checkFlag, std::string serverPath, std::string serverProxy,
132 const std::string &crashpadHandlerPath,
const std::string &reportPath,
133 std::vector<base::FilePath> attachments)
139 _handlerPath = crashpadHandlerPath.empty() ? selfDir +
"/crashpad_handler" : crashpadHandlerPath;
140 _reportPath = reportPath.empty() ? selfDir : reportPath;
144 {{
"name", PROJECT_NAME},
145 {
"version", PROJECT_FULL_REVISION},
146 {
"build_info", PROJECT_BUILD_DATE + std::string(
" ") + PROJECT_BUILD_TIME + std::string(
" ") + BUILD_TYPE},
147 {
"compiler_info", COMPILER_NAME + std::string(
" ") + COMPILER_VERSION}});
Tracer(std::shared_ptr< std::atomic_flag > checkFlag, std::string serverPath="", std::string serverProxy="", const std::string &crashpadHandlerPath="", const std::string &reportPath="", std::vector< base::FilePath > attachments={})