mirror of
https://github.com/chromium/crashpad.git
synced 2024-12-28 15:50:26 +08:00
9ab4fbf1e1
In setting up the gn build, slightly different optimization settings were applied for release builds. This caused a couple things to happen, 1) the sketchy noinline declspec was ignored, and 2) the distance between reading the IP and the actual crash exceeded the tolerance of 64 bytes in the parent. To make the test more robust to this, use CaptureContext() (I think our improved version didn't exist at the time the tests was originally written). Also, switch from crashpad::CheckedWriteFile to Windows' WriteFile(), which avoids inlining a whole lot of code at that point. The return value is not checked, but the next thing that happens is that the function crashes unconditionally, so this does not seem like a huge problem. Bug: crashpad:79 Change-Id: I8193d8ce8b01e1533c16b207813c36d6d6113d89 Reviewed-on: https://chromium-review.googlesource.com/902693 Commit-Queue: Scott Graham <scottmg@chromium.org> Reviewed-by: Mark Mentovai <mark@chromium.org>
56 lines
1.9 KiB
C++
56 lines
1.9 KiB
C++
// 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/win/address_types.h"
|
|
#include "util/win/capture_context.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);
|
|
#if defined(ARCH_CPU_64_BITS)
|
|
crashpad::WinVMAddress break_address = context.Rip;
|
|
#else
|
|
crashpad::WinVMAddress break_address = context.Eip;
|
|
#endif
|
|
|
|
// 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;
|
|
}
|