16#if defined(SK_BUILD_FOR_GOOGLE3)
20#if defined(GOOGLE_ENABLE_SIGNAL_HANDLERS)
21 #include "base/process_state.h"
26 #if defined(SK_BUILD_FOR_MAC)
28 #define UNW_LOCAL_ONLY
29 #include <libunwind.h>
32 static void handler(
int sig) {
33 unw_context_t context;
34 unw_getcontext(&context);
37 unw_init_local(&cursor, &context);
40 while (unw_step(&cursor) > 0) {
41 static const size_t kMax = 256;
44 unw_get_proc_name(&cursor, mangled, kMax, &
offset);
48 abi::__cxa_demangle(mangled, demangled, &len, &
ok);
58 #elif defined(SK_BUILD_FOR_UNIX)
64#if defined(__Fuchsia__)
71 #define BACKTRACE_REQUEST_MAGIC ((uint64_t)0xee726573756d65ee)
74 __attribute__((always_inline))
static inline void backtrace_request(
void) {
85 __asm__(
"int3" : :
"a"(BACKTRACE_REQUEST_MAGIC));
93 :
"r"(BACKTRACE_REQUEST_MAGIC)
101 static void handler(
int sig) {
102#if defined(__Fuchsia__)
106 const int count = backtrace(stack, std::size(stack));
109 SkDebugf(
"\nSignal %d [%s]:\n", sig, strsignal(sig));
110 for (
int i = 0; i <
count; i++) {
112 if (dladdr(stack[i], &
info) &&
info.dli_sname) {
114 size_t len = std::size(demangled);
117 abi::__cxa_demangle(
info.dli_sname, demangled, &len, &
ok);
132 #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_UNIX)
136 static const int kSignals[] = {
145 for (
size_t i = 0; i <
sizeof(kSignals) /
sizeof(kSignals[0]); i++) {
147 void (*
prev)(
int) = signal(kSignals[i], handler);
148 if (
prev != SIG_DFL) {
149 signal(kSignals[i],
prev);
154 #elif defined(SK_BUILD_FOR_WIN)
160 static const struct {
165 _(EXCEPTION_ACCESS_VIOLATION),
166 _(EXCEPTION_BREAKPOINT),
167 _(EXCEPTION_INT_DIVIDE_BY_ZERO),
168 _(EXCEPTION_STACK_OVERFLOW),
173 static LONG WINAPI handler(EXCEPTION_POINTERS* e) {
174 const DWORD code =
e->ExceptionRecord->ExceptionCode;
175 SkDebugf(
"\nCaught exception %lu", code);
176 for (
size_t i = 0; i < std::size(kExceptions); i++) {
177 if (kExceptions[i].code == code) {
184 HANDLE hProcess = GetCurrentProcess();
185 SymInitialize(hProcess, 0,
true);
190 CONTEXT* c =
e->ContextRecord;
191 frame.AddrPC.Mode = AddrModeFlat;
192 frame.AddrStack.Mode = AddrModeFlat;
193 frame.AddrFrame.Mode = AddrModeFlat;
195 frame.AddrPC.Offset = c->Eip;
196 frame.AddrStack.Offset = c->Esp;
197 frame.AddrFrame.Offset = c->Ebp;
198 const DWORD machineType = IMAGE_FILE_MACHINE_I386;
199 #elif defined(_AMD64_)
200 frame.AddrPC.Offset = c->Rip;
201 frame.AddrStack.Offset = c->Rsp;
202 frame.AddrFrame.Offset = c->Rbp;
203 const DWORD machineType = IMAGE_FILE_MACHINE_AMD64;
204 #elif defined(_M_ARM64)
205 frame.AddrPC.Offset = c->Pc;
206 frame.AddrStack.Offset = c->Sp;
207 frame.AddrFrame.Offset = c->Fp;
208 const DWORD machineType = IMAGE_FILE_MACHINE_ARM64;
211 #if !defined(SK_WINUWP)
212 while (StackWalk64(machineType,
218 SymFunctionTableAccess64,
222 static const int kMaxNameLength = 1024;
223 uint8_t
buffer[
sizeof(IMAGEHLP_SYMBOL64) + kMaxNameLength];
228 IMAGEHLP_SYMBOL64* symbol =
reinterpret_cast<IMAGEHLP_SYMBOL64*
>(&
buffer);
229 symbol->SizeOfStruct =
sizeof(IMAGEHLP_SYMBOL64);
230 symbol->MaxNameLength = kMaxNameLength - 1;
234 SymGetSymFromAddr64(hProcess,
frame.AddrPC.Offset, &
offset, symbol);
245 return EXCEPTION_EXECUTE_HANDLER;
249 SetUnhandledExceptionFilter(handler);
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
static float prev(float f)
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
static bool ok(int result)
static void sk_bzero(void *buffer, size_t size)
Type::kYUV Type::kRGBA() int(0.7 *637)
static const uint8_t buffer[]
__asm__(".symver expf,expf@GLIBC_2.4")
__attribute__((visibility("default"))) int RunBenchmarks(int argc