1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef COMPONENTS_CRASH_TOOLS_CRASH_SERVICE_H_ 6 #define COMPONENTS_CRASH_TOOLS_CRASH_SERVICE_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/files/file_path.h" 12 #include "base/synchronization/lock.h" 13 14 namespace google_breakpad { 15 16 class CrashReportSender; 17 class CrashGenerationServer; 18 class ClientInfo; 19 20 } 21 22 namespace breakpad { 23 24 // This class implements an out-of-process crash server. It uses breakpad's 25 // CrashGenerationServer and CrashReportSender to generate and then send the 26 // crash dumps. Internally, it uses OS specific pipe to allow applications to 27 // register for crash dumps and later on when a registered application crashes 28 // it will signal an event that causes this code to wake up and perform a 29 // crash dump on the signaling process. The dump is then stored on disk and 30 // possibly sent to the crash2 servers. 31 class CrashService { 32 public: 33 CrashService(); 34 ~CrashService(); 35 36 // Starts servicing crash dumps. Returns false if it failed. Do not use 37 // other members in that case. |operating_dir| is where the CrashService 38 // should store breakpad's checkpoint file. |dumps_path| is the directory 39 // where the crash dumps should be stored. 40 bool Initialize(const base::FilePath& operating_dir, 41 const base::FilePath& dumps_path); 42 43 // Command line switches: 44 // 45 // --max-reports=<number> 46 // Allows to override the maximum number for reports per day. Normally 47 // the crash dumps are never sent so if you want to send any you must 48 // specify a positive number here. 49 static const char kMaxReports[]; 50 // --no-window 51 // Does not create a visible window on the desktop. The window does not have 52 // any other functionality other than allowing the crash service to be 53 // gracefully closed. 54 static const char kNoWindow[]; 55 // --reporter=<string> 56 // Allows to specify a custom string that appears on the detail crash report 57 // page in the crash server. This should be a 25 chars or less string. 58 // The default tag if not specified is 'crash svc'. 59 static const char kReporterTag[]; 60 // --dumps-dir=<directory-path> 61 // Override the directory to which crash dump files will be written. 62 static const char kDumpsDir[]; 63 // --pipe-name=<string> 64 // Override the name of the Windows named pipe on which we will 65 // listen for crash dump request messages. 66 static const char kPipeName[]; 67 68 // Returns number of crash dumps handled. requests_handled()69 int requests_handled() const { 70 return requests_handled_; 71 } 72 // Returns number of crash clients registered. clients_connected()73 int clients_connected() const { 74 return clients_connected_; 75 } 76 // Returns number of crash clients terminated. clients_terminated()77 int clients_terminated() const { 78 return clients_terminated_; 79 } 80 81 // Starts the processing loop. This function does not return unless the 82 // user is logging off or the user closes the crash service window. The 83 // return value is a good number to pass in ExitProcess(). 84 int ProcessingLoop(); 85 86 private: 87 static void OnClientConnected(void* context, 88 const google_breakpad::ClientInfo* client_info); 89 90 static void OnClientDumpRequest( 91 void* context, 92 const google_breakpad::ClientInfo* client_info, 93 const std::wstring* file_path); 94 95 static void OnClientExited(void* context, 96 const google_breakpad::ClientInfo* client_info); 97 98 // This routine sends the crash dump to the server. It takes the sending_ 99 // lock when it is performing the send. 100 static unsigned long __stdcall AsyncSendDump(void* context); 101 102 // Returns the security descriptor which access to low integrity processes 103 // The caller is supposed to free the security descriptor by calling 104 // LocalFree. 105 PSECURITY_DESCRIPTOR GetSecurityDescriptorForLowIntegrity(); 106 107 google_breakpad::CrashGenerationServer* dumper_; 108 google_breakpad::CrashReportSender* sender_; 109 110 // the extra tag sent to the server with each dump. 111 std::wstring reporter_tag_; 112 113 // clients serviced statistics: 114 int requests_handled_; 115 int requests_sent_; 116 volatile long clients_connected_; 117 volatile long clients_terminated_; 118 base::Lock sending_; 119 120 DISALLOW_COPY_AND_ASSIGN(CrashService); 121 }; 122 123 } // namespace breakpad 124 125 #endif // COMPONENTS_CRASH_TOOLS_CRASH_SERVICE_H_ 126