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

Side by Side Diff: components/crash/content/app/crashpad.cc

Issue 2077323004: Remove dependency on base/win/win_util.cc from crashpad. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments and update patch description Created 4 years, 6 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 unified diff | Download patch
« no previous file with comments | « chrome_elf/elf_imports_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/crash/content/app/crashpad.h" 5 #include "components/crash/content/app/crashpad.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <string.h> 8 #include <string.h>
9 9
10 #if BUILDFLAG(ENABLE_KASKO) 10 #if BUILDFLAG(ENABLE_KASKO)
(...skipping 24 matching lines...) Expand all
35 #include "third_party/crashpad/crashpad/client/settings.h" 35 #include "third_party/crashpad/crashpad/client/settings.h"
36 #include "third_party/crashpad/crashpad/client/simple_string_dictionary.h" 36 #include "third_party/crashpad/crashpad/client/simple_string_dictionary.h"
37 #include "third_party/crashpad/crashpad/client/simulate_crash.h" 37 #include "third_party/crashpad/crashpad/client/simulate_crash.h"
38 38
39 #if defined(OS_POSIX) 39 #if defined(OS_POSIX)
40 #include <unistd.h> 40 #include <unistd.h>
41 #endif // OS_POSIX 41 #endif // OS_POSIX
42 42
43 #if BUILDFLAG(ENABLE_KASKO) 43 #if BUILDFLAG(ENABLE_KASKO)
44 #include "base/win/scoped_handle.h" 44 #include "base/win/scoped_handle.h"
45 #include "base/win/win_util.h"
46 #include "third_party/crashpad/crashpad/snapshot/api/module_annotations_win.h" 45 #include "third_party/crashpad/crashpad/snapshot/api/module_annotations_win.h"
47 #endif 46 #endif
48 47
49 namespace crash_reporter { 48 namespace crash_reporter {
50 49
51 namespace { 50 namespace {
52 51
53 crashpad::SimpleStringDictionary* g_simple_string_dictionary; 52 crashpad::SimpleStringDictionary* g_simple_string_dictionary;
54 crashpad::CrashReportDatabase* g_database; 53 crashpad::CrashReportDatabase* g_database;
55 54
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 // Rather than including the code to force the crash here, allow the caller to 97 // Rather than including the code to force the crash here, allow the caller to
99 // do it. 98 // do it.
100 return false; 99 return false;
101 } 100 }
102 101
103 void DumpWithoutCrashing() { 102 void DumpWithoutCrashing() {
104 CRASHPAD_SIMULATE_CRASH(); 103 CRASHPAD_SIMULATE_CRASH();
105 } 104 }
106 105
107 #if BUILDFLAG(ENABLE_KASKO) 106 #if BUILDFLAG(ENABLE_KASKO)
107 // TODO(ananta)
108 // We cannot depend on functionality in base which pulls in dependencies on
109 // user32 directly or indirectly. The GetLoadedModulesSnapshot is a copy of the
110 // function in base/win/win_util.cc. Depending on the base function pulls in
111 // dependencies on user32 due to other functionality in win_util.cc. This
112 // function should be removed when KASKO is removed.
113 bool GetLoadedModulesSnapshot(HANDLE process, std::vector<HMODULE>* snapshot) {
114 DCHECK(snapshot);
115 DCHECK_EQ(0u, snapshot->size());
116 snapshot->resize(128);
117
118 // We will retry at least once after first determining |bytes_required|. If
119 // the list of modules changes after we receive |bytes_required| we may retry
120 // more than once.
121 int retries_remaining = 5;
122 do {
123 DWORD bytes_required = 0;
124 // EnumProcessModules returns 'success' even if the buffer size is too
125 // small.
126 DCHECK_GE(std::numeric_limits<DWORD>::max(),
127 snapshot->size() * sizeof(HMODULE));
128 if (!::EnumProcessModules(
129 process, &(*snapshot)[0],
130 static_cast<DWORD>(snapshot->size() * sizeof(HMODULE)),
131 &bytes_required)) {
132 DPLOG(ERROR) << "::EnumProcessModules failed.";
133 return false;
134 }
135 DCHECK_EQ(0u, bytes_required % sizeof(HMODULE));
136 size_t num_modules = bytes_required / sizeof(HMODULE);
137 if (num_modules <= snapshot->size()) {
138 // Buffer size was too big, presumably because a module was unloaded.
139 snapshot->erase(snapshot->begin() + num_modules, snapshot->end());
140 return true;
141 } else if (num_modules == 0) {
142 DLOG(ERROR) << "Can't determine the module list size.";
143 return false;
144 } else {
145 // Buffer size was too small. Try again with a larger buffer. A little
146 // more room is given to avoid multiple expensive calls to
147 // ::EnumProcessModules() just because one module has been added.
148 snapshot->resize(num_modules + 8, NULL);
149 }
150 } while (--retries_remaining);
151
152 DLOG(ERROR) << "Failed to enumerate modules.";
153 return false;
154 }
155
108 HMODULE GetModuleInProcess(base::ProcessHandle process, 156 HMODULE GetModuleInProcess(base::ProcessHandle process,
109 const wchar_t* module_name) { 157 const wchar_t* module_name) {
110 std::vector<HMODULE> modules_snapshot; 158 std::vector<HMODULE> modules_snapshot;
111 if (!base::win::GetLoadedModulesSnapshot(process, &modules_snapshot)) 159 if (!GetLoadedModulesSnapshot(process, &modules_snapshot))
112 return nullptr; 160 return nullptr;
113 161
114 for (HMODULE module : modules_snapshot) { 162 for (HMODULE module : modules_snapshot) {
115 wchar_t current_module_name[MAX_PATH]; 163 wchar_t current_module_name[MAX_PATH];
116 if (!::GetModuleBaseName(process, module, current_module_name, MAX_PATH)) 164 if (!::GetModuleBaseName(process, module, current_module_name, MAX_PATH))
117 continue; 165 continue;
118 166
119 if (std::wcscmp(module_name, current_module_name) == 0) 167 if (std::wcscmp(module_name, current_module_name) == 0)
120 return module; 168 return module;
121 } 169 }
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 base::UTF16ToUTF8(value)); 455 base::UTF16ToUTF8(value));
408 } 456 }
409 457
410 void __declspec(dllexport) __cdecl ClearCrashKeyValueImpl(const wchar_t* key) { 458 void __declspec(dllexport) __cdecl ClearCrashKeyValueImpl(const wchar_t* key) {
411 crash_reporter::ClearCrashKey(base::UTF16ToUTF8(key)); 459 crash_reporter::ClearCrashKey(base::UTF16ToUTF8(key));
412 } 460 }
413 461
414 } // extern "C" 462 } // extern "C"
415 463
416 #endif // OS_WIN 464 #endif // OS_WIN
OLDNEW
« no previous file with comments | « chrome_elf/elf_imports_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698