| Index: goopdate/crash.h
|
| diff --git a/goopdate/crash.h b/goopdate/crash.h
|
| deleted file mode 100644
|
| index 013dfd18082d473b03aa43e8a00b5cfc719e042e..0000000000000000000000000000000000000000
|
| --- a/goopdate/crash.h
|
| +++ /dev/null
|
| @@ -1,293 +0,0 @@
|
| -// Copyright 2007-2010 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -
|
| -#ifndef OMAHA_GOOPDATE_CRASH_H__
|
| -#define OMAHA_GOOPDATE_CRASH_H__
|
| -
|
| -#include <windows.h>
|
| -#include <dbghelp.h>
|
| -#include <atlsecurity.h>
|
| -#include <atlstr.h>
|
| -#include <map>
|
| -#include "base/basictypes.h"
|
| -#include "omaha/common/const_goopdate.h"
|
| -#include "third_party/gtest/include/gtest/gtest_prod.h"
|
| -#include "third_party/breakpad/src/client/windows/crash_generation/client_info.h"
|
| -#include "third_party/breakpad/src/client/windows/crash_generation/crash_generation_server.h"
|
| -#include "third_party/breakpad/src/client/windows/handler/exception_handler.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -// Annotates the version reported along with the crash.
|
| -const TCHAR* const kCrashVersionPostfixString =
|
| -#if !OFFICIAL_BUILD
|
| - _T(".private")
|
| -#endif
|
| -#if DEBUG
|
| - _T(".debug")
|
| -#endif
|
| - _T("");
|
| -
|
| -// Official builds can only send a few crashes per day. Debug builds including
|
| -// all build modes for unit tests send unlimited number of crashes.
|
| -const int kCrashReportMaxReportsPerDay =
|
| -#if OFFICIAL_BUILD
|
| - 5;
|
| -#else
|
| - INT_MAX;
|
| -#endif
|
| -
|
| -const TCHAR* const kNoCrashHandlerEnvVariableName =
|
| - _T("GOOGLE_UPDATE_NO_CRASH_HANDLER");
|
| -
|
| -// TODO(omaha): refactor so this is not a static class.
|
| -// TODO(omaha): rename class name to better indicate its funtionality.
|
| -class Crash {
|
| - public:
|
| - typedef std::map<std::wstring, std::wstring> ParameterMap;
|
| -
|
| - // Installs and uninstalls Breakpad exception handler. Calling the
|
| - // functions from DllMain results in undefined behavior, including
|
| - // deadlocks.
|
| - static HRESULT InstallCrashHandler(bool is_machine);
|
| - static void UninstallCrashHandler();
|
| -
|
| - // Starts the server to listen for out-of-process crashes.
|
| - static HRESULT StartServer();
|
| -
|
| - // Stops the crash server.
|
| - static void StopServer();
|
| -
|
| - // Generates a divide by zero to trigger Breakpad dump in non-ship builds.
|
| - static int CrashNow();
|
| -
|
| - // Handles out-of-process crash requests.
|
| - static HRESULT CrashHandler(bool is_machine,
|
| - const google_breakpad::ClientInfo& client_info,
|
| - const CString& crash_filename);
|
| -
|
| - // Reports a crash by logging it to the Windows event log, saving a copy of
|
| - // the crash, and uploading it. After reporting the crash, the function
|
| - // deletes the crash file. Crashes that have a custom info file are
|
| - // considered product crashes and they are always handled out-of-process.
|
| - // These crashes are always uploaded.
|
| - // Crashes that do not specify a custom info file are considered Omaha
|
| - // internal crashes and they are handled in-process. In this case, the
|
| - // upload behavior is controlled by the value of can_upload_in_process
|
| - // parameter.
|
| - static HRESULT Report(bool can_upload_in_process,
|
| - const CString& crash_filename,
|
| - const CString& custom_info_filename,
|
| - const CString& lang);
|
| -
|
| - // Sets a version string which is appended to the 'ver' parameter sent
|
| - // with the crash report.
|
| - static void set_version_postfix(const TCHAR* version_postfix) {
|
| - version_postfix_ = version_postfix;
|
| - }
|
| -
|
| - // Sets how many reports can be sent until the crash report sender starts
|
| - // rejecting and discarding crashes.
|
| - static void set_max_reports_per_day(int max_reports_per_day) {
|
| - max_reports_per_day_ = max_reports_per_day;
|
| - }
|
| -
|
| - static void set_crash_report_url(const TCHAR* crash_report_url) {
|
| - crash_report_url_ = crash_report_url;
|
| - }
|
| -
|
| - static bool is_machine() { return is_machine_; }
|
| -
|
| - private:
|
| -
|
| - static HRESULT Initialize(bool is_machine);
|
| -
|
| - // Reports a crash of Google Update. Does not delete the crash file.
|
| - static HRESULT ReportGoogleUpdateCrash(bool can_upload,
|
| - const CString& crash_filename,
|
| - const CString& custom_info_filename,
|
| - const CString& lang);
|
| -
|
| - // Reports an out-of-process crash on behalf of another product. Does not
|
| - // delete the crash file.
|
| - static HRESULT ReportProductCrash(bool can_upload,
|
| - const CString& crash_filename,
|
| - const CString& custom_info_filename,
|
| - const CString& lang);
|
| -
|
| - // Initializes the crash directory. Creates the directory if it does not
|
| - // exist.
|
| - static HRESULT InitializeCrashDir();
|
| -
|
| - static HRESULT InitializeDirSecurity(CString* dir);
|
| -
|
| - // Returns true if the current process is reporting an exception.
|
| - static HRESULT IsCrashReportProcess(bool* is_crash_report_process);
|
| -
|
| - // Logs an entry in the Windows Event Log for the specified source.
|
| - static HRESULT Log(uint16 type,
|
| - uint32 id,
|
| - const TCHAR* source,
|
| - const TCHAR* description);
|
| -
|
| - // Starts the sender process with the environment variables setup such that
|
| - // the sender process doesn't register crash filter to avoid potential
|
| - // recursive crashes problem.
|
| - static HRESULT StartSenderWithCommandLine(CString* cmd_line);
|
| -
|
| - // Creates a text file that contains name/value pairs of custom information.
|
| - // The text file is created in the same directory as the given dump file, but
|
| - // with a .txt extension. Stores the path of the text file created in the
|
| - // custom_info_filepath parameter.
|
| - // TODO(omaha): Move this functionality to breakpad. All the information
|
| - // needed to write custom information file is known when the dump is generated
|
| - // and hence breakpad could as easily create the text file.
|
| - static HRESULT CreateCustomInfoFile(
|
| - const CString& dump_file,
|
| - const google_breakpad::CustomClientInfo& client_info,
|
| - CString* custom_info_filepath);
|
| -
|
| - // Sends a crash report. If sent successfully, report_id contains the
|
| - // report id generated by the crash server.
|
| - static HRESULT DoSendCrashReport(bool can_upload,
|
| - bool is_out_of_process,
|
| - const CString& crash_filename,
|
| - const ParameterMap& parameters,
|
| - CString* report_id);
|
| -
|
| - // Callback function to run after the minidump has been written.
|
| - static bool MinidumpCallback(const wchar_t* dump_path,
|
| - const wchar_t* minidump_id,
|
| - void* context,
|
| - EXCEPTION_POINTERS* exinfo,
|
| - MDRawAssertionInfo* assertion,
|
| - bool succeeded);
|
| -
|
| - // Start an instance of /report.
|
| - static void StartReportCrash(bool is_interactive,
|
| - const CString& crash_filename);
|
| -
|
| - // Returns true if the crash has happened in an Omaha process which
|
| - // has a top level window up.
|
| - static bool IsInteractive();
|
| -
|
| - // Returns the "prod" product name if found in the map or a default,
|
| - // constant string otherwise.
|
| - static CString GetProductName(const ParameterMap& parameters);
|
| -
|
| - // Updates the crash metrics after uploading the crash.
|
| - static void UpdateCrashUploadMetrics(bool is_out_of_process, HRESULT hr);
|
| -
|
| - // Uploads the crash, logs the result of the crash upload, and updates
|
| - // the crash metrics.
|
| - static HRESULT UploadCrash(bool is_out_of_process,
|
| - const CString& crash_filename,
|
| - const ParameterMap& parameters,
|
| - CString* report_id);
|
| -
|
| - // Creates a back up copy of the current crash for future debugging use cases.
|
| - static HRESULT SaveLastCrash(const CString& crash_filename,
|
| - const CString& product_name);
|
| -
|
| - // Cleans up stale crashes from the crash dir. Curently, crashes older than
|
| - // 1 day are deleted.
|
| - static HRESULT CleanStaleCrashes();
|
| -
|
| - // Retrieves the minidump exception information from the minidump file.
|
| - static HRESULT GetExceptionInfo(const CString& crash_filename,
|
| - MINIDUMP_EXCEPTION* ex_info);
|
| -
|
| - // Receives a top-level window and sets the param to true if the window
|
| - // belongs to this process.
|
| - static BOOL CALLBACK EnumWindowsCallback(HWND hwnd, LPARAM param);
|
| -
|
| - // Callback function to run when an exception is passing through an
|
| - // exception barrier.
|
| - static void __stdcall EBHandler(EXCEPTION_POINTERS* ptrs);
|
| -
|
| - // Callback function to run when a new client connects to the crash server.
|
| - static void _cdecl ClientConnectedCallback(
|
| - void* context,
|
| - const google_breakpad::ClientInfo* client_info);
|
| -
|
| - // Callback function to run when a client signals a crash to the crash server.
|
| - static void _cdecl ClientCrashedCallback(
|
| - void* context,
|
| - const google_breakpad::ClientInfo* client_info,
|
| - const std::wstring* dump_path);
|
| -
|
| - // Callback function to run when a client disconnects from the crash server.
|
| - static void _cdecl ClientExitedCallback(
|
| - void* context,
|
| - const google_breakpad::ClientInfo* client_info);
|
| -
|
| - // Given an empty CSecurityDesc, creates a low integrity sacl within it.
|
| - static HRESULT CreateLowIntegrityDesc(CSecurityDesc* sd);
|
| -
|
| - // Builds a security DACL to allow user processes to connect to the crash
|
| - // server named pipe, and sets the DACL on the CSecurityDesc.
|
| - static bool AddPipeSecurityDaclToDesc(bool is_machine, CSecurityDesc* sd);
|
| -
|
| - // Builds a security attribute to allow user processes including low integrity
|
| - // to connect to the crash server named pipe.
|
| - static bool BuildPipeSecurityAttributes(bool is_machine,
|
| - CSecurityAttributes* sa);
|
| -
|
| - // Builds a security attribute to allow full control for the Local System
|
| - // account and read/execute for the Administrators group, when the crash
|
| - // handler is running as Local System.
|
| - static bool BuildCrashDirSecurityAttributes(CSecurityAttributes* sa);
|
| -
|
| - // TODO(omaha): fix static instances of class type not allowed.
|
| - static CString module_filename_;
|
| - static CString Crash::crash_dir_;
|
| - static CString Crash::checkpoint_file_;
|
| - static CString version_postfix_;
|
| -
|
| - static CString crash_report_url_;
|
| - static int max_reports_per_day_;
|
| - static google_breakpad::ExceptionHandler* exception_handler_;
|
| - static google_breakpad::CrashGenerationServer* crash_server_;
|
| -
|
| - static bool is_machine_;
|
| -
|
| - static const int kCrashReportAttempts = 3;
|
| - static const int kCrashReportResendPeriodMs = 1 * 60 * 60 * 1000; // 1 hour.
|
| -
|
| - // Default string to report out-of-process crashes with in the case
|
| - // 'prod' information is not available.
|
| - static const TCHAR* const kDefaultProductName;
|
| -
|
| - friend class CrashTest;
|
| -
|
| - FRIEND_TEST(CrashTest, CleanStaleCrashes);
|
| - FRIEND_TEST(CrashTest, CreateCustomInfoFile);
|
| - FRIEND_TEST(CrashTest, GetExceptionInfo);
|
| - FRIEND_TEST(CrashTest, GetProductName);
|
| - FRIEND_TEST(CrashTest, InstallCrashHandler);
|
| - FRIEND_TEST(CrashTest, IsCrashReportProcess);
|
| - FRIEND_TEST(CrashTest, Report_OmahaCrash);
|
| - FRIEND_TEST(CrashTest, Report_ProductCrash);
|
| - FRIEND_TEST(CrashTest, SaveLastCrash);
|
| - FRIEND_TEST(CrashTest, StartServer);
|
| - FRIEND_TEST(CrashTest, WriteMinidump);
|
| -
|
| - DISALLOW_IMPLICIT_CONSTRUCTORS(Crash);
|
| -};
|
| -
|
| -} // namespace omaha
|
| -
|
| -#endif // OMAHA_GOOPDATE_CRASH_H__
|
| -
|
|
|