summaryrefslogtreecommitdiffstats
path: root/tools/crashreporter/injector/injector.cc
blob: eeb74038c8732a9391b89b6e67fda1853d726d09 (plain)
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
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "linux/handler/exception_handler.h"

using google_breakpad::ExceptionHandler;

static ExceptionHandler* gExceptionHandler = nullptr;

// Flag saying whether to generate a minidump. Can be (probably temporarily) set
// to false when a crash is expected.
bool __attribute__((visibility("default"))) gBreakpadInjectorEnabled = true;

bool TestEnabled(void* /* context */) { return gBreakpadInjectorEnabled; }

bool SetGlobalExceptionHandler(
    ExceptionHandler::FilterCallback filterCallback,
    ExceptionHandler::MinidumpCallback minidumpCallback) {
  const char* tempPath = getenv("TMPDIR");
  if (!tempPath) tempPath = "/tmp";

  google_breakpad::MinidumpDescriptor descriptor(tempPath);

  gExceptionHandler = new ExceptionHandler(descriptor, filterCallback,
                                           minidumpCallback, nullptr, true, -1);
  if (!gExceptionHandler) return false;

  return true;
}

// Called when loading the DLL (eg via LD_PRELOAD, or the JS shell --dll
// option).
void __attribute__((constructor)) SetBreakpadExceptionHandler() {
  if (gExceptionHandler) abort();

  if (!SetGlobalExceptionHandler(TestEnabled, nullptr)) abort();

  if (!gExceptionHandler) abort();
}