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