diff options
author | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-03 19:57:42 +0000 |
---|---|---|
committer | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-03 19:57:42 +0000 |
commit | e4fe427bde7602c8b38996889a0eface92e1a770 (patch) | |
tree | 11a741f8da1ba12fff192fd3be9c182de5523150 | |
parent | e2abdeb2f6ad46c39153ccfbf233f552f0f9691a (diff) | |
download | chromium_src-e4fe427bde7602c8b38996889a0eface92e1a770.zip chromium_src-e4fe427bde7602c8b38996889a0eface92e1a770.tar.gz chromium_src-e4fe427bde7602c8b38996889a0eface92e1a770.tar.bz2 |
Add crash reporting to the long running Chrome Frame helper process.
BUG=53127
TEST=chrome_frame_helper.exe connects to the crash process.
Review URL: http://codereview.chromium.org/3287008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58530 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome_frame/chrome_frame.gyp | 10 | ||||
-rw-r--r-- | chrome_frame/chrome_frame_helper_main.cc | 7 | ||||
-rw-r--r-- | chrome_frame/chrome_frame_launcher.gyp | 4 | ||||
-rw-r--r-- | chrome_frame/chrome_launcher_main.cc | 69 | ||||
-rw-r--r-- | chrome_frame/crash_server_init.cc | 59 | ||||
-rw-r--r-- | chrome_frame/crash_server_init.h | 34 |
6 files changed, 111 insertions, 72 deletions
diff --git a/chrome_frame/chrome_frame.gyp b/chrome_frame/chrome_frame.gyp index bcfcbc0..a45f782 100644 --- a/chrome_frame/chrome_frame.gyp +++ b/chrome_frame/chrome_frame.gyp @@ -603,8 +603,16 @@ 'type': 'static_library', 'dependencies': [ '../base/base.gyp:base_i18n', - ], + '../breakpad/breakpad.gyp:breakpad_handler', + '../chrome/chrome.gyp:chrome_version_header', + ], + 'include_dirs': [ + # To allow including "chrome_tab.h" + '<(SHARED_INTERMEDIATE_DIR)', + ], 'sources': [ + 'crash_server_init.cc', + 'crash_server_init.h', 'simple_resource_loader.cc', 'simple_resource_loader.h', ], diff --git a/chrome_frame/chrome_frame_helper_main.cc b/chrome_frame/chrome_frame_helper_main.cc index f4369a88..5582261 100644 --- a/chrome_frame/chrome_frame_helper_main.cc +++ b/chrome_frame/chrome_frame_helper_main.cc @@ -15,6 +15,8 @@ #include <crtdbg.h> #include <windows.h> +#include "chrome_frame/crash_server_init.h" + // Window class and window names. const wchar_t kChromeFrameHelperWindowClassName[] = L"ChromeFrameHelperWindowClass"; @@ -100,8 +102,9 @@ HWND RegisterAndCreateWindow(HINSTANCE hinstance) { } int APIENTRY wWinMain(HINSTANCE hinstance, HINSTANCE, wchar_t*, int show_cmd) { - // TODO(robertshield): Before this actually gets used, add breakpad - // integration. + const wchar_t* cmd_line = ::GetCommandLine(); + google_breakpad::scoped_ptr<google_breakpad::ExceptionHandler> breakpad( + InitializeCrashReporting(cmd_line)); // Create a window with a known class and title just to listen for WM_CLOSE // messages that will shut us down. diff --git a/chrome_frame/chrome_frame_launcher.gyp b/chrome_frame/chrome_frame_launcher.gyp index aa640a0..0d4b07b1 100644 --- a/chrome_frame/chrome_frame_launcher.gyp +++ b/chrome_frame/chrome_frame_launcher.gyp @@ -69,6 +69,7 @@ 'dependencies': [ '../breakpad/breakpad.gyp:breakpad_handler', '../chrome/chrome.gyp:chrome_version_header', + 'chrome_frame.gyp:chrome_frame_utils', ], 'resource_include_dirs': [ '<(INTERMEDIATE_DIR)', @@ -90,7 +91,7 @@ 'shlwapi.lib', ], }, - }, + }, }, { 'target_name': 'chrome_frame_helper', @@ -99,6 +100,7 @@ 'dependencies': [ '../breakpad/breakpad.gyp:breakpad_handler', '../chrome/chrome.gyp:chrome_version_header', + 'chrome_frame.gyp:chrome_frame_utils', 'chrome_frame_helper_dll', ], 'resource_include_dirs': [ diff --git a/chrome_frame/chrome_launcher_main.cc b/chrome_frame/chrome_launcher_main.cc index e682675..d56ca92 100644 --- a/chrome_frame/chrome_launcher_main.cc +++ b/chrome_frame/chrome_launcher_main.cc @@ -8,75 +8,8 @@ #include <string> #include "chrome_frame/chrome_launcher.h" -#include "breakpad/src/client/windows/handler/exception_handler.h" +#include "chrome_frame/crash_server_init.h" -// TODO(robertshield): Much of the crash report init code is shared with CF and -// probably Chrome too. If this pans out, consider refactoring it into a -// common lib. - -namespace { - -// Possible names for Pipes: -// Headless (testing) mode: "NamedPipe\ChromeCrashServices" -// System-wide install: "NamedPipe\GoogleCrashServices\S-1-5-18" -// Per-user install: "NamedPipe\GoogleCrashServices\<user SID>" -const wchar_t kChromePipeName[] = L"\\\\.\\pipe\\ChromeCrashServices"; -const wchar_t kGoogleUpdatePipeName[] = L"\\\\.\\pipe\\GoogleCrashServices\\"; -const wchar_t kSystemPrincipalSid[] = L"S-1-5-18"; - -// Assume this implies headless mode and use kChromePipeName if it shows -// up in the command line. -const wchar_t kFullMemoryCrashReport[] = L"full-memory-crash-report"; - -const MINIDUMP_TYPE kLargerDumpType = static_cast<MINIDUMP_TYPE>( - MiniDumpWithProcessThreadData | // Get PEB and TEB. - MiniDumpWithUnloadedModules | // Get unloaded modules when available. - MiniDumpWithIndirectlyReferencedMemory); // Get memory referenced by stack. - -} // namespace - -google_breakpad::CustomClientInfo* GetCustomInfo() { - // TODO(robertshield): Populate this with actual data. - std::wstring product(L"ChromeFrame"); - std::wstring version(L"0.1.0.0"); - static google_breakpad::CustomInfoEntry ver_entry(L"ver", version.c_str()); - static google_breakpad::CustomInfoEntry prod_entry(L"prod", product.c_str()); - static google_breakpad::CustomInfoEntry plat_entry(L"plat", L"Win32"); - static google_breakpad::CustomInfoEntry type_entry(L"ptype", L"chrome_frame"); - static google_breakpad::CustomInfoEntry entries[] = { - ver_entry, prod_entry, plat_entry, type_entry }; - static google_breakpad::CustomClientInfo custom_info = { - entries, arraysize(entries) }; - return &custom_info; -} - -google_breakpad::ExceptionHandler* InitializeCrashReporting( - const wchar_t* cmd_line) { - if (cmd_line == NULL) { - return NULL; - } - - wchar_t temp_path[MAX_PATH + 1] = {0}; - DWORD path_len = ::GetTempPath(MAX_PATH, temp_path); - - std::wstring pipe_name; - if (wcsstr(cmd_line, kFullMemoryCrashReport) != NULL) { - pipe_name = kChromePipeName; - } else { - // TODO(robertshield): Figure out if we're a per-user install and connect - // to the per-user named pipe instead. - pipe_name = kGoogleUpdatePipeName; - pipe_name += kSystemPrincipalSid; - } - - google_breakpad::ExceptionHandler* breakpad = - new google_breakpad::ExceptionHandler( - temp_path, NULL, NULL, NULL, - google_breakpad::ExceptionHandler::HANDLER_ALL, kLargerDumpType, - pipe_name.c_str(), GetCustomInfo()); - - return breakpad; -} int APIENTRY wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int) { const wchar_t* cmd_line = ::GetCommandLine(); diff --git a/chrome_frame/crash_server_init.cc b/chrome_frame/crash_server_init.cc new file mode 100644 index 0000000..0f52215 --- /dev/null +++ b/chrome_frame/crash_server_init.cc @@ -0,0 +1,59 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome_frame/crash_server_init.h" + +#include "version.h" // NOLINT + +const wchar_t kChromePipeName[] = L"\\\\.\\pipe\\ChromeCrashServices"; +const wchar_t kGoogleUpdatePipeName[] = L"\\\\.\\pipe\\GoogleCrashServices\\"; +const wchar_t kSystemPrincipalSid[] = L"S-1-5-18"; + +const wchar_t kFullMemoryCrashReport[] = L"full-memory-crash-report"; + +const MINIDUMP_TYPE kLargerDumpType = static_cast<MINIDUMP_TYPE>( + MiniDumpWithProcessThreadData | // Get PEB and TEB. + MiniDumpWithUnloadedModules | // Get unloaded modules when available. + MiniDumpWithIndirectlyReferencedMemory); // Get memory referenced by stack. + +google_breakpad::CustomClientInfo* GetCustomInfo() { + static google_breakpad::CustomInfoEntry ver_entry( + L"ver", TEXT(CHROME_VERSION_STRING)); + static google_breakpad::CustomInfoEntry prod_entry(L"prod", L"ChromeFrame"); + static google_breakpad::CustomInfoEntry plat_entry(L"plat", L"Win32"); + static google_breakpad::CustomInfoEntry type_entry(L"ptype", L"chrome_frame"); + static google_breakpad::CustomInfoEntry entries[] = { + ver_entry, prod_entry, plat_entry, type_entry }; + static google_breakpad::CustomClientInfo custom_info = { + entries, ARRAYSIZE(entries) }; + return &custom_info; +} + +google_breakpad::ExceptionHandler* InitializeCrashReporting( + const wchar_t* cmd_line) { + if (cmd_line == NULL) { + return NULL; + } + + wchar_t temp_path[MAX_PATH + 1] = {0}; + DWORD path_len = ::GetTempPath(MAX_PATH, temp_path); + + std::wstring pipe_name; + if (wcsstr(cmd_line, kFullMemoryCrashReport) != NULL) { + pipe_name = kChromePipeName; + } else { + // TODO(robertshield): Figure out if we're a per-user install and connect + // to the per-user named pipe instead. + pipe_name = kGoogleUpdatePipeName; + pipe_name += kSystemPrincipalSid; + } + + google_breakpad::ExceptionHandler* breakpad = + new google_breakpad::ExceptionHandler( + temp_path, NULL, NULL, NULL, + google_breakpad::ExceptionHandler::HANDLER_ALL, kLargerDumpType, + pipe_name.c_str(), GetCustomInfo()); + + return breakpad; +} diff --git a/chrome_frame/crash_server_init.h b/chrome_frame/crash_server_init.h new file mode 100644 index 0000000..bf7ff95 --- /dev/null +++ b/chrome_frame/crash_server_init.h @@ -0,0 +1,34 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_FRAME_CRASH_SERVER_INIT_H_ +#define CHROME_FRAME_CRASH_SERVER_INIT_H_ + +#include "breakpad/src/client/windows/handler/exception_handler.h" + +// Possible names for Pipes: +// Headless (testing) mode: "NamedPipe\ChromeCrashServices" +// System-wide install: "NamedPipe\GoogleCrashServices\S-1-5-18" +// Per-user install: "NamedPipe\GoogleCrashServices\<user SID>" +extern const wchar_t kChromePipeName[]; +extern const wchar_t kGoogleUpdatePipeName[]; +extern const wchar_t kSystemPrincipalSid[]; + +// Assume this implies headless mode and use kChromePipeName if it shows +// up in the command line. +extern const wchar_t kFullMemoryCrashReport[]; + +extern const MINIDUMP_TYPE kLargerDumpType; + +// Returns a pointer to a static instance of a CustomClientInfo structure +// containing Chrome Frame specific data. +google_breakpad::CustomClientInfo* GetCustomInfo(); + +// Initializes breakpad crash reporting and returns a pointer to a newly +// constructed ExceptionHandler object. It is the responsibility of the caller +// to delete this object which will shut down the crash reporting machinery. +google_breakpad::ExceptionHandler* InitializeCrashReporting( + const wchar_t* cmd_line); + +#endif // CHROME_FRAME_CRASH_SERVER_INIT_H_ |