blob: fd08a3b4f726f12f0ea364dd73e5c2042c7ee051 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.feedback;
using fuchsia.mem;
using zx;
/// Provides the ability to file crash reports.
@discoverable
closed protocol CrashReporter {
/// Files a crash `report` and gives the final result of the operation.
///
/// This could mean generating a crash report in a local crash report
/// database or uploading the crash report to a remote crash server
/// depending on the FIDL server's configuration.
///
/// Warning: this could potentially take up to several minutes. Calling
/// this function in a synchronous manner is not recommended.
@available(added=11)
strict FileReport(resource struct {
report CrashReport;
}) -> (struct {
results FileReportResults;
}) error FilingError;
};
const MAX_PROGRAM_NAME_LENGTH uint32 = 1024;
const MAX_NUM_ANNOTATIONS_PER_CRASH_REPORT uint32 = 32;
const MAX_NUM_ATTACHMENTS_PER_CRASH_REPORT uint32 = 16;
const MAX_EVENT_ID_LENGTH uint32 = 128;
const MAX_CRASH_SIGNATURE_LENGTH uint32 = 128;
@available(added=11)
const MAX_REPORT_ID_LENGTH uint32 = 64;
/// Represents a crash report.
type CrashReport = resource table {
/// The name of the program that crashed, e.g., the process or component's name.
1: program_name string:MAX_PROGRAM_NAME_LENGTH;
/// How long the program was running before it crashed.
6: program_uptime zx.Duration;
/// The specific report that depends on the type of crashes.
///
/// This field should be set if additional information about the crashing program needs to be
/// sent, e.g., a minidump.
2: specific_report SpecificCrashReport;
/// A vector of key-value string pairs representing arbitrary data that should be attached to a
/// crash report.
///
/// Keys should be unique as only the latest value for a given key in the vector will be
/// considered.
3: annotations vector<Annotation>:MAX_NUM_ANNOTATIONS_PER_CRASH_REPORT;
/// A vector of key-value string-to-VMO pairs representing arbitrary data that should be
/// attached to a crash report.
///
/// Keys should be unique as only the latest value for a given key in the vector will be
/// considered.
4: attachments vector<Attachment>:MAX_NUM_ATTACHMENTS_PER_CRASH_REPORT;
/// A text ID that the crash server can use to group multiple crash reports related to the
/// same event.
///
/// Unlike the crash signature, crash reports sharing the same ID correspond to different
/// crashes, but can be considered as belonging to the same event, e.g., a crash in a low-level
/// server causing a crash in a high-level UI widget.
5: event_id string:MAX_EVENT_ID_LENGTH;
/// A text signature that the crash server can use to track the same crash over time, e.g.,
/// "kernel-panic" or "oom". This signature will take precedence over any automated signature
/// derived from the rest of the data.
///
/// Unlike the event ID, crash reports sharing the same signature correspond to the same crash,
/// but happening over multiple events, e.g., a null pointer exception in a server whenever
/// asked the same request.
///
/// Must match [a-z][a-z\-]* i.e. only lowercase letters and hyphens or this will result in a
/// ZX_ERR_INVALID_ARGS epitaph.
7: crash_signature string:MAX_CRASH_SIGNATURE_LENGTH;
/// Indicates whether the crash report is for the atypical stop of a running process, component,
/// or the system itself.
///
/// Examples of events that result in fatal crash reports are:
/// * an ELF process crashing
/// * the system rebooting because it ran out of memory.
/// * the system rebooting because a critical component crashed.
/// * the system rebooting because the device was too hot.
///
/// Examples of events that result in non-fatal crash reports are:
/// * an uncaught exception in a Dart program with many execution contexts. The runtime may
/// chose to terminate that specific execution context and file a crash report for it instead
/// of the whole program.
/// * a component detecting a fatal event (like an OOM) may occur soon, but isn't guaranteed to
/// occur.
///
/// This field is primarily used for grouping crashes by fatal, not fatal, and unknown,
/// each corresponding to the field being set to true, set to false, or not set respectively.
8: is_fatal bool;
};
/// Represents a specific crash report.
///
/// Add a new member when the server needs to special case how it handles certain annotations and
/// attachments for a given type of crashes, e.g., a `RuntimeCrashReport` for Javascript.
type SpecificCrashReport = flexible resource union {
/// Intended for a native exception.
2: native NativeCrashReport;
/// Intended for a Dart exception.
3: dart RuntimeCrashReport;
};
const MAX_PROCESS_NAME_LENGTH uint32 = 64;
const MAX_THREAD_NAME_LENGTH uint32 = 64;
/// Represents a crash report for a native exception out of which the client has built a minidump.
type NativeCrashReport = resource table {
/// The core dump in the Minidump format.
1: minidump fuchsia.mem.Buffer;
/// The name of the crashed process.
2: process_name string:MAX_PROCESS_NAME_LENGTH;
/// The kernel object id of the crashed process.
3: process_koid zx.Koid;
/// The name of the crashed thread.
4: thread_name string:MAX_THREAD_NAME_LENGTH;
/// The kernel object id of the crashed thread.
5: thread_koid zx.Koid;
};
const MAX_EXCEPTION_TYPE_LENGTH uint32 = 128;
@available(replaced=10)
const MAX_EXCEPTION_MESSAGE_LENGTH uint32 = 2048;
@available(added=10)
const MAX_EXCEPTION_MESSAGE_LENGTH uint32 = 4096;
/// Represents a crash report for a runtime exception, applicable to most languages.
type RuntimeCrashReport = resource table {
/// The exception type, e.g., "FileSystemException".
1: exception_type string:MAX_EXCEPTION_TYPE_LENGTH;
/// The exception message, e.g., "cannot open file".
2: exception_message string:MAX_EXCEPTION_MESSAGE_LENGTH;
/// The text representation of the exception stack trace.
3: exception_stack_trace fuchsia.mem.Buffer;
};
@available(added=11)
type FileReportResults = table {
/// The success type.
1: result FilingSuccess;
/// A non-empty value if |result| is FilingSuccess::REPORT_UPLOADED.
2: report_id string:MAX_REPORT_ID_LENGTH;
};
/// "Memory" refers to a non-persistent location, e.g. a memory-backed
/// filesystem.
@available(added=11)
type FilingSuccess = flexible enum {
@unknown
UNKNOWN = 0;
REPORT_UPLOADED = 1;
REPORT_ON_DISK = 2;
REPORT_IN_MEMORY = 3;
REPORT_NOT_FILED_USER_OPTED_OUT = 4;
};
@available(added=11)
type FilingError = flexible enum {
@unknown
UNKNOWN = 0;
INVALID_ARGS_ERROR = 1;
SERVER_ERROR = 2;
PERSISTENCE_ERROR = 3;
QUOTA_REACHED_ERROR = 4;
};