| // Copyright 2015 The Crashpad Authors. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include <intrin.h> |
| #include <windows.h> |
| |
| #include "base/logging.h" |
| #include "client/crashpad_client.h" |
| #include "client/simulate_crash.h" |
| #include "util/misc/capture_context.h" |
| #include "util/win/address_types.h" |
| #include "util/win/context_wrappers.h" |
| |
| int wmain(int argc, wchar_t* argv[]) { |
| CHECK_EQ(argc, 2); |
| |
| crashpad::CrashpadClient client; |
| CHECK(client.SetHandlerIPCPipe(argv[1])); |
| |
| HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); |
| PCHECK(out != INVALID_HANDLE_VALUE) << "GetStdHandle"; |
| |
| CONTEXT context; |
| crashpad::CaptureContext(&context); |
| crashpad::WinVMAddress break_address = |
| reinterpret_cast<crashpad::WinVMAddress>( |
| crashpad::ProgramCounterFromCONTEXT(&context)); |
| |
| // This does not used CheckedWriteFile() because at high optimization |
| // settings, a lot of logging code can be inlined, causing there to be a large |
| // number of instructions between where the IP is captured and the actual |
| // __debugbreak(). Instead call Windows' WriteFile() to minimize the amount of |
| // code here. Because the next line is going to crash in any case, there's |
| // minimal difference in behavior aside from an indication of what broke when |
| // the other end experiences a ReadFile() error. |
| DWORD bytes_written; |
| WriteFile( |
| out, &break_address, sizeof(break_address), &bytes_written, nullptr); |
| |
| CRASHPAD_SIMULATE_CRASH(); |
| |
| return 0; |
| } |