Home | History | Annotate | Download | only in android
      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