Chromium Code Reviews| 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); |