blob: e1ef9c73a1f2de10bc4712cbdddb408465278c9c [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// ArcvmCxxCollector handles crashes of binaries written in C++ (or other
// languages like Rust which are compiled to machine code) in ARCVM. When the
// ARCVM kernel detects a crash, it executes arc-native-crash-dispatcher via its
// /proc/sys/kernel/core_pattern. arc-native-crash-dispatcher calls
// arc-native-crash-collector32 or arc-native-crash-collector64 and writes dump
// files at /data/vendor/arc_native_crash_reports in the ARCVM filesystem.
// ArcCrashCollector, which is a service running in ARCVM, monitors the
// /data/vendor/arc_native_crash_reports directory and sends detected dump files
// to Chrome via Mojo. Finally Chrome invokes this collector.
#ifndef CRASH_REPORTER_ARCVM_CXX_COLLECTOR_H_
#define CRASH_REPORTER_ARCVM_CXX_COLLECTOR_H_
#include "crash-reporter/arc_util.h"
#include "crash-reporter/crash_collector.h"
#include <string>
#include <base/files/file_path.h>
#include <base/files/scoped_file.h>
#include <base/time/time.h>
// Collector for C++ crashes (native_crash) in ARCVM.
class ArcvmCxxCollector : public CrashCollector {
public:
// The basic information about crash. They are used for the filename of files
// passed to crash_sender.
struct CrashInfo {
time_t time; // The time when the crash happens.
pid_t pid; // The process ID (in ARCVM) of the crashed process.
std::string exec_name; // The name of crashed binary.
};
ArcvmCxxCollector();
~ArcvmCxxCollector() override;
// Handles a C++ crash in ARCVM.
// |uptime| can be zero if the value is unknown.
bool HandleCrash(const arc_util::BuildProperty& build_property,
const CrashInfo& crash_info,
base::TimeDelta uptime);
static CollectorInfo GetHandlerInfo(
bool arc_native,
const arc_util::BuildProperty& build_property,
const CrashInfo& crash_info,
int64_t uptime_millis);
private:
friend class ArcvmCxxCollectorMock;
friend class ArcvmCxxCollectorTest;
FRIEND_TEST(ArcvmCxxCollectorTest, HandleCrashWithMinidumpFD);
FRIEND_TEST(ArcvmCxxCollectorTest, AddArcMetadata);
// CrashCollector overrides.
std::string GetProductVersion() const override;
// Handles a C++ crash in ARCVM using the given FD for minidump.
// TODO(kimiyuki): Replace |minidump_fd| with a path and make "/dev/stdin" the
// default argument.
bool HandleCrashWithMinidumpFD(const arc_util::BuildProperty& build_property,
const CrashInfo& crash_info,
base::TimeDelta uptime,
base::ScopedFD minidump_fd);
// Adds ARC-related metadata to the crash report.
void AddArcMetadata(const arc_util::BuildProperty& build_property,
const CrashInfo& crash_info,
base::TimeDelta uptime);
};
#endif // CRASH_REPORTER_ARCVM_CXX_COLLECTOR_H_