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

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 merge conflict (browser_main.cc was deleted) 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') | chrome/common/child_process_logging_linux.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/app/breakpad_win.cc
===================================================================
--- chrome/app/breakpad_win.cc (revision 100642)
+++ 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 SetCommandLineFromCurrent(void) {
+ if (!g_custom_entries)
+ return;
+
+ // Note that CommandLine may be different from the argc/argv that the
+ // application was launched with. We intentionally use CommandLine in order
+ // to pick up the experiments that about:flags shoved into the CommandLine.
+ const CommandLine::StringVector& argv =
+ CommandLine::ForCurrentProcess()->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) {
Nico 2011/09/13 23:04:41 Increment num_added in the for loop instead of in
eroman 2011/09/13 23:27:32 Done. The reason I was doing it in the body rathe
+ wcscpy_s((*g_custom_entries)[g_switches_offset + num_added++].value,
+ google_breakpad::CustomInfoEntry::kValueMaxLength,
+ argv[argv_i].c_str());
+ }
+
+ // 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 SetCommandLineFromCurrent().
+ 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 will call SetCommandLineFromCurrent() again later on,
+ // once it has augmented CommandLine with the about:flags experiments.
+ SetCommandLineFromCurrent();
+
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') | chrome/common/child_process_logging_linux.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698