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

Side by Side Diff: snapshot/win/exception_snapshot_win_test.cc

Issue 1432563003: win: crashpad_handler should create its own pipe name in ephemeral mode (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: --help Created 5 years, 1 month 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 | « handler/win/crashy_test_program.cc ('k') | util/win/command_line_test.cc » ('j') | 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 Crashpad Authors. All rights reserved. 1 // Copyright 2015 The Crashpad Authors. All rights reserved.
2 // 2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License. 4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at 5 // You may obtain a copy of the License at
6 // 6 //
7 // http://www.apache.org/licenses/LICENSE-2.0 7 // http://www.apache.org/licenses/LICENSE-2.0
8 // 8 //
9 // Unless required by applicable law or agreed to in writing, software 9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, 10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and 12 // See the License for the specific language governing permissions and
13 // limitations under the License. 13 // limitations under the License.
14 14
15 #include "snapshot/win/exception_snapshot_win.h" 15 #include "snapshot/win/exception_snapshot_win.h"
16 16
17 #include <string> 17 #include <string>
18 18
19 #include "base/files/file_path.h" 19 #include "base/files/file_path.h"
20 #include "base/strings/stringprintf.h"
21 #include "base/strings/string16.h" 20 #include "base/strings/string16.h"
22 #include "base/strings/utf_string_conversions.h" 21 #include "base/strings/utf_string_conversions.h"
23 #include "client/crashpad_client.h" 22 #include "client/crashpad_client.h"
24 #include "gtest/gtest.h" 23 #include "gtest/gtest.h"
25 #include "snapshot/win/process_snapshot_win.h" 24 #include "snapshot/win/process_snapshot_win.h"
26 #include "test/paths.h" 25 #include "test/paths.h"
27 #include "test/win/child_launcher.h" 26 #include "test/win/child_launcher.h"
28 #include "util/file/file_io.h" 27 #include "util/file/file_io.h"
29 #include "util/thread/thread.h" 28 #include "util/thread/thread.h"
30 #include "util/win/exception_handler_server.h" 29 #include "util/win/exception_handler_server.h"
31 #include "util/win/registration_protocol_win.h" 30 #include "util/win/registration_protocol_win.h"
32 #include "util/win/scoped_handle.h" 31 #include "util/win/scoped_handle.h"
33 #include "util/win/scoped_process_suspend.h" 32 #include "util/win/scoped_process_suspend.h"
34 33
35 namespace crashpad { 34 namespace crashpad {
36 namespace test { 35 namespace test {
37 namespace { 36 namespace {
38 37
39 // Runs the ExceptionHandlerServer on a background thread. 38 // Runs the ExceptionHandlerServer on a background thread.
40 class RunServerThread : public Thread { 39 class RunServerThread : public Thread {
41 public: 40 public:
42 // Instantiates a thread which will invoke server->Run(delegate, pipe_name); 41 // Instantiates a thread which will invoke server->Run(delegate);
43 RunServerThread(ExceptionHandlerServer* server, 42 RunServerThread(ExceptionHandlerServer* server,
44 ExceptionHandlerServer::Delegate* delegate) 43 ExceptionHandlerServer::Delegate* delegate)
45 : server_(server), delegate_(delegate) {} 44 : server_(server), delegate_(delegate) {}
46 ~RunServerThread() override {} 45 ~RunServerThread() override {}
47 46
48 private: 47 private:
49 // Thread: 48 // Thread:
50 void ThreadMain() override { server_->Run(delegate_); } 49 void ThreadMain() override { server_->Run(delegate_); }
51 50
52 ExceptionHandlerServer* server_; 51 ExceptionHandlerServer* server_;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 private: 114 private:
116 HANDLE server_ready_; // weak 115 HANDLE server_ready_; // weak
117 HANDLE completed_test_event_; // weak 116 HANDLE completed_test_event_; // weak
118 WinVMAddress break_near_; 117 WinVMAddress break_near_;
119 118
120 DISALLOW_COPY_AND_ASSIGN(CrashingDelegate); 119 DISALLOW_COPY_AND_ASSIGN(CrashingDelegate);
121 }; 120 };
122 121
123 void TestCrashingChild(const base::string16& directory_modification) { 122 void TestCrashingChild(const base::string16& directory_modification) {
124 // Set up the registration server on a background thread. 123 // Set up the registration server on a background thread.
125 std::string pipe_name = "\\\\.\\pipe\\handler_test_pipe_" +
126 base::StringPrintf("%08x", GetCurrentProcessId());
127 ScopedKernelHANDLE server_ready(CreateEvent(nullptr, false, false, nullptr)); 124 ScopedKernelHANDLE server_ready(CreateEvent(nullptr, false, false, nullptr));
128 ScopedKernelHANDLE completed(CreateEvent(nullptr, false, false, nullptr)); 125 ScopedKernelHANDLE completed(CreateEvent(nullptr, false, false, nullptr));
129 CrashingDelegate delegate(server_ready.get(), completed.get()); 126 CrashingDelegate delegate(server_ready.get(), completed.get());
130 127
131 ExceptionHandlerServer exception_handler_server(pipe_name, true); 128 ExceptionHandlerServer exception_handler_server(true);
129 std::wstring pipe_name = exception_handler_server.CreatePipe();
132 RunServerThread server_thread(&exception_handler_server, &delegate); 130 RunServerThread server_thread(&exception_handler_server, &delegate);
133 server_thread.Start(); 131 server_thread.Start();
134 ScopedStopServerAndJoinThread scoped_stop_server_and_join_thread( 132 ScopedStopServerAndJoinThread scoped_stop_server_and_join_thread(
135 &exception_handler_server, &server_thread); 133 &exception_handler_server, &server_thread);
136 134
137 WaitForSingleObject(server_ready.get(), INFINITE); 135 WaitForSingleObject(server_ready.get(), INFINITE);
138 136
139 // Spawn a child process, passing it the pipe name to connect to. 137 // Spawn a child process, passing it the pipe name to connect to.
140 base::FilePath test_executable = Paths::Executable(); 138 base::FilePath test_executable = Paths::Executable();
141 std::wstring child_test_executable = 139 std::wstring child_test_executable =
142 test_executable.DirName() 140 test_executable.DirName()
143 .Append(directory_modification) 141 .Append(directory_modification)
144 .Append(test_executable.BaseName().RemoveFinalExtension().value() + 142 .Append(test_executable.BaseName().RemoveFinalExtension().value() +
145 L"_crashing_child.exe") 143 L"_crashing_child.exe")
146 .value(); 144 .value();
147 ChildLauncher child(child_test_executable, base::UTF8ToUTF16(pipe_name)); 145 ChildLauncher child(child_test_executable, pipe_name);
148 child.Start(); 146 child.Start();
149 147
150 // The child tells us (approximately) where it will crash. 148 // The child tells us (approximately) where it will crash.
151 WinVMAddress break_near_address; 149 WinVMAddress break_near_address;
152 LoggingReadFile(child.stdout_read_handle(), 150 LoggingReadFile(child.stdout_read_handle(),
153 &break_near_address, 151 &break_near_address,
154 sizeof(break_near_address)); 152 sizeof(break_near_address));
155 delegate.set_break_near(break_near_address); 153 delegate.set_break_near(break_near_address);
156 154
157 // Wait for the child to crash and the exception information to be validated. 155 // Wait for the child to crash and the exception information to be validated.
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 HANDLE server_ready_; // weak 215 HANDLE server_ready_; // weak
218 HANDLE completed_test_event_; // weak 216 HANDLE completed_test_event_; // weak
219 WinVMAddress dump_near_; 217 WinVMAddress dump_near_;
220 218
221 DISALLOW_COPY_AND_ASSIGN(SimulateDelegate); 219 DISALLOW_COPY_AND_ASSIGN(SimulateDelegate);
222 }; 220 };
223 221
224 void TestDumpWithoutCrashingChild( 222 void TestDumpWithoutCrashingChild(
225 const base::string16& directory_modification) { 223 const base::string16& directory_modification) {
226 // Set up the registration server on a background thread. 224 // Set up the registration server on a background thread.
227 std::string pipe_name = "\\\\.\\pipe\\handler_test_pipe_" +
228 base::StringPrintf("%08x", GetCurrentProcessId());
229 ScopedKernelHANDLE server_ready(CreateEvent(nullptr, false, false, nullptr)); 225 ScopedKernelHANDLE server_ready(CreateEvent(nullptr, false, false, nullptr));
230 ScopedKernelHANDLE completed(CreateEvent(nullptr, false, false, nullptr)); 226 ScopedKernelHANDLE completed(CreateEvent(nullptr, false, false, nullptr));
231 SimulateDelegate delegate(server_ready.get(), completed.get()); 227 SimulateDelegate delegate(server_ready.get(), completed.get());
232 228
233 ExceptionHandlerServer exception_handler_server(pipe_name, true); 229 ExceptionHandlerServer exception_handler_server(true);
230 std::wstring pipe_name = exception_handler_server.CreatePipe();
234 RunServerThread server_thread(&exception_handler_server, &delegate); 231 RunServerThread server_thread(&exception_handler_server, &delegate);
235 server_thread.Start(); 232 server_thread.Start();
236 ScopedStopServerAndJoinThread scoped_stop_server_and_join_thread( 233 ScopedStopServerAndJoinThread scoped_stop_server_and_join_thread(
237 &exception_handler_server, &server_thread); 234 &exception_handler_server, &server_thread);
238 235
239 WaitForSingleObject(server_ready.get(), INFINITE); 236 WaitForSingleObject(server_ready.get(), INFINITE);
240 237
241 // Spawn a child process, passing it the pipe name to connect to. 238 // Spawn a child process, passing it the pipe name to connect to.
242 base::FilePath test_executable = Paths::Executable(); 239 base::FilePath test_executable = Paths::Executable();
243 std::wstring child_test_executable = 240 std::wstring child_test_executable =
244 test_executable.DirName() 241 test_executable.DirName()
245 .Append(directory_modification) 242 .Append(directory_modification)
246 .Append(test_executable.BaseName().RemoveFinalExtension().value() + 243 .Append(test_executable.BaseName().RemoveFinalExtension().value() +
247 L"_dump_without_crashing.exe") 244 L"_dump_without_crashing.exe")
248 .value(); 245 .value();
249 ChildLauncher child(child_test_executable, base::UTF8ToUTF16(pipe_name)); 246 ChildLauncher child(child_test_executable, pipe_name);
250 child.Start(); 247 child.Start();
251 248
252 // The child tells us (approximately) where it will capture a dump. 249 // The child tells us (approximately) where it will capture a dump.
253 WinVMAddress dump_near_address; 250 WinVMAddress dump_near_address;
254 LoggingReadFile(child.stdout_read_handle(), 251 LoggingReadFile(child.stdout_read_handle(),
255 &dump_near_address, 252 &dump_near_address,
256 sizeof(dump_near_address)); 253 sizeof(dump_near_address));
257 delegate.set_dump_near(dump_near_address); 254 delegate.set_dump_near(dump_near_address);
258 255
259 // Wait for the child to crash and the exception information to be validated. 256 // Wait for the child to crash and the exception information to be validated.
(...skipping 10 matching lines...) Expand all
270 TestDumpWithoutCrashingChild(FILE_PATH_LITERAL("..\\..\\out\\Debug")); 267 TestDumpWithoutCrashingChild(FILE_PATH_LITERAL("..\\..\\out\\Debug"));
271 #else 268 #else
272 TestDumpWithoutCrashingChild(FILE_PATH_LITERAL("..\\..\\out\\Release")); 269 TestDumpWithoutCrashingChild(FILE_PATH_LITERAL("..\\..\\out\\Release"));
273 #endif 270 #endif
274 } 271 }
275 #endif // ARCH_CPU_64_BITS 272 #endif // ARCH_CPU_64_BITS
276 273
277 } // namespace 274 } // namespace
278 } // namespace test 275 } // namespace test
279 } // namespace crashpad 276 } // namespace crashpad
OLDNEW
« no previous file with comments | « handler/win/crashy_test_program.cc ('k') | util/win/command_line_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698