• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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_BREAKPAD_BROWSER_CRASH_HANDLER_HOST_LINUX_H_
6 #define COMPONENTS_BREAKPAD_BROWSER_CRASH_HANDLER_HOST_LINUX_H_
7 
8 #include <sys/types.h>
9 
10 #include <string>
11 
12 #include "base/compiler_specific.h"
13 #include "base/files/file_path.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/message_loop/message_loop.h"
16 #include "base/threading/sequenced_worker_pool.h"
17 
18 namespace base {
19 class Thread;
20 }
21 
22 namespace breakpad {
23 
24 struct BreakpadInfo;
25 
26 // This is the host for processes which run breakpad inside the sandbox on
27 // Linux or Android. We perform the crash dump from the browser because it
28 // allows us to be outside the sandbox.
29 //
30 // Processes signal that they need to be dumped by sending a datagram over a
31 // UNIX domain socket. All processes of the same type share the client end of
32 // this socket which is installed in their descriptor table before exec.
33 class CrashHandlerHostLinux : public base::MessageLoopForIO::Watcher,
34                               public base::MessageLoop::DestructionObserver {
35  public:
36   CrashHandlerHostLinux(const std::string& process_type,
37                         const base::FilePath& dumps_path,
38                         bool upload);
39   virtual ~CrashHandlerHostLinux();
40 
41   // Starts the uploader thread. Must be called immediately after creating the
42   // class.
43   void StartUploaderThread();
44 
45   // Get the file descriptor which processes should be given in order to signal
46   // crashes to the browser.
GetDeathSignalSocket()47   int GetDeathSignalSocket() const {
48     return process_socket_;
49   }
50 
51   // MessagePumbLibevent::Watcher impl:
52   virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE;
53   virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE;
54 
55   // MessageLoop::DestructionObserver impl:
56   virtual void WillDestroyCurrentMessageLoop() OVERRIDE;
57 
58   // Whether we are shutting down or not.
59   bool IsShuttingDown() const;
60 
61  private:
62   void Init();
63 
64   // Do work on the FILE thread for OnFileCanReadWithoutBlocking().
65   void WriteDumpFile(BreakpadInfo* info,
66                      pid_t crashing_pid,
67                      char* crash_context,
68                      int signal_fd);
69 
70   // Continue OnFileCanReadWithoutBlocking()'s work on the IO thread.
71   void QueueCrashDumpTask(BreakpadInfo* info, int signal_fd);
72 
73   std::string process_type_;
74   base::FilePath dumps_path_;
75   bool upload_;
76 
77   int process_socket_;
78   int browser_socket_;
79 
80   base::MessageLoopForIO::FileDescriptorWatcher file_descriptor_watcher_;
81   scoped_ptr<base::Thread> uploader_thread_;
82   bool shutting_down_;
83 
84   // Unique sequence token so that writing crash dump won't be blocked
85   // by other tasks.
86   base::SequencedWorkerPool::SequenceToken worker_pool_token_;
87 
88 #if defined(ADDRESS_SANITIZER)
89   char* asan_report_str_;
90 #endif
91 
92   DISALLOW_COPY_AND_ASSIGN(CrashHandlerHostLinux);
93 };
94 
95 }  // namespace breakpad
96 
97 #endif  // COMPONENTS_BREAKPAD_BROWSER_CRASH_HANDLER_HOST_LINUX_H_
98