crashpad/snapshot/win/process_snapshot_win_test.cc
Bruce Dawson eeb3cad132 Raise extra-memory cap in ProcessSnapshotTest.CrashpadInfoChild
The extra_memory cap in ProcessSnapshotTest.CrashpadInfoChild is not
high enough to avoid test failures on all machines. The actual amount
recorded has been seen to vary between 726,556 and 1,152,803. This
change rases the limit from 1,000,000 to 1,200,000 to avoid the
failures.

The highest amount was seen on a 64-GB gWindows ThinkPad laptop.

Instrumentation shows that the low and high cases both have 104 threads.
The low case has 304 ExtraMemory() blocks, whereas the high case has
409. In both cases the sizes range from 384 to 6,024.

Change-Id: I8873921fa913c31445384db34d4aa90200401a4a
Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/4348802
Reviewed-by: Mark Mentovai <mark@chromium.org>
Commit-Queue: Bruce Dawson <brucedawson@chromium.org>
2023-03-17 23:05:55 +00:00

132 lines
4.3 KiB
C++

// Copyright 2015 The Crashpad Authors
//
// 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 "snapshot/win/process_snapshot_win.h"
#include "base/files/file_path.h"
#include "build/build_config.h"
#include "gtest/gtest.h"
#include "snapshot/win/pe_image_reader.h"
#include "snapshot/win/process_reader_win.h"
#include "test/errors.h"
#include "test/test_paths.h"
#include "test/win/child_launcher.h"
#include "util/file/file_io.h"
#include "util/win/scoped_handle.h"
#include "util/win/scoped_process_suspend.h"
#include "util/win/scoped_set_event.h"
namespace crashpad {
namespace test {
namespace {
void TestImageReaderChild(const TestPaths::Architecture architecture) {
UUID done_uuid;
done_uuid.InitializeWithNew();
ScopedKernelHANDLE done(
CreateEvent(nullptr, true, false, done_uuid.ToWString().c_str()));
ASSERT_TRUE(done.is_valid()) << ErrorMessage("CreateEvent");
base::FilePath child_test_executable =
TestPaths::BuildArtifact(L"snapshot",
L"image_reader",
TestPaths::FileType::kExecutable,
architecture);
ChildLauncher child(child_test_executable, done_uuid.ToWString());
ASSERT_NO_FATAL_FAILURE(child.Start());
ScopedSetEvent set_done(done.get());
char c;
ASSERT_TRUE(
LoggingReadFileExactly(child.stdout_read_handle(), &c, sizeof(c)));
ASSERT_EQ(c, ' ');
{
ScopedProcessSuspend suspend(child.process_handle());
ProcessSnapshotWin process_snapshot;
ASSERT_TRUE(process_snapshot.Initialize(
child.process_handle(), ProcessSuspensionState::kSuspended, 0, 0));
ASSERT_GE(process_snapshot.Modules().size(), 2u);
UUID uuid;
DWORD age;
std::string pdbname;
const std::string suffix(".pdb");
// Check the main .exe to see that we can retrieve its sections.
auto module = reinterpret_cast<const internal::ModuleSnapshotWin*>(
process_snapshot.Modules()[0]);
ASSERT_TRUE(module->pe_image_reader().DebugDirectoryInformation(
&uuid, &age, &pdbname));
EXPECT_NE(pdbname.find("crashpad_snapshot_test_image_reader"),
std::string::npos);
EXPECT_EQ(
pdbname.compare(pdbname.size() - suffix.size(), suffix.size(), suffix),
0);
// Check the dll it loads too.
module = reinterpret_cast<const internal::ModuleSnapshotWin*>(
process_snapshot.Modules().back());
ASSERT_TRUE(module->pe_image_reader().DebugDirectoryInformation(
&uuid, &age, &pdbname));
EXPECT_NE(pdbname.find("crashpad_snapshot_test_image_reader_module"),
std::string::npos);
EXPECT_EQ(
pdbname.compare(pdbname.size() - suffix.size(), suffix.size(), suffix),
0);
// Sum the size of the extra memory in all the threads and confirm it's near
// the limit that the child process set in its CrashpadInfo.
EXPECT_GE(process_snapshot.Threads().size(), 100u);
size_t extra_memory_total = 0;
for (const auto* thread : process_snapshot.Threads()) {
for (const auto* extra_memory : thread->ExtraMemory()) {
extra_memory_total += extra_memory->Size();
}
}
// Confirm that less than 1.2M of extra data was gathered. The cap is set to
// only 100K, but there are other "extra memory" regions that aren't
// included in the cap. (Completely uncapped it would be > 10M.)
EXPECT_LT(extra_memory_total, 1200000u);
}
// Tell the child it can terminate.
EXPECT_TRUE(set_done.Set());
EXPECT_EQ(child.WaitForExit(), 0u);
}
TEST(ProcessSnapshotTest, CrashpadInfoChild) {
TestImageReaderChild(TestPaths::Architecture::kDefault);
}
#if defined(ARCH_CPU_64_BITS)
TEST(ProcessSnapshotTest, CrashpadInfoChildWOW64) {
if (!TestPaths::Has32BitBuildArtifacts()) {
GTEST_SKIP();
}
TestImageReaderChild(TestPaths::Architecture::k32Bit);
}
#endif
} // namespace
} // namespace test
} // namespace crashpad