Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2558)

Unified Diff: chrome/app/breakpad_win.cc

Issue 7866033: [Windows] Include the about:flags experiments in crash reports. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fix name Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/chrome_browser_main.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/app/breakpad_win.cc
===================================================================
--- chrome/app/breakpad_win.cc (revision 100836)
+++ chrome/app/breakpad_win.cc (working copy)
@@ -72,7 +72,14 @@
static size_t g_client_id_offset;
static size_t g_gpu_info_offset;
static size_t g_num_of_views_offset;
+static size_t g_num_switches_offset;
+static size_t g_switches_offset;
+// The maximum number of command line switches to include in the crash
+// report's metadata. Note that the mini-dump itself will also contain the
+// (original) command line arguments within the PEB.
+const size_t kMaxSwitches = 15;
+
// Dumps the current process memory.
extern "C" void __declspec(dllexport) __cdecl DumpProcess() {
if (g_breakpad)
@@ -88,6 +95,41 @@
google_breakpad::CustomInfoEntry::kValueMaxLength - 1);
}
+static void SetIntegerValue(size_t offset, int value) {
+ if (!g_custom_entries)
+ return;
+
+ wcscpy_s((*g_custom_entries)[offset].value,
+ google_breakpad::CustomInfoEntry::kValueMaxLength,
+ base::StringPrintf(L"%d", value).c_str());
+}
+
+extern "C" void __declspec(dllexport) __cdecl SetCommandLine(
+ const CommandLine* command_line) {
+ if (!g_custom_entries)
+ return;
+
+ const CommandLine::StringVector& argv = command_line->argv();
+
+ // Copy up to the kMaxSwitches arguments into the custom entries array. Skip
+ // past the first argument, as it is just the executable path.
+ size_t argv_i = 1;
+ size_t num_added = 0;
+
+ for (; argv_i < argv.size() && num_added < kMaxSwitches;
+ ++argv_i, ++num_added) {
+ // TODO(eroman): Filter out flags which aren't useful and just add bloat
+ // to the report.
+ wcsncpy((*g_custom_entries)[g_switches_offset + num_added].value,
+ argv[argv_i].c_str(),
+ google_breakpad::CustomInfoEntry::kValueMaxLength);
+ }
+
+ // Make note of the total number of switches. This is useful in case we have
+ // truncated at kMaxSwitches, to see how many were unaccounted for.
+ SetIntegerValue(g_num_switches_offset, static_cast<int>(argv.size()) - 1);
+}
+
// Returns the custom info structure based on the dll in parameter and the
// process type.
google_breakpad::CustomClientInfo* GetCustomInfo(const std::wstring& dll_path,
@@ -168,6 +210,23 @@
g_custom_entries->push_back(
google_breakpad::CustomInfoEntry(L"guid", guid.c_str()));
+ // Add empty values for the command line switches. We will fill them with
+ // actual values as part of SetCommandLine().
+ g_num_switches_offset = g_custom_entries->size();
+ g_custom_entries->push_back(
+ google_breakpad::CustomInfoEntry(L"num-switches", L""));
+
+ g_switches_offset = g_custom_entries->size();
+ for (int i = 0; i < kMaxSwitches; ++i) {
+ g_custom_entries->push_back(google_breakpad::CustomInfoEntry(
+ base::StringPrintf(L"switch-%i", i + 1).c_str(), L""));
+ }
+
+ // Fill in the command line arguments using CommandLine::ForCurrentProcess().
+ // The browser process may call SetCommandLine() again later on with a command
+ // line that has been augmented with the about:flags experiments.
+ SetCommandLine(CommandLine::ForCurrentProcess());
+
if (type == L"renderer" || type == L"plugin" || type == L"gpu-process") {
g_num_of_views_offset = g_custom_entries->size();
g_custom_entries->push_back(
@@ -183,26 +242,6 @@
} else {
g_custom_entries->push_back(
google_breakpad::CustomInfoEntry(L"num-views", L"N/A"));
-
- // Browser-specific g_custom_entries.
- google_breakpad::CustomInfoEntry switch1(L"switch-1", L"");
- google_breakpad::CustomInfoEntry switch2(L"switch-2", L"");
-
- // Get the first two command line switches if they exist. The CommandLine
- // class does not allow to enumerate the switches so we do it by hand.
- int num_args = 0;
- wchar_t** args = ::CommandLineToArgvW(::GetCommandLineW(), &num_args);
- if (args) {
- if (num_args > 1)
- switch1.set_value(TrimToBreakpadMax(args[1]).c_str());
- if (num_args > 2)
- switch2.set_value(TrimToBreakpadMax(args[2]).c_str());
- // The caller must free the memory allocated for |args|.
- ::LocalFree(args);
- }
-
- g_custom_entries->push_back(switch1);
- g_custom_entries->push_back(switch2);
}
static google_breakpad::CustomClientInfo custom_client_info;
@@ -337,15 +376,6 @@
client_id);
}
-static void SetIntegerValue(size_t offset, int value) {
- if (!g_custom_entries)
- return;
-
- wcscpy_s((*g_custom_entries)[offset].value,
- google_breakpad::CustomInfoEntry::kValueMaxLength,
- base::StringPrintf(L"%d", value).c_str());
-}
-
extern "C" void __declspec(dllexport) __cdecl SetNumberOfExtensions(
int number_of_extensions) {
SetIntegerValue(g_num_of_extensions_offset, number_of_extensions);
« no previous file with comments | « no previous file | chrome/browser/chrome_browser_main.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698