Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(232)

Side by Side Diff: dm/DM.cpp

Issue 1744553002: DM crash handler tweaks (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: win too Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "CrashHandler.h" 8 #include "CrashHandler.h"
9 #include "DMJsonWriter.h" 9 #include "DMJsonWriter.h"
10 #include "DMSrcSink.h" 10 #include "DMSrcSink.h"
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 SkString elapsed = HumanizeMs(SkTime::GetMSecs() - start_ms); 122 SkString elapsed = HumanizeMs(SkTime::GetMSecs() - start_ms);
123 123
124 SkAutoTAcquire<SkPODSpinlock> lock(gMutex); 124 SkAutoTAcquire<SkPODSpinlock> lock(gMutex);
125 SkDebugf("\n%s elapsed, %d active, %d queued, %dMB RAM, %dMB peak\n", 125 SkDebugf("\n%s elapsed, %d active, %d queued, %dMB RAM, %dMB peak\n",
126 elapsed.c_str(), gRunning.count(), gPending - gRunning.count(), cur r, peak); 126 elapsed.c_str(), gRunning.count(), gPending - gRunning.count(), cur r, peak);
127 for (auto& task : gRunning) { 127 for (auto& task : gRunning) {
128 SkDebugf("\t%s\n", task.c_str()); 128 SkDebugf("\t%s\n", task.c_str());
129 } 129 }
130 } 130 }
131 131
132 // Yo dawg, I heard you like signals so I caught a signal in your
133 // signal handler so you can handle signals while you handle signals.
134 // Let's not get into that situation. Only print if we're the first ones to get a crash signal.
135 static std::atomic<bool> in_signal_handler{false};
136
132 #if defined(SK_BUILD_FOR_WIN32) 137 #if defined(SK_BUILD_FOR_WIN32)
133 static void setup_crash_handler() { 138 static LONG WINAPI handler(EXCEPTION_POINTERS* e) {
134 // TODO: custom crash handler like below to print out what was running 139 static const struct {
135 SetupCrashHandler(); 140 const char* name;
141 int code;
142 } kExceptions[] = {
143 #define _(E) {#E, E}
144 _(EXCEPTION_ACCESS_VIOLATION),
145 _(EXCEPTION_BREAKPOINT),
146 _(EXCEPTION_INT_DIVIDE_BY_ZERO),
147 _(EXCEPTION_STACK_OVERFLOW),
148 // TODO: more?
149 #undef _
150 };
151
152 if (!in_signal_handler.exchange(true)) {
153 const DWORD code = e->ExceptionRecord->ExceptionCode;
154 SkDebugf("\nCaught exception %u", code);
155 for (const auto& exception : kExceptions) {
156 if (exception.code == code) {
157 SkDebugf(" %s", exception.name);
158 }
159 }
160 SkDebugf("\n");
161 print_status();
162 }
163 // Execute default exception handler... hopefully, exit.
164 return EXCEPTION_EXECUTE_HANDLER;
136 } 165 }
166 static void setup_crash_handler() { SetUnhandledExceptionFilter(handler); }
137 167
138 #else 168 #else
139 #include <signal.h> 169 #include <signal.h>
170
140 static void setup_crash_handler() { 171 static void setup_crash_handler() {
141 const int kSignals[] = { SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGSEGV }; 172 const int kSignals[] = { SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGSEGV };
142 for (int sig : kSignals) { 173 for (int sig : kSignals) {
143 signal(sig, [](int sig) { 174 signal(sig, [](int sig) {
144 SkDebugf("\nCaught signal %d [%s].\n", sig, strsignal(sig)); 175 if (!in_signal_handler.exchange(true)) {
145 print_status(); 176 SkDebugf("\nCaught signal %d [%s].\n", sig, strsignal(sig));
177 print_status();
178 }
179 // Reraise this signal to the default handler... hopefully, exit .
180 signal(sig, SIG_DFL);
181 raise(sig);
146 }); 182 });
147 } 183 }
148 } 184 }
149 #endif 185 #endif
150 186
151 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/ 187 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/
152 188
153 struct Gold : public SkString { 189 struct Gold : public SkString {
154 Gold() : SkString("") {} 190 Gold() : SkString("") {}
155 Gold(const SkString& sink, const SkString& src, 191 Gold(const SkString& sink, const SkString& src,
(...skipping 1181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1337 Reporter* reporter, 1373 Reporter* reporter,
1338 GrContextFactory* fac tory); 1374 GrContextFactory* fac tory);
1339 } // namespace skiatest 1375 } // namespace skiatest
1340 1376
1341 #if !defined(SK_BUILD_FOR_IOS) 1377 #if !defined(SK_BUILD_FOR_IOS)
1342 int main(int argc, char** argv) { 1378 int main(int argc, char** argv) {
1343 SkCommandLineFlags::Parse(argc, argv); 1379 SkCommandLineFlags::Parse(argc, argv);
1344 return dm_main(); 1380 return dm_main();
1345 } 1381 }
1346 #endif 1382 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698