mirror of
https://github.com/chromium/crashpad.git
synced 2025-03-09 22:26:06 +00:00
With this change, it is possible to build crashpad_util on Linux. I built with clang 3.8.1 and GCC 6.2.0. - For per-OS “exception code” metrics, Android and Linux are broken out distinctly. - Because Linux provides no standard UUID generator, base::RandBytes() is used to generate random UUIDs for the InitializeWithNew() form. - Multiple fixes for CloseMultipleNowOrOnExec(): - readdir_r() is deprecated in glibc 2.24. Use readdir() on Linux. - Linux does not have OPEN_MAX. Use the fs.nr_open sysctl (via /proc/sys) to determine the maximum (currently-configured) possible number of file descriptors per process. - Use the {CTL_KERN, KERN_MAXFILESPERPROC} sysctl on Mac to determine the maximum (currently-configured) possible number of file descriptors per process. This is an improvement over using OPEN_MAX, which is still consulted. - ThreadLogMessages’ use of DCHECK_EQ() needs an address-of operator on function pointers to avoid confusing GCC. One problem remains: - util/misc/pdb_structures.h produces -Wmultichar errors. -Wmultichar is enabled by default with GCC (but not clang). It is impossible to disable this warning with #pragma GCC diagnostic ignored. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431 This has not been tested beyond building the crashpad_util target. BUG=crashpad:30 Change-Id: I02e7a05da512ca312806d825b3fc9b2c5bf1a990 Reviewed-on: https://chromium-review.googlesource.com/404009 Reviewed-by: Robert Sesek <rsesek@chromium.org>
108 lines
3.3 KiB
C++
108 lines
3.3 KiB
C++
// Copyright 2016 The Crashpad Authors. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "util/misc/metrics.h"
|
|
|
|
#include "base/metrics/histogram_macros.h"
|
|
#include "base/metrics/sparse_histogram.h"
|
|
#include "build/build_config.h"
|
|
|
|
#if defined(OS_MACOSX)
|
|
#define METRICS_OS_NAME "Mac"
|
|
#elif defined(OS_WIN)
|
|
#define METRICS_OS_NAME "Win"
|
|
#elif defined(OS_ANDROID)
|
|
#define METRICS_OS_NAME "Android"
|
|
#elif defined(OS_LINUX)
|
|
#define METRICS_OS_NAME "Linux"
|
|
#endif
|
|
|
|
namespace crashpad {
|
|
|
|
namespace {
|
|
|
|
//! \brief Metrics values used to track the start and completion of a crash
|
|
//! handling. These are used as metrics values directly, so
|
|
//! enumeration values so new values should always be added at the end.
|
|
enum class ExceptionProcessingState {
|
|
//! \brief Logged when exception processing is started.
|
|
kStarted = 0,
|
|
|
|
//! \brief Logged when exception processing completes.
|
|
kFinished = 1,
|
|
};
|
|
|
|
void ExceptionProcessing(ExceptionProcessingState state) {
|
|
UMA_HISTOGRAM_COUNTS("Crashpad.ExceptionEncountered",
|
|
static_cast<int32_t>(state));
|
|
}
|
|
|
|
} // namespace
|
|
|
|
// static
|
|
void Metrics::CrashReportPending(PendingReportReason reason) {
|
|
UMA_HISTOGRAM_ENUMERATION(
|
|
"Crashpad.CrashReportPending",
|
|
static_cast<int32_t>(reason),
|
|
static_cast<int32_t>(PendingReportReason::kMaxValue));
|
|
}
|
|
|
|
// static
|
|
void Metrics::CrashReportSize(FileHandle file) {
|
|
const FileOffset size = LoggingFileSizeByHandle(file);
|
|
UMA_HISTOGRAM_CUSTOM_COUNTS(
|
|
"Crashpad.CrashReportSize", size, 0, 20 * 1024 * 1024, 50);
|
|
}
|
|
|
|
// static
|
|
void Metrics::CrashUploadAttempted(bool successful) {
|
|
UMA_HISTOGRAM_COUNTS("Crashpad.CrashUpload.AttemptSuccessful",
|
|
static_cast<int32_t>(successful));
|
|
}
|
|
|
|
// static
|
|
void Metrics::CrashUploadSkipped(CrashSkippedReason reason) {
|
|
UMA_HISTOGRAM_ENUMERATION(
|
|
"Crashpad.CrashUpload.Skipped",
|
|
static_cast<int32_t>(reason),
|
|
static_cast<int32_t>(CrashSkippedReason::kMaxValue));
|
|
}
|
|
|
|
// static
|
|
void Metrics::ExceptionCaptureResult(CaptureResult result) {
|
|
ExceptionProcessing(ExceptionProcessingState::kFinished);
|
|
UMA_HISTOGRAM_ENUMERATION("Crashpad.ExceptionCaptureResult",
|
|
static_cast<int32_t>(result),
|
|
static_cast<int32_t>(CaptureResult::kMaxValue));
|
|
}
|
|
|
|
// static
|
|
void Metrics::ExceptionCode(uint32_t exception_code) {
|
|
UMA_HISTOGRAM_SPARSE_SLOWLY("Crashpad.ExceptionCode." METRICS_OS_NAME,
|
|
static_cast<int32_t>(exception_code));
|
|
}
|
|
|
|
// static
|
|
void Metrics::ExceptionEncountered() {
|
|
ExceptionProcessing(ExceptionProcessingState::kStarted);
|
|
}
|
|
|
|
void Metrics::HandlerCrashed(uint32_t exception_code) {
|
|
UMA_HISTOGRAM_SPARSE_SLOWLY(
|
|
"Crashpad.HandlerCrash.ExceptionCode." METRICS_OS_NAME,
|
|
static_cast<int32_t>(exception_code));
|
|
}
|
|
|
|
} // namespace crashpad
|