1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/debug/crash_logging.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <ostream>
8*6777b538SAndroid Build Coastguard Worker #include <string_view>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker namespace base::debug {
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker namespace {
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker CrashKeyImplementation* g_crash_key_impl = nullptr;
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker } // namespace
19*6777b538SAndroid Build Coastguard Worker
AllocateCrashKeyString(const char name[],CrashKeySize value_length)20*6777b538SAndroid Build Coastguard Worker CrashKeyString* AllocateCrashKeyString(const char name[],
21*6777b538SAndroid Build Coastguard Worker CrashKeySize value_length) {
22*6777b538SAndroid Build Coastguard Worker if (!g_crash_key_impl)
23*6777b538SAndroid Build Coastguard Worker return nullptr;
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker // TODO(https://crbug.com/1341077): It would be great if the DCHECKs below
26*6777b538SAndroid Build Coastguard Worker // could also be enabled on Android, but debugging tryjob failures was a bit
27*6777b538SAndroid Build Coastguard Worker // difficult... :-/
28*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON() && !BUILDFLAG(IS_ANDROID)
29*6777b538SAndroid Build Coastguard Worker std::string_view name_piece = name;
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker // Some `CrashKeyImplementation`s reserve certain characters and disallow
32*6777b538SAndroid Build Coastguard Worker // using them in crash key names. See also https://crbug.com/1341077.
33*6777b538SAndroid Build Coastguard Worker DCHECK_EQ(base::StringPiece::npos, name_piece.find(':'))
34*6777b538SAndroid Build Coastguard Worker << "; name_piece = " << name_piece;
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker // Some `CrashKeyImplementation`s support only short crash key names (e.g. see
37*6777b538SAndroid Build Coastguard Worker // the DCHECK in crash_reporter::internal::CrashKeyStringImpl::Set).
38*6777b538SAndroid Build Coastguard Worker // Enforcing this restrictions here ensures that crash keys will work for all
39*6777b538SAndroid Build Coastguard Worker // `CrashKeyStringImpl`s.
40*6777b538SAndroid Build Coastguard Worker DCHECK_LT(name_piece.size(), 40u);
41*6777b538SAndroid Build Coastguard Worker #endif
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard Worker return g_crash_key_impl->Allocate(name, value_length);
44*6777b538SAndroid Build Coastguard Worker }
45*6777b538SAndroid Build Coastguard Worker
SetCrashKeyString(CrashKeyString * crash_key,std::string_view value)46*6777b538SAndroid Build Coastguard Worker void SetCrashKeyString(CrashKeyString* crash_key, std::string_view value) {
47*6777b538SAndroid Build Coastguard Worker if (!g_crash_key_impl || !crash_key)
48*6777b538SAndroid Build Coastguard Worker return;
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker g_crash_key_impl->Set(crash_key, value);
51*6777b538SAndroid Build Coastguard Worker }
52*6777b538SAndroid Build Coastguard Worker
ClearCrashKeyString(CrashKeyString * crash_key)53*6777b538SAndroid Build Coastguard Worker void ClearCrashKeyString(CrashKeyString* crash_key) {
54*6777b538SAndroid Build Coastguard Worker if (!g_crash_key_impl || !crash_key)
55*6777b538SAndroid Build Coastguard Worker return;
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Worker g_crash_key_impl->Clear(crash_key);
58*6777b538SAndroid Build Coastguard Worker }
59*6777b538SAndroid Build Coastguard Worker
OutputCrashKeysToStream(std::ostream & out)60*6777b538SAndroid Build Coastguard Worker void OutputCrashKeysToStream(std::ostream& out) {
61*6777b538SAndroid Build Coastguard Worker if (!g_crash_key_impl)
62*6777b538SAndroid Build Coastguard Worker return;
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker g_crash_key_impl->OutputCrashKeysToStream(out);
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker
ScopedCrashKeyString(CrashKeyString * crash_key,std::string_view value)67*6777b538SAndroid Build Coastguard Worker ScopedCrashKeyString::ScopedCrashKeyString(CrashKeyString* crash_key,
68*6777b538SAndroid Build Coastguard Worker std::string_view value)
69*6777b538SAndroid Build Coastguard Worker : crash_key_(crash_key) {
70*6777b538SAndroid Build Coastguard Worker SetCrashKeyString(crash_key_, value);
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker
ScopedCrashKeyString(ScopedCrashKeyString && other)73*6777b538SAndroid Build Coastguard Worker ScopedCrashKeyString::ScopedCrashKeyString(ScopedCrashKeyString&& other)
74*6777b538SAndroid Build Coastguard Worker : crash_key_(std::exchange(other.crash_key_, nullptr)) {}
75*6777b538SAndroid Build Coastguard Worker
~ScopedCrashKeyString()76*6777b538SAndroid Build Coastguard Worker ScopedCrashKeyString::~ScopedCrashKeyString() {
77*6777b538SAndroid Build Coastguard Worker ClearCrashKeyString(crash_key_);
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker
SetCrashKeyImplementation(std::unique_ptr<CrashKeyImplementation> impl)80*6777b538SAndroid Build Coastguard Worker void SetCrashKeyImplementation(std::unique_ptr<CrashKeyImplementation> impl) {
81*6777b538SAndroid Build Coastguard Worker delete g_crash_key_impl;
82*6777b538SAndroid Build Coastguard Worker g_crash_key_impl = impl.release();
83*6777b538SAndroid Build Coastguard Worker }
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker } // namespace base::debug
86