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.h" 11#include "base/files/file_path.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 18namespace content { 19class RenderProcessHost; 20} 21 22namespace 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. 33class 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 that should be used to generate a minidump for the process 45 // |child_process_id|. 46 base::File 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