blob: 214f03e8415bbb166488d892b633374d9c92036d [file] [log] [blame]
// Copyright 2018 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.
#include "src/developer/crashpad_agent/report_annotations.h"
#include <fcntl.h>
#include <fuchsia/sysinfo/c/fidl.h>
#include <lib/fdio/directory.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <lib/syslog/cpp/logger.h>
#include <lib/zx/channel.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <zircon/boot/image.h>
#include <string>
#include "src/lib/files/file.h"
#include "src/lib/fxl/strings/trim.h"
namespace fuchsia {
namespace crash {
namespace {
// The crash server expects specific key and values for some annotations in Dart
// crash reports.
const char kDartTypeKey[] = "type";
const char kDartTypeValue[] = "DartError";
const char kDartErrorMessageKey[] = "error_message";
const char kDartErrorRuntimeTypeKey[] = "error_runtime_type";
std::string ReadStringFromFile(const std::string& filepath) {
std::string content;
if (!files::ReadFileToString(filepath, &content)) {
FX_LOGS(ERROR) << "Failed to read content from '" << filepath << "'.";
return "unknown";
return fxl::TrimString(content, "\r\n").ToString();
} // namespace
std::map<std::string, std::string> MakeDefaultAnnotations(
const fuchsia::feedback::Data& feedback_data,
const std::string& package_name) {
std::map<std::string, std::string> annotations = {
{"product", "Fuchsia"},
{"version", ReadStringFromFile("/config/build-info/version")},
// We use ptype to benefit from Chrome's "Process type" handling in
// the crash server UI.
{"ptype", package_name},
if (feedback_data.has_annotations()) {
for (const auto& annotation : feedback_data.annotations()) {
annotations[annotation.key] = annotation.value;
return annotations;
std::map<std::string, std::string> MakeManagedRuntimeExceptionAnnotations(
const fuchsia::feedback::Data& feedback_data,
const std::string& component_url, ManagedRuntimeException* exception) {
std::map<std::string, std::string> annotations =
MakeDefaultAnnotations(feedback_data, component_url);
switch (exception->Which()) {
case ManagedRuntimeException::Tag::Invalid:
FX_LOGS(ERROR) << "invalid ManagedRuntimeException";
case ManagedRuntimeException::Tag::kUnknown_:
// No additional annotations, just a single attachment.
case ManagedRuntimeException::Tag::kDart:
annotations[kDartTypeKey] = kDartTypeValue;
annotations[kDartErrorRuntimeTypeKey] = std::string(
reinterpret_cast<const char*>(exception->dart();
annotations[kDartErrorMessageKey] = std::string(
reinterpret_cast<const char*>(exception->dart();
return annotations;
} // namespace crash
} // namespace fuchsia