forked from OSchip/llvm-project
				
			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:
		
							parent
							
								
									7ff9575594
								
							
						
					
					
						commit
						58743040ff
					
				| 
						 | 
					@ -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();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue