| Index: dm/DM.cpp | 
| diff --git a/dm/DM.cpp b/dm/DM.cpp | 
| index 4279ea37eb796eb5177390ccbbea9de212198c09..01902627870f8de661dce1f2be8194a283898a6f 100644 | 
| --- a/dm/DM.cpp | 
| +++ b/dm/DM.cpp | 
| @@ -165,23 +165,37 @@ static std::atomic<bool> in_signal_handler{false}; | 
| } | 
| static void setup_crash_handler() { SetUnhandledExceptionFilter(handler); } | 
|  | 
| -#else | 
| +#elif !defined(SK_BUILD_FOR_ANDROID) | 
| +    #include <execinfo.h> | 
| #include <signal.h> | 
| +    #include <stdlib.h> | 
|  | 
| static void setup_crash_handler() { | 
| const int kSignals[] = { SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGSEGV }; | 
| for (int sig : kSignals) { | 
| signal(sig, [](int sig) { | 
| if (!in_signal_handler.exchange(true)) { | 
| -                    SkDebugf("\nCaught signal %d [%s].\n", sig, strsignal(sig)); | 
| -                    print_status(); | 
| +                    SkAutoTAcquire<SkSpinlock> lock(gMutex); | 
| +                    SkDebugf("\nCaught signal %d [%s], was running:\n", sig, strsignal(sig)); | 
| +                    for (auto& task : gRunning) { | 
| +                        SkDebugf("\t%s\n", task.c_str()); | 
| +                    } | 
| + | 
| +                    void* stack[64]; | 
| +                    int count = backtrace(stack, SK_ARRAY_COUNT(stack)); | 
| +                    char** symbols = backtrace_symbols(stack, count); | 
| +                    SkDebugf("\nStack trace:\n"); | 
| +                    for (int i = 0; i < count; i++) { | 
| +                        SkDebugf("    %s\n", symbols[i]); | 
| +                    } | 
| } | 
| -                // Reraise this signal to the default handler... hopefully, exit. | 
| -                signal(sig, SIG_DFL); | 
| -                raise(sig); | 
| +                _Exit(sig); | 
| }); | 
| } | 
| } | 
| + | 
| +#else  // Android | 
| +    static void setup_crash_handler() {} | 
| #endif | 
|  | 
| /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ | 
|  |