Index: chrome/browser/chrome_browser_field_trials_desktop.cc |
diff --git a/chrome/browser/chrome_browser_field_trials_desktop.cc b/chrome/browser/chrome_browser_field_trials_desktop.cc |
index b955ed8ac5150a4e67dea4c5f76f37e1490db510..4b7d6aa8b211302c9f6853c6910e25ac473f6c2a 100644 |
--- a/chrome/browser/chrome_browser_field_trials_desktop.cc |
+++ b/chrome/browser/chrome_browser_field_trials_desktop.cc |
@@ -4,28 +4,32 @@ |
#include "chrome/browser/chrome_browser_field_trials_desktop.h" |
+#include <map> |
#include <string> |
#include "base/command_line.h" |
#include "base/debug/activity_tracker.h" |
#include "base/feature_list.h" |
+#include "base/files/file_util.h" |
#include "base/metrics/field_trial.h" |
+#include "base/metrics/histogram_macros.h" |
#include "base/path_service.h" |
#include "chrome/browser/prerender/prerender_field_trial.h" |
#include "chrome/common/chrome_paths.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/variations/variations_util.h" |
+#include "components/browser_watcher/features.h" |
#include "components/variations/variations_associated_data.h" |
#include "content/public/common/content_switches.h" |
+#if defined(OS_WIN) |
+#include "components/browser_watcher/stability_debugging_win.h" |
+#endif |
+ |
namespace chrome { |
namespace { |
-const base::Feature kStabilityDebuggingFeature{ |
- "StabilityDebugging", base::FEATURE_DISABLED_BY_DEFAULT |
-}; |
- |
void SetupStunProbeTrial() { |
#if defined(ENABLE_WEBRTC) |
std::map<std::string, std::string> params; |
@@ -47,9 +51,26 @@ void SetupStunProbeTrial() { |
#endif |
} |
+#if defined(OS_WIN) |
+// DO NOT CHANGE VALUES. This is logged persistently in a histogram. |
+enum StabilityDebuggingInitializationStatus { |
+ INIT_SUCCESS = 0, |
+ CREATE_STABILITY_DIR_FAILED = 1, |
+ GET_STABILITY_FILE_PATH_FAILED = 2, |
+ INIT_STATUS_MAX = 3 |
+}; |
+ |
+void LogStabilityDebuggingInitStatus( |
+ StabilityDebuggingInitializationStatus status) { |
+ UMA_HISTOGRAM_ENUMERATION("ActivityTracker.Record.InitStatus", status, |
+ INIT_STATUS_MAX); |
+} |
+ |
void SetupStabilityDebugging() { |
- if (!base::FeatureList::IsEnabled(kStabilityDebuggingFeature)) |
+ if (!base::FeatureList::IsEnabled( |
+ browser_watcher::kStabilityDebuggingFeature)) { |
return; |
+ } |
// TODO(bcwhite): Adjust these numbers once there is real data to show |
// just how much of an arena is necessary. |
@@ -57,24 +78,40 @@ void SetupStabilityDebugging() { |
const int kStackDepth = 4; |
const uint64_t kAllocatorId = 0; |
- // Track code activities (such as posting task, blocking on locks, and |
- // joining threads) that can cause hanging threads and general instability. |
+ // Ensure the stability directory exists and determine the stability file's |
+ // path. |
base::FilePath user_data_dir; |
- bool success = base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); |
- DCHECK(success); |
+ if (!base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir) || |
+ !base::CreateDirectory(browser_watcher::GetStabilityDir(user_data_dir))) { |
+ LOG(ERROR) << "Failed to create the stability directory."; |
+ LogStabilityDebuggingInitStatus(CREATE_STABILITY_DIR_FAILED); |
+ return; |
+ } |
+ base::FilePath stability_file; |
+ if (!browser_watcher::GetStabilityFileForProcess( |
+ base::Process::Current(), user_data_dir, &stability_file)) { |
+ LOG(ERROR) << "Failed to obtain stability file's path."; |
+ LogStabilityDebuggingInitStatus(GET_STABILITY_FILE_PATH_FAILED); |
+ return; |
+ } |
+ LogStabilityDebuggingInitStatus(INIT_SUCCESS); |
+ |
+ // Track code activities (such as posting task, blocking on locks, and |
+ // joining threads) that can cause hanging threads and general instability |
base::debug::GlobalActivityTracker::CreateWithFile( |
- user_data_dir |
- .AppendASCII("StabilityDebugInfo") |
- .AddExtension(base::PersistentMemoryAllocator::kFileExtension), |
- kMemorySize, kAllocatorId, kStabilityDebuggingFeature.name, kStackDepth); |
+ stability_file, kMemorySize, kAllocatorId, |
+ browser_watcher::kStabilityDebuggingFeature.name, kStackDepth); |
} |
+#endif // defined(OS_WIN) |
} // namespace |
void SetupDesktopFieldTrials(const base::CommandLine& parsed_command_line) { |
prerender::ConfigurePrerender(parsed_command_line); |
SetupStunProbeTrial(); |
+#if defined(OS_WIN) |
SetupStabilityDebugging(); |
+#endif // defined(OS_WIN) |
} |
} // namespace chrome |