Add more debug code for https://github.com/google/sanitizers/issues/1193 (getting desperate, not being able to reproduce it for a few months, but the users are seeing it)

mode debug code

Reviewed By: vitalybuka

Differential Revision: https://reviews.llvm.org/D84819
This commit is contained in:
Kostya Serebryany 2020-07-29 10:34:07 -07:00
parent 7ff9575594
commit 58743040ff
4 changed files with 67 additions and 1 deletions

View File

@ -732,6 +732,25 @@ struct Allocator {
return reinterpret_cast<AsanChunk *>(alloc_beg); return reinterpret_cast<AsanChunk *>(alloc_beg);
} }
AsanChunk *GetAsanChunkDebug(void *alloc_beg) {
if (!alloc_beg) return nullptr;
if (!allocator.FromPrimary(alloc_beg)) {
uptr *meta = reinterpret_cast<uptr *>(allocator.GetMetaData(alloc_beg));
AsanChunk *m = reinterpret_cast<AsanChunk *>(meta[1]);
Printf("GetAsanChunkDebug1 alloc_beg %p meta %p m %p\n", alloc_beg, meta, m);
return m;
}
uptr *alloc_magic = reinterpret_cast<uptr *>(alloc_beg);
Printf(
"GetAsanChunkDebug2 alloc_beg %p alloc_magic %p alloc_magic[0] %p "
"alloc_magic[1] %p\n",
alloc_beg, alloc_magic, alloc_magic[0], alloc_magic[1]);
if (alloc_magic[0] == kAllocBegMagic)
return reinterpret_cast<AsanChunk *>(alloc_magic[1]);
return reinterpret_cast<AsanChunk *>(alloc_beg);
}
AsanChunk *GetAsanChunkByAddr(uptr p) { AsanChunk *GetAsanChunkByAddr(uptr p) {
void *alloc_beg = allocator.GetBlockBegin(reinterpret_cast<void *>(p)); void *alloc_beg = allocator.GetBlockBegin(reinterpret_cast<void *>(p));
return GetAsanChunk(alloc_beg); return GetAsanChunk(alloc_beg);
@ -744,6 +763,13 @@ struct Allocator {
return GetAsanChunk(alloc_beg); return GetAsanChunk(alloc_beg);
} }
AsanChunk *GetAsanChunkByAddrFastLockedDebug(uptr p) {
void *alloc_beg =
allocator.GetBlockBeginFastLockedDebug(reinterpret_cast<void *>(p));
Printf("GetAsanChunkByAddrFastLockedDebug p %p alloc_beg %p\n", p, alloc_beg);
return GetAsanChunkDebug(alloc_beg);
}
uptr AllocationSize(uptr p) { uptr AllocationSize(uptr p) {
AsanChunk *m = GetAsanChunkByAddr(p); AsanChunk *m = GetAsanChunkByAddr(p);
if (!m) return 0; if (!m) return 0;
@ -1040,16 +1066,25 @@ uptr PointsIntoChunk(void* p) {
// Debug code. Delete once issue #1193 is chased down. // Debug code. Delete once issue #1193 is chased down.
extern "C" SANITIZER_WEAK_ATTRIBUTE const char *__lsan_current_stage; extern "C" SANITIZER_WEAK_ATTRIBUTE const char *__lsan_current_stage;
void GetUserBeginDebug(uptr chunk) {
Printf("GetUserBeginDebug1 chunk %p\n", chunk);
__asan::AsanChunk *m = __asan::instance.GetAsanChunkByAddrFastLockedDebug(chunk);
Printf("GetUserBeginDebug2 m %p\n", m);
}
uptr GetUserBegin(uptr chunk) { uptr GetUserBegin(uptr chunk) {
__asan::AsanChunk *m = __asan::instance.GetAsanChunkByAddrFastLocked(chunk); __asan::AsanChunk *m = __asan::instance.GetAsanChunkByAddrFastLocked(chunk);
if (!m) if (!m) {
Printf( Printf(
"ASAN is about to crash with a CHECK failure.\n" "ASAN is about to crash with a CHECK failure.\n"
"The ASAN developers are trying to chase down this bug,\n" "The ASAN developers are trying to chase down this bug,\n"
"so if you've encountered this bug please let us know.\n" "so if you've encountered this bug please let us know.\n"
"See also: https://github.com/google/sanitizers/issues/1193\n" "See also: https://github.com/google/sanitizers/issues/1193\n"
"Internal ref b/149237057\n"
"chunk: %p caller %p __lsan_current_stage %s\n", "chunk: %p caller %p __lsan_current_stage %s\n",
chunk, GET_CALLER_PC(), __lsan_current_stage); chunk, GET_CALLER_PC(), __lsan_current_stage);
GetUserBeginDebug(chunk);
}
CHECK(m); CHECK(m);
return m->Beg(); return m->Beg();
} }

View File

@ -142,6 +142,13 @@ class CombinedAllocator {
return secondary_.GetBlockBeginFastLocked(p); return secondary_.GetBlockBeginFastLocked(p);
} }
void *GetBlockBeginFastLockedDebug(void *p) {
if (primary_.PointerIsMine(p))
return primary_.GetBlockBeginDebug(p);
return secondary_.GetBlockBeginFastLocked(p);
}
uptr GetActuallyAllocatedSize(void *p) { uptr GetActuallyAllocatedSize(void *p) {
if (primary_.PointerIsMine(p)) if (primary_.PointerIsMine(p))
return primary_.GetActuallyAllocatedSize(p); return primary_.GetActuallyAllocatedSize(p);

View File

@ -210,6 +210,7 @@ class SizeClassAllocator32 {
uptr res = beg + (n * (u32)size); uptr res = beg + (n * (u32)size);
return reinterpret_cast<void*>(res); return reinterpret_cast<void*>(res);
} }
void *GetBlockBeginDebug(const void *p) { return GetBlockBegin(p); }
uptr GetActuallyAllocatedSize(void *p) { uptr GetActuallyAllocatedSize(void *p) {
CHECK(PointerIsMine(p)); CHECK(PointerIsMine(p));

View File

@ -199,6 +199,29 @@ class SizeClassAllocator64 {
return nullptr; return nullptr;
} }
void *GetBlockBeginDebug(const void *p) {
uptr class_id = GetSizeClass(p);
uptr size = ClassIdToSize(class_id);
Printf("GetBlockBeginDebug1 p %p class_id %p size %p\n", p, class_id, size);
if (!size) return nullptr;
uptr chunk_idx = GetChunkIdx((uptr)p, size);
uptr reg_beg = GetRegionBegin(p);
uptr beg = chunk_idx * size;
uptr next_beg = beg + size;
Printf(
"GetBlockBeginDebug2 chunk_idx %p reg_beg %p beg %p next_beg %p "
"kNumClasses %p\n",
chunk_idx, reg_beg, beg, next_beg, kNumClasses);
if (class_id >= kNumClasses) return nullptr;
const RegionInfo *region = AddressSpaceView::Load(GetRegionInfo(class_id));
Printf("GetBlockBeginDebug3 region %p region->mapped_user %p\n", region,
region->mapped_user);
if (region->mapped_user >= next_beg)
return reinterpret_cast<void*>(reg_beg + beg);
return nullptr;
}
uptr GetActuallyAllocatedSize(void *p) { uptr GetActuallyAllocatedSize(void *p) {
CHECK(PointerIsMine(p)); CHECK(PointerIsMine(p));
return ClassIdToSize(GetSizeClass(p)); return ClassIdToSize(GetSizeClass(p));