Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(540)

Unified Diff: base/trace_event/heap_profiler_allocation_register_unittest.cc

Issue 2787383002: On heap tracking datastructure overflow, degrade instead of CHECK() (Closed)
Patch Set: fix sign comparison in test that made win unhappy Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/trace_event/heap_profiler_allocation_register.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/trace_event/heap_profiler_allocation_register_unittest.cc
diff --git a/base/trace_event/heap_profiler_allocation_register_unittest.cc b/base/trace_event/heap_profiler_allocation_register_unittest.cc
index 7eee61aa35e04c75cea63a18828eba85c54c0e28..950bab38740869518f6625b0f409f7a360e5e921 100644
--- a/base/trace_event/heap_profiler_allocation_register_unittest.cc
+++ b/base/trace_event/heap_profiler_allocation_register_unittest.cc
@@ -245,24 +245,59 @@ TEST_F(AllocationRegisterTest, ChangeContextAfterInsertion) {
EXPECT_FALSE(reg.Get(reinterpret_cast<void*>(19), &a));
}
-// Check that the process aborts due to hitting the guard page when inserting
-// too many elements.
-#if GTEST_HAS_DEATH_TEST
-TEST_F(AllocationRegisterTest, OverflowDeathTest) {
+// Check that the table handles overflows of the allocation storage gracefully.
+TEST_F(AllocationRegisterTest, OverflowAllocationTest) {
const size_t allocation_capacity = GetAllocationCapacityPerPage();
AllocationRegister reg(allocation_capacity, kBacktraceCapacity);
AllocationContext ctx;
size_t i;
- // Fill up all of the memory allocated for the register's allocation map.
- for (i = 0; i < allocation_capacity; i++) {
- reg.Insert(reinterpret_cast<void*>(i + 1), 1, ctx);
+ for (int repetition = 0; repetition < 3; repetition++) {
+ // Fill up all of the memory allocated for the register's allocation map.
+ for (i = 0; i < allocation_capacity; i++)
+ ASSERT_TRUE(reg.Insert(reinterpret_cast<void*>(i + 1), 1, ctx));
+
+ // Adding just one extra element should cause overflow.
+ ASSERT_FALSE(reg.Insert(reinterpret_cast<void*>(i + 1), 1, ctx));
+
+ // Removing all allocations shouldn't cause any crash.
+ for (i = 0; i < allocation_capacity; i++) {
+ reg.Remove(reinterpret_cast<void*>(i + 1));
+ }
+ }
+}
+
+// Check that the table handles overflows of the backtrace storage (but not the
+// allocations storage) gracefully.
+TEST_F(AllocationRegisterTest, OverflowBacktraceTest) {
+ const size_t backtrace_capacity = GetAllocationCapacityPerPage();
+ const size_t allocation_capacity = 3 * GetAllocationCapacityPerPage();
+ AllocationRegister reg(allocation_capacity, backtrace_capacity);
+ AllocationContext ctx;
+ size_t i;
+
+ // Fill up all of the memory allocated for the backtrace allocation map,
+ // but do not fill the allocations map.
+ for (i = 1; i <= backtrace_capacity * 2; i++) {
+ void* addr = reinterpret_cast<void*>(i);
+ ctx.backtrace.frames[0] = StackFrame::FromProgramCounter(addr);
+ ctx.backtrace.frame_count = 1;
+ ASSERT_TRUE(reg.Insert(addr, 1, ctx));
}
- // Adding just one extra element should cause overflow.
- ASSERT_DEATH(reg.Insert(reinterpret_cast<void*>(i + 1), 1, ctx), "");
+ // Removing all allocations shouldn't cause any crash.
+ for (i = 1; i <= backtrace_capacity * 2; i++) {
+ AllocationRegister::Allocation allocation = {};
+ ASSERT_TRUE(reg.Get(reinterpret_cast<void*>(i), &allocation));
+
+ // This is just to check the integrity of the backtrace sentinel and to make
+ // sure that we don't hit the guard page.
+ ASSERT_LT(allocation.context.backtrace.frame_count,
+ static_cast<size_t>(Backtrace::kMaxFrameCount));
+
+ reg.Remove(reinterpret_cast<void*>(i));
+ }
}
-#endif
} // namespace trace_event
} // namespace base
« no previous file with comments | « base/trace_event/heap_profiler_allocation_register.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698