xref: /aosp_15_r20/external/cronet/base/debug/crash_logging.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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