Linux breakpad_unittests: fix ThreadSanitizer problems

Some tests were failing because they had expectations about the number
of threads in a process, but TSan, and in some cases, ASan, introduce
their own threads. Where a sanitizer affects this, the expectations are
now used as minimum thread counts, not exact thread counts. See
https://www.brooklinen.com/blogs/brookliving/best-thread-count-for-sheets.

These problems were detected by ThreadSanitizer at
https://logs.chromium.org/logs/chromium/buildbucket/cr-buildbucket.appspot.com/8915151099544583616/+/steps/breakpad_unittests__with_patch_/0/stdout

Bug: chromium:949098
Change-Id: Ie40f1766bea27e9bcb112bf9e0b8b846fb343012
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/1585948
Reviewed-by: Robert Sesek <rsesek@chromium.org>
This commit is contained in:
Mark Mentovai 2019-04-26 14:00:01 -04:00
parent 9f90ceb904
commit 21b48a72aa
5 changed files with 52 additions and 9 deletions

View file

@ -873,17 +873,37 @@ TEST(ExceptionHandlerTest, InstructionPointerMemoryNullPointer) {
ASSERT_GT(st.st_size, 0);
// Read the minidump. Locate the exception record and the
// memory list, and then ensure that there is a memory region
// memory list, and then ensure that there is no memory region
// in the memory list that covers the instruction pointer from
// the exception record.
Minidump minidump(minidump_path);
ASSERT_TRUE(minidump.Read());
MinidumpException* exception = minidump.GetException();
MinidumpMemoryList* memory_list = minidump.GetMemoryList();
ASSERT_TRUE(exception);
MinidumpContext* exception_context = exception->GetContext();
ASSERT_TRUE(exception_context);
uint64_t instruction_pointer;
ASSERT_TRUE(exception_context->GetInstructionPointer(&instruction_pointer));
EXPECT_EQ(instruction_pointer, 0);
MinidumpMemoryList* memory_list = minidump.GetMemoryList();
ASSERT_TRUE(memory_list);
ASSERT_EQ(static_cast<unsigned int>(1), memory_list->region_count());
unsigned int region_count = memory_list->region_count();
ASSERT_GE(region_count, 1);
for (unsigned int region_index = 0;
region_index < region_count;
++region_index) {
MinidumpMemoryRegion* region =
memory_list->GetMemoryRegionAtIndex(region_index);
uint64_t region_base = region->GetBase();
EXPECT_FALSE(instruction_pointer >= region_base &&
instruction_pointer < region_base + region->GetSize());
}
unlink(minidump_path.c_str());
}