crashpad/snapshot/win/crashpad_snapshot_test_dump_without_crashing.cc
Scott Graham 9ab4fbf1e1 win: Improve child crash location test
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>
2018-02-06 21:27:39 +00:00

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;
}