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_DUMP_MANAGER_ANDROID_H_ 6 #define COMPONENTS_BREAKPAD_BROWSER_CRASH_DUMP_MANAGER_ANDROID_H_ 7 8 #include <map> 9 10 #include "base/files/file_path.h" 11 #include "base/platform_file.h" 12 #include "base/process/process.h" 13 #include "base/synchronization/lock.h" 14 #include "content/public/browser/browser_child_process_observer.h" 15 #include "content/public/browser/notification_observer.h" 16 #include "content/public/browser/notification_registrar.h" 17 18 namespace content { 19 class RenderProcessHost; 20 } 21 22 namespace breakpad { 23 24 // This class manages the crash minidumps. 25 // On Android, because of process isolation, each renderer process runs with a 26 // different UID. As a result, we cannot generate the minidumps in the browser 27 // (as the browser process does not have access to some system files for the 28 // crashed process). So the minidump is generated in the renderer process. 29 // Since the isolated process cannot open files, we provide it on creation with 30 // a file descriptor where to write the minidump in the event of a crash. 31 // This class creates these file descriptors and associates them with render 32 // processes and take the appropriate action when the render process terminates. 33 class CrashDumpManager : public content::BrowserChildProcessObserver, 34 public content::NotificationObserver { 35 public: 36 // The embedder should create a single instance of the CrashDumpManager. 37 static CrashDumpManager* GetInstance(); 38 39 // Should be created on the UI thread. 40 explicit CrashDumpManager(const base::FilePath& crash_dump_dir); 41 42 virtual ~CrashDumpManager(); 43 44 // Returns a file descriptor that should be used to generate a minidump for 45 // the process |child_process_id|. 46 int CreateMinidumpFile(int child_process_id); 47 48 private: 49 typedef std::map<int, base::FilePath> ChildProcessIDToMinidumpPath; 50 51 static void ProcessMinidump(const base::FilePath& minidump_path, 52 base::ProcessHandle pid); 53 54 // content::BrowserChildProcessObserver implementation: 55 virtual void BrowserChildProcessHostDisconnected( 56 const content::ChildProcessData& data) OVERRIDE; 57 virtual void BrowserChildProcessCrashed( 58 const content::ChildProcessData& data) OVERRIDE; 59 60 // NotificationObserver implementation: 61 virtual void Observe(int type, 62 const content::NotificationSource& source, 63 const content::NotificationDetails& details) OVERRIDE; 64 65 // Called on child process exit (including crash). 66 void OnChildExit(int child_process_id, base::ProcessHandle pid); 67 68 content::NotificationRegistrar notification_registrar_; 69 70 // This map should only be accessed with its lock aquired as it is accessed 71 // from the PROCESS_LAUNCHER and UI threads. 72 base::Lock child_process_id_to_minidump_path_lock_; 73 ChildProcessIDToMinidumpPath child_process_id_to_minidump_path_; 74 75 base::FilePath crash_dump_dir_; 76 77 static CrashDumpManager* instance_; 78 79 DISALLOW_COPY_AND_ASSIGN(CrashDumpManager); 80 }; 81 82 } // namespace breakpad 83 84 #endif // COMPONENTS_BREAKPAD_BROWSER_CRASH_DUMP_MANAGER_ANDROID_H_ 85