Files
roytam1 850741b596 import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1189709 - Reduce scope of MessageChannel window neutering. r=jimm (a73623101e)
- Bug 1202051 - Use a PersistentRooted to automate tracing of unwrappedException_; r=sfink (32964b4bcb)
- missing part of Bug 1135236 - Remove unused print callbacks in profiler backend. (a6427e4a23)
- Bug 1164785 - Append line number to systrace scopedTrace object name. r=BenWa (be4fb076b0)
- missing parts of Bug 779291: Implement SPS stackwalk (fefa7c961c)
- Bug 1186709 - Remove MOZ_IMPLICIT from security/sandbox/chromium. r=bobowen (7c1419cd3a)
- Bug 1274253. Properly test the cpuid bits. (039f594ab3)
- Bug 1168291 - Install mozcrt.lib instead of mozglue.lib in the SDK. r=mshal (00d4309281)
- Bug 1198334 (follow-up) - Fix SM(e) bustage (which doesn't show up on try pushes, grr). r=bustage. (4431457ede)
- Bug 1194560 - Add tools/power/rapl, a RAPL-reading program for power rofiling. r=erahm,glandium. (47b61fd39c)
- Bug 1147243 - Build memory/jemalloc in unified mode; r=glandium (81173f8bc2)
- Bug 1201738 - Update jemalloc4 to 594c759 + two pending patches. r=njn (66f4f3fe49)
- Bug 1135583: Prevent the inclusion of Char16.h in VS2015's fallible.obj. r=glandium (3e5ac84efb)
- bug 1171122 - Swap some XP_MACOSX for XP_DARWIN in mozalloc. r=glandium (6d03543291)
- Bug 1170177 - Disable our own abort() method with MOZ_ASAN. r=froydnj (cdc43fcb8c)
- Bug 1120793 - Remove obsolete _Throw wrapping. r=froydnj (a5c53780ec)
- Bug 1189967 - Avoid conflicting declarations for our raise wrappers on Windows. r=nfroyd (e0a606ef14)
- Bug 1203476 - Fix an Android-only warning in mozalloc_abort.cpp. r=glandium. (806b791d54)
- pointer style (97a2b4ffea)
- Bug 1147353 - Odin: simplify the masked index bounds check test. r=sfink, r=luke (fa6007c8dd)
2022-02-11 22:28:17 +08:00

94 lines
2.8 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: sw=4 ts=4 et :
*/
/* 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/. */
#if defined(XP_WIN)
# define MOZALLOC_EXPORT __declspec(dllexport)
#endif
#include "mozilla/mozalloc_abort.h"
#ifdef ANDROID
# include <android/log.h>
#endif
#ifdef MOZ_WIDGET_ANDROID
# include "APKOpen.h"
# include "dlfcn.h"
#endif
#include <stdio.h>
#include "mozilla/Assertions.h"
void
mozalloc_abort(const char* const msg)
{
#ifndef ANDROID
fputs(msg, stderr);
fputs("\n", stderr);
#else
__android_log_print(ANDROID_LOG_ERROR, "Gecko", "mozalloc_abort: %s", msg);
#endif
#ifdef MOZ_WIDGET_ANDROID
abortThroughJava(msg);
#endif
MOZ_CRASH();
}
#ifdef MOZ_WIDGET_ANDROID
template <size_t N>
void fillAbortMessage(char (&msg)[N], uintptr_t retAddress) {
/*
* On Android, we often don't have reliable backtrace when crashing inside
* abort(). Therefore, we try to find out who is calling abort() and add
* that to the message.
*/
Dl_info info = {};
dladdr(reinterpret_cast<void*>(retAddress), &info);
const char* const module = info.dli_fname ? info.dli_fname : "";
const char* const base_module = strrchr(module, '/');
const void* const module_offset =
reinterpret_cast<void*>(retAddress - uintptr_t(info.dli_fbase));
const char* const sym = info.dli_sname ? info.dli_sname : "";
snprintf(msg, sizeof(msg), "abort() called from %s:%p (%s)",
base_module ? base_module + 1 : module, module_offset, sym);
}
#endif
#if defined(XP_UNIX) && !defined(MOZ_ASAN)
// Define abort() here, so that it is used instead of the system abort(). This
// lets us control the behavior when aborting, in order to get better results
// on *NIX platforms. See mozalloc_abort for details.
//
// For AddressSanitizer, we must not redefine system abort because the ASan
// option "abort_on_error=1" calls abort() and therefore causes the following
// call chain with our redefined abort:
//
// ASan -> abort() -> moz_abort() -> MOZ_CRASH() -> Segmentation fault
//
// That segmentation fault will be interpreted as another bug by ASan and as a
// result, ASan will just exit(1) instead of aborting.
void abort(void)
{
#ifdef MOZ_WIDGET_ANDROID
char msg[64] = {};
fillAbortMessage(msg, uintptr_t(__builtin_return_address(0)));
#else
const char* const msg = "Redirecting call to abort() to mozalloc_abort\n";
#endif
mozalloc_abort(msg);
// We won't reach here because mozalloc_abort() is MOZ_NORETURN. But that
// annotation isn't used on ARM (see mozalloc_abort.h for why) so we add a
// redundant MOZ_CRASH() here to avoid a "'noreturn' function does return"
// warning.
MOZ_CRASH();
}
#endif