• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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