File: client.cc

package info (click to toggle)
chromium 120.0.6099.224-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 6,112,112 kB
  • sloc: cpp: 32,907,025; ansic: 8,148,123; javascript: 3,679,536; python: 2,031,248; asm: 959,718; java: 804,675; xml: 617,256; sh: 111,417; objc: 100,835; perl: 88,443; cs: 53,032; makefile: 29,579; fortran: 24,137; php: 21,162; tcl: 21,147; sql: 20,809; ruby: 17,735; pascal: 12,864; yacc: 8,045; lisp: 3,388; lex: 1,323; ada: 727; awk: 329; jsp: 267; csh: 117; exp: 43; sed: 37
file content (59 lines) | stat: -rw-r--r-- 2,485 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/allocation_recorder/crash_client/client.h"

#include "base/debug/allocation_trace.h"
#include "build/build_config.h"
#include "components/allocation_recorder/internal/internal.h"
#include "third_party/crashpad/crashpad/client/annotation.h"

#if BUILDFLAG(IS_ANDROID)
#include "components/crash/core/app/crashpad.h"
#endif

using allocation_recorder::internal::kAnnotationName;
using allocation_recorder::internal::kAnnotationType;
using base::debug::tracer::AllocationTraceRecorder;

namespace allocation_recorder::crash_client {

AllocationTraceRecorder& Initialize() {
  // Annotations of Crashpad can have only up to
  // crashpad::Annotation::kValueMaxSize bytes. AllocationTraceRecorder usually
  // has a much larger size. Due to this fact we use a two staged approach. We
  // store the exact address of the Recorder in an annotation and allow Crashpad
  // to access this specific address range.

  static AllocationTraceRecorder trace_recorder_instance;

  // The crashpad annotation ensures that a sequence of N bytes is copied from a
  // given address into the crash handler. So, in order to make the address of
  // the recorder accessible from the crash handler, we have to store it
  // explicitly in a data field that is still alive at crash time. If we used
  // the recorder's address directly, we'd end up copying some bytes of the
  // recorder only, which doesn't work due to size limitations (see the
  // static_assert below).
  static AllocationTraceRecorder* recorder_address = &trace_recorder_instance;

  // Ensure we take this double indirection approach only when necessary. That
  // is the size of AllocationTraceRecorder must exceed the maximum amount of
  // data that an annotation can hold.
  static_assert(sizeof(trace_recorder_instance) >
                crashpad::Annotation::kValueMaxSize);

  static crashpad::Annotation allocation_stack_recorder_address(
      kAnnotationType, kAnnotationName, static_cast<void*>(&recorder_address));

  allocation_stack_recorder_address.SetSize(sizeof(recorder_address));

#if BUILDFLAG(IS_ANDROID)
  crash_reporter::AllowMemoryRange(static_cast<void*>(&trace_recorder_instance),
                                   sizeof(trace_recorder_instance));
#endif

  return trace_recorder_instance;
}

}  // namespace allocation_recorder::crash_client