Index: chrome/browser/metrics/metrics_service.cc |
diff --git a/chrome/browser/metrics/metrics_service.cc b/chrome/browser/metrics/metrics_service.cc |
index 88a82ab9ba3ca4a0b1b4d2ecf39bbdc7617a9e1e..2d21539ed3af536ee83fd6a4dc29bb8e7dc3e011 100644 |
--- a/chrome/browser/metrics/metrics_service.cc |
+++ b/chrome/browser/metrics/metrics_service.cc |
@@ -156,6 +156,7 @@ |
#include "base/values.h" |
#include "chrome/browser/bookmarks/bookmark_model.h" |
#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/extensions/extension_process_manager.h" |
#include "chrome/browser/memory_details.h" |
#include "chrome/browser/metrics/histogram_synchronizer.h" |
#include "chrome/browser/metrics/metrics_log.h" |
@@ -524,16 +525,9 @@ void MetricsService::Observe(int type, |
case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { |
RenderProcessHost::RendererClosedDetails* process_details = |
Details<RenderProcessHost::RendererClosedDetails>(details).ptr(); |
- if (process_details->status == |
- base::TERMINATION_STATUS_PROCESS_CRASHED || |
- process_details->status == |
- base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { |
- if (process_details->was_extension_renderer) { |
- LogExtensionRendererCrash(); |
- } else { |
- LogRendererCrash(); |
- } |
- } |
+ RenderProcessHost* host = Source<RenderProcessHost>(source).ptr(); |
+ LogRendererCrash( |
+ host, process_details->status, process_details->was_alive); |
} |
break; |
@@ -1241,12 +1235,36 @@ void MetricsService::LogLoadStarted() { |
// might be lost due to a crash :-(. |
} |
-void MetricsService::LogRendererCrash() { |
- IncrementPrefValue(prefs::kStabilityRendererCrashCount); |
-} |
- |
-void MetricsService::LogExtensionRendererCrash() { |
- IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount); |
+void MetricsService::LogRendererCrash(RenderProcessHost* host, |
+ base::TerminationStatus status, |
+ bool was_alive) { |
+ Profile* profile = Profile::FromBrowserContext(host->browser_context()); |
+ ExtensionProcessManager* extension_process_manager = |
+ profile->GetExtensionProcessManager(); |
+ bool was_extension_process = extension_process_manager ? |
+ extension_process_manager->IsExtensionProcess(host->id()) : |
+ false; |
+ if (status == base::TERMINATION_STATUS_PROCESS_CRASHED || |
+ status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { |
+ if (was_extension_process) |
+ IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount); |
+ else |
+ IncrementPrefValue(prefs::kStabilityRendererCrashCount); |
+ |
+ UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashes", |
+ was_extension_process ? 2 : 1); |
+ if (was_alive) { |
+ UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashesWasAlive", |
+ was_extension_process ? 2 : 1); |
+ } |
+ } else if (status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED) { |
+ UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKills", |
+ was_extension_process ? 2 : 1); |
+ if (was_alive) { |
+ UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKillsWasAlive", |
+ was_extension_process ? 2 : 1); |
+ } |
+ } |
} |
void MetricsService::LogRendererHang() { |