From 895638880482e55db07cf3aa234247e9fdd828d3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 26 Jul 2016 10:40:11 -0700 Subject: [PATCH 1/3] Only register code range once --- atom/common/crash_reporter/crash_reporter_win.cc | 16 +++++++++------- atom/common/crash_reporter/crash_reporter_win.h | 1 + 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/atom/common/crash_reporter/crash_reporter_win.cc b/atom/common/crash_reporter/crash_reporter_win.cc index 7ce61d69719c..9d066aa517a4 100644 --- a/atom/common/crash_reporter/crash_reporter_win.cc +++ b/atom/common/crash_reporter/crash_reporter_win.cc @@ -138,7 +138,8 @@ void UnregisterNonABICompliantCodeRange(void* start) { } // namespace CrashReporterWin::CrashReporterWin() - : skip_system_crash_handler_(false) { + : skip_system_crash_handler_(false), + code_range_registered_(false) { } CrashReporterWin::~CrashReporterWin() { @@ -189,19 +190,20 @@ void CrashReporterWin::InitBreakpad(const std::string& product_name, LOG(ERROR) << "Cannot initialize out-of-process crash handler"; #ifdef _WIN64 - bool registered = false; // Hook up V8 to breakpad. - { + if (!code_range_registered_) { // gin::Debug::SetCodeRangeCreatedCallback only runs the callback when // Isolate is just created, so we have to manually run following code here. void* code_range = nullptr; size_t size = 0; v8::Isolate::GetCurrent()->GetCodeRange(&code_range, &size); - if (code_range && size) - registered = RegisterNonABICompliantCodeRange(code_range, size); + if (code_range && size && + RegisterNonABICompliantCodeRange(code_range, size)) { + code_range_registered_ = true; + gin::Debug::SetCodeRangeDeletedCallback( + UnregisterNonABICompliantCodeRange); + } } - if (registered) - gin::Debug::SetCodeRangeDeletedCallback(UnregisterNonABICompliantCodeRange); #endif } diff --git a/atom/common/crash_reporter/crash_reporter_win.h b/atom/common/crash_reporter/crash_reporter_win.h index 93be8af32cdb..806c3de317b2 100644 --- a/atom/common/crash_reporter/crash_reporter_win.h +++ b/atom/common/crash_reporter/crash_reporter_win.h @@ -62,6 +62,7 @@ class CrashReporterWin : public CrashReporter { google_breakpad::CustomClientInfo custom_info_; bool skip_system_crash_handler_; + bool code_range_registered_; std::unique_ptr breakpad_; DISALLOW_COPY_AND_ASSIGN(CrashReporterWin); From 3279f5c80ae2d3f4beca0edccf503ea7537dabdb Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 26 Jul 2016 10:43:57 -0700 Subject: [PATCH 2/3] Add spec for starting crash reporter twice --- spec/api-crash-reporter-spec.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/spec/api-crash-reporter-spec.js b/spec/api-crash-reporter-spec.js index b4f63fe1ef27..16806c7102c4 100644 --- a/spec/api-crash-reporter-spec.js +++ b/spec/api-crash-reporter-spec.js @@ -88,5 +88,19 @@ describe('crash-reporter module', function () { }) }, /companyName is a required option to crashReporter\.start/) }) + + it('can be called multiple times', function () { + assert.doesNotThrow(function () { + crashReporter.start({ + companyName: 'Umbrella Corporation', + submitURL: 'http://127.0.0.1/crashes' + }) + + crashReporter.start({ + companyName: 'Umbrella Corporation 2', + submitURL: 'http://127.0.0.1/more-crashes' + }) + }) + }) }) }) From 7a1b796dd05d62f2eec8620a263b874de51a66c8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 26 Jul 2016 10:50:12 -0700 Subject: [PATCH 3/3] Change registered flag from InitBreakpad --- atom/common/crash_reporter/crash_reporter_win.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atom/common/crash_reporter/crash_reporter_win.cc b/atom/common/crash_reporter/crash_reporter_win.cc index 9d066aa517a4..3261f9c9c6a3 100644 --- a/atom/common/crash_reporter/crash_reporter_win.cc +++ b/atom/common/crash_reporter/crash_reporter_win.cc @@ -192,6 +192,7 @@ void CrashReporterWin::InitBreakpad(const std::string& product_name, #ifdef _WIN64 // Hook up V8 to breakpad. if (!code_range_registered_) { + code_range_registered_ = true; // gin::Debug::SetCodeRangeCreatedCallback only runs the callback when // Isolate is just created, so we have to manually run following code here. void* code_range = nullptr; @@ -199,7 +200,6 @@ void CrashReporterWin::InitBreakpad(const std::string& product_name, v8::Isolate::GetCurrent()->GetCodeRange(&code_range, &size); if (code_range && size && RegisterNonABICompliantCodeRange(code_range, size)) { - code_range_registered_ = true; gin::Debug::SetCodeRangeDeletedCallback( UnregisterNonABICompliantCodeRange); }