From d4b44d8b69c157d3f6f54b8875cf1f15ea345ba3 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 1 Dec 2016 18:19:57 -0800 Subject: [PATCH 01/11] Expose crash reporter start for child node processes --- atom/app/node_main.cc | 8 +++++--- atom/common/api/atom_bindings.cc | 35 ++++++++++++++++++++++++++------ atom/common/api/atom_bindings.h | 9 ++++++++ default_app/default_app.js | 7 ++++++- default_app/forkedProcess.js | 12 +++++++++++ default_app/index.html | 17 +++++++++++++++- 6 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 default_app/forkedProcess.js diff --git a/atom/app/node_main.cc b/atom/app/node_main.cc index af8974fb29..5f12d9602e 100644 --- a/atom/app/node_main.cc +++ b/atom/app/node_main.cc @@ -14,11 +14,11 @@ #include "gin/public/isolate_holder.h" #include "gin/v8_initializer.h" -#if defined(OS_WIN) + #include "atom/common/api/atom_bindings.h" #include "atom/common/native_mate_converters/string16_converter.h" #include "native_mate/dictionary.h" -#endif + #include "atom/common/node_includes.h" @@ -58,10 +58,12 @@ int NodeMain(int argc, char *argv[]) { if (node_debugger.IsRunning()) env->AssignToContext(v8::Debug::GetDebugContext(gin_env.isolate())); -#if defined(OS_WIN) mate::Dictionary process(gin_env.isolate(), env->process_object()); +#if defined(OS_WIN) process.SetMethod("log", &AtomBindings::Log); #endif + process.SetMethod("startCrashReporter", &AtomBindings::StartCrashReporter); + process.SetMethod("crash", &AtomBindings::Crash); node::LoadEnvironment(env); diff --git a/atom/common/api/atom_bindings.cc b/atom/common/api/atom_bindings.cc index 9173a10a38..2ea6d28463 100644 --- a/atom/common/api/atom_bindings.cc +++ b/atom/common/api/atom_bindings.cc @@ -6,10 +6,12 @@ #include #include +#include #include #include "atom/common/atom_version.h" #include "atom/common/chrome_version.h" +#include "atom/common/crash_reporter/crash_reporter.h" #include "atom/common/native_mate_converters/string16_converter.h" #include "atom/common/node_includes.h" #include "base/logging.h" @@ -23,10 +25,6 @@ namespace { // Dummy class type that used for crashing the program. struct DummyClass { bool crash; }; -void Crash() { - static_cast(nullptr)->crash = true; -} - void Hang() { for (;;) base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); @@ -76,7 +74,7 @@ v8::Local GetSystemMemoryInfo(v8::Isolate* isolate, // we can get the stack trace. void FatalErrorCallback(const char* location, const char* message) { LOG(ERROR) << "Fatal error in V8: " << location << " " << message; - Crash(); + AtomBindings::Crash(); } } // namespace @@ -95,7 +93,7 @@ void AtomBindings::BindTo(v8::Isolate* isolate, v8::V8::SetFatalErrorHandler(FatalErrorCallback); mate::Dictionary dict(isolate, process); - dict.SetMethod("crash", &Crash); + dict.SetMethod("crash", &AtomBindings::Crash); dict.SetMethod("hang", &Hang); dict.SetMethod("log", &Log); dict.SetMethod("getProcessMemoryInfo", &GetProcessMemoryInfo); @@ -159,4 +157,29 @@ void AtomBindings::Log(const base::string16& message) { std::cout << message << std::flush; } +void AtomBindings::Crash() { + static_cast(nullptr)->crash = true; +} + +void AtomBindings::StartCrashReporter( + const std::string& productName, + const std::string& companyName, + const std::string& submitUrl, + const std::string& tmpPath, + const std::map& extra_parameters) { + std::map allParameters; + allParameters.insert(std::make_pair("_productName", productName)); + allParameters.insert(std::make_pair("_companyName", companyName)); + allParameters.insert(extra_parameters.begin(), extra_parameters.end()); + + auto reporter = crash_reporter::CrashReporter::GetInstance(); + reporter->Start(productName, + companyName, + submitUrl, + base::FilePath(tmpPath), + true, + false, + allParameters); +} + } // namespace atom diff --git a/atom/common/api/atom_bindings.h b/atom/common/api/atom_bindings.h index 2e4c4a937b..108682d46e 100644 --- a/atom/common/api/atom_bindings.h +++ b/atom/common/api/atom_bindings.h @@ -6,6 +6,8 @@ #define ATOM_COMMON_API_ATOM_BINDINGS_H_ #include +#include +#include #include "base/macros.h" #include "base/strings/string16.h" @@ -28,6 +30,13 @@ class AtomBindings { void BindTo(v8::Isolate* isolate, v8::Local process); static void Log(const base::string16& message); + static void Crash(); + static void StartCrashReporter( + const std::string& productName, + const std::string& companyName, + const std::string& submitUrl, + const std::string& tmpPath, + const std::map& extra_parameters); private: void ActivateUVLoop(v8::Isolate* isolate); diff --git a/default_app/default_app.js b/default_app/default_app.js index bfb97a9ab0..989dac5c58 100644 --- a/default_app/default_app.js +++ b/default_app/default_app.js @@ -1,4 +1,4 @@ -const {app, BrowserWindow} = require('electron') +const {app, BrowserWindow, crashReporter} = require('electron') const path = require('path') let mainWindow = null @@ -20,6 +20,11 @@ exports.load = (appUrl) => { if (process.platform === 'linux') { options.icon = path.join(__dirname, 'icon.png') } + crashReporter.start({ + submitURL: "http://localhost:8080/uploadDump/mainDump", + companyName: "Main Company", + productName: "Main Product" + }) mainWindow = new BrowserWindow(options) mainWindow.loadURL(appUrl) diff --git a/default_app/forkedProcess.js b/default_app/forkedProcess.js new file mode 100644 index 0000000000..6d61392015 --- /dev/null +++ b/default_app/forkedProcess.js @@ -0,0 +1,12 @@ +const os = require('os') +const path = require('path') + +let productName = 'Child Product'; +let companyName = 'Child Company'; +let tmpPath = path.join(os.tmpdir(), productName + ' Crashes'); + +process.startCrashReporter(productName, companyName, 'http://localhost:8080/uploadDump/childDump', tmpPath, { + randomData1: 'The Holidays are here!', + randomData2: 'Happy New Year!' +}); +process.crash(); diff --git a/default_app/index.html b/default_app/index.html index 292fd119b2..bc77cbb560 100644 --- a/default_app/index.html +++ b/default_app/index.html @@ -114,11 +114,24 @@