[Session restore] Rename group name Enabled to Restore.
[chromium-blink-merge.git] / third_party / tcmalloc / chromium / src / heap-checker.cc
blob1400c8e32dc3c6e545dd39e1cc42d607dd943ef4
1 // Copyright (c) 2005, Google Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 // ---
31 // All Rights Reserved.
33 // Author: Maxim Lifantsev
36 #include "config.h"
38 #include <fcntl.h> // for O_RDONLY (we use syscall to do actual reads)
39 #include <string.h>
40 #include <errno.h>
41 #ifdef HAVE_UNISTD_H
42 #include <unistd.h>
43 #endif
44 #ifdef HAVE_MMAP
45 #include <sys/mman.h>
46 #endif
47 #ifdef HAVE_PTHREAD
48 #include <pthread.h>
49 #endif
50 #include <sys/stat.h>
51 #include <sys/types.h>
52 #include <time.h>
53 #include <assert.h>
55 #if defined(HAVE_LINUX_PTRACE_H)
56 #include <linux/ptrace.h>
57 #endif
58 #ifdef HAVE_SYS_SYSCALL_H
59 #include <sys/syscall.h>
60 #endif
61 #if defined(_WIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(__MINGW32__)
62 #include <wtypes.h>
63 #include <winbase.h>
64 #undef ERROR // windows defines these as macros, which can cause trouble
65 #undef max
66 #undef min
67 #endif
69 #include <string>
70 #include <vector>
71 #include <map>
72 #include <set>
73 #include <algorithm>
74 #include <functional>
76 #include <gperftools/heap-checker.h>
78 #include "base/basictypes.h"
79 #include "base/googleinit.h"
80 #include "base/logging.h"
81 #include <gperftools/stacktrace.h>
82 #include "base/commandlineflags.h"
83 #include "base/elfcore.h" // for i386_regs
84 #include "base/thread_lister.h"
85 #include "heap-profile-table.h"
86 #include "base/low_level_alloc.h"
87 #include "malloc_hook-inl.h"
88 #include <gperftools/malloc_hook.h>
89 #include <gperftools/malloc_extension.h>
90 #include "maybe_threads.h"
91 #include "memory_region_map.h"
92 #include "base/spinlock.h"
93 #include "base/sysinfo.h"
94 #include "base/stl_allocator.h"
96 using std::string;
97 using std::basic_string;
98 using std::pair;
99 using std::map;
100 using std::set;
101 using std::vector;
102 using std::swap;
103 using std::make_pair;
104 using std::min;
105 using std::max;
106 using std::less;
107 using std::char_traits;
109 // If current process is being ptrace()d, 'TracerPid' in /proc/self/status
110 // will be non-zero.
111 static bool IsDebuggerAttached(void) { // only works under linux, probably
112 char buf[256]; // TracerPid comes relatively earlier in status output
113 int fd = open("/proc/self/status", O_RDONLY);
114 if (fd == -1) {
115 return false; // Can't tell for sure.
117 const int len = read(fd, buf, sizeof(buf));
118 bool rc = false;
119 if (len > 0) {
120 const char *const kTracerPid = "TracerPid:\t";
121 buf[len - 1] = '\0';
122 const char *p = strstr(buf, kTracerPid);
123 if (p != NULL) {
124 rc = (strncmp(p + strlen(kTracerPid), "0\n", 2) != 0);
127 close(fd);
128 return rc;
131 // This is the default if you don't link in -lprofiler
132 extern "C" {
133 ATTRIBUTE_WEAK PERFTOOLS_DLL_DECL bool ProfilingIsEnabledForAllThreads();
134 bool ProfilingIsEnabledForAllThreads() { return false; }
137 //----------------------------------------------------------------------
138 // Flags that control heap-checking
139 //----------------------------------------------------------------------
141 DEFINE_string(heap_check,
142 EnvToString("HEAPCHECK", ""),
143 "The heap leak checking to be done over the whole executable: "
144 "\"minimal\", \"normal\", \"strict\", "
145 "\"draconian\", \"as-is\", and \"local\" "
146 " or the empty string are the supported choices. "
147 "(See HeapLeakChecker_InternalInitStart for details.)");
149 DEFINE_bool(heap_check_report, true, "Obsolete");
151 DEFINE_bool(heap_check_before_constructors,
152 true,
153 "deprecated; pretty much always true now");
155 DEFINE_bool(heap_check_after_destructors,
156 EnvToBool("HEAP_CHECK_AFTER_DESTRUCTORS", false),
157 "If overall heap check is to end after global destructors "
158 "or right after all REGISTER_HEAPCHECK_CLEANUP's");
160 DEFINE_bool(heap_check_strict_check, true, "Obsolete");
162 DEFINE_bool(heap_check_ignore_global_live,
163 EnvToBool("HEAP_CHECK_IGNORE_GLOBAL_LIVE", true),
164 "If overall heap check is to ignore heap objects reachable "
165 "from the global data");
167 DEFINE_bool(heap_check_identify_leaks,
168 EnvToBool("HEAP_CHECK_IDENTIFY_LEAKS", false),
169 "If heap check should generate the addresses of the leaked "
170 "objects in the memory leak profiles. This may be useful "
171 "in tracking down leaks where only a small fraction of "
172 "objects allocated at the same stack trace are leaked.");
174 DEFINE_bool(heap_check_ignore_thread_live,
175 EnvToBool("HEAP_CHECK_IGNORE_THREAD_LIVE", true),
176 "If set to true, objects reachable from thread stacks "
177 "and registers are not reported as leaks");
179 DEFINE_bool(heap_check_test_pointer_alignment,
180 EnvToBool("HEAP_CHECK_TEST_POINTER_ALIGNMENT", false),
181 "Set to true to check if the found leak can be due to "
182 "use of unaligned pointers");
184 // Alignment at which all pointers in memory are supposed to be located;
185 // use 1 if any alignment is ok.
186 // heap_check_test_pointer_alignment flag guides if we try the value of 1.
187 // The larger it can be, the lesser is the chance of missing real leaks.
188 static const size_t kPointerSourceAlignment = sizeof(void*);
189 DEFINE_int32(heap_check_pointer_source_alignment,
190 EnvToInt("HEAP_CHECK_POINTER_SOURCE_ALIGNMENT",
191 kPointerSourceAlignment),
192 "Alignment at which all pointers in memory are supposed to be "
193 "located. Use 1 if any alignment is ok.");
195 // A reasonable default to handle pointers inside of typical class objects:
196 // Too low and we won't be able to traverse pointers to normally-used
197 // nested objects and base parts of multiple-inherited objects.
198 // Too high and it will both slow down leak checking (FindInsideAlloc
199 // in HaveOnHeapLocked will get slower when there are large on-heap objects)
200 // and make it probabilistically more likely to miss leaks
201 // of large-sized objects.
202 static const int64 kHeapCheckMaxPointerOffset = 1024;
203 DEFINE_int64(heap_check_max_pointer_offset,
204 EnvToInt("HEAP_CHECK_MAX_POINTER_OFFSET",
205 kHeapCheckMaxPointerOffset),
206 "Largest pointer offset for which we traverse "
207 "pointers going inside of heap allocated objects. "
208 "Set to -1 to use the actual largest heap object size.");
210 DEFINE_bool(heap_check_run_under_gdb,
211 EnvToBool("HEAP_CHECK_RUN_UNDER_GDB", false),
212 "If false, turns off heap-checking library when running under gdb "
213 "(normally, set to 'true' only when debugging the heap-checker)");
215 DEFINE_int32(heap_check_delay_seconds, 0,
216 "Number of seconds to delay on-exit heap checking."
217 " If you set this flag,"
218 " you may also want to set exit_timeout_seconds in order to"
219 " avoid exit timeouts.\n"
220 "NOTE: This flag is to be used only to help diagnose issues"
221 " where it is suspected that the heap checker is reporting"
222 " false leaks that will disappear if the heap checker delays"
223 " its checks. Report any such issues to the heap-checker"
224 " maintainer(s).");
226 DEFINE_int32(heap_check_error_exit_code,
227 EnvToInt("HEAP_CHECK_ERROR_EXIT_CODE", 1),
228 "Exit code to return if any leaks were detected.");
230 //----------------------------------------------------------------------
232 DEFINE_string(heap_profile_pprof,
233 EnvToString("PPROF_PATH", "pprof"),
234 "OBSOLETE; not used");
236 DEFINE_string(heap_check_dump_directory,
237 EnvToString("HEAP_CHECK_DUMP_DIRECTORY", "/tmp"),
238 "Directory to put heap-checker leak dump information");
241 //----------------------------------------------------------------------
242 // HeapLeakChecker global data
243 //----------------------------------------------------------------------
245 // Global lock for all the global data of this module.
246 static SpinLock heap_checker_lock(SpinLock::LINKER_INITIALIZED);
248 //----------------------------------------------------------------------
250 // Heap profile prefix for leak checking profiles.
251 // Gets assigned once when leak checking is turned on, then never modified.
252 static const string* profile_name_prefix = NULL;
254 // Whole-program heap leak checker.
255 // Gets assigned once when leak checking is turned on,
256 // then main_heap_checker is never deleted.
257 static HeapLeakChecker* main_heap_checker = NULL;
259 // Whether we will use main_heap_checker to do a check at program exit
260 // automatically. In any case user can ask for more checks on main_heap_checker
261 // via GlobalChecker().
262 static bool do_main_heap_check = false;
264 // The heap profile we use to collect info about the heap.
265 // This is created in HeapLeakChecker::BeforeConstructorsLocked
266 // together with setting heap_checker_on (below) to true
267 // and registering our new/delete malloc hooks;
268 // similarly all are unset in HeapLeakChecker::TurnItselfOffLocked.
269 static HeapProfileTable* heap_profile = NULL;
271 // If we are doing (or going to do) any kind of heap-checking.
272 static bool heap_checker_on = false;
274 // pid of the process that does whole-program heap leak checking
275 static pid_t heap_checker_pid = 0;
277 // If we did heap profiling during global constructors execution
278 static bool constructor_heap_profiling = false;
280 // RAW_VLOG level we dump key INFO messages at. If you want to turn
281 // off these messages, set the environment variable PERFTOOLS_VERBOSE=-1.
282 static const int heap_checker_info_level = 0;
284 //----------------------------------------------------------------------
285 // HeapLeakChecker's own memory allocator that is
286 // independent of the normal program allocator.
287 //----------------------------------------------------------------------
289 // Wrapper of LowLevelAlloc for STL_Allocator and direct use.
290 // We always access this class under held heap_checker_lock,
291 // this allows us to in particular protect the period when threads are stopped
292 // at random spots with ListAllProcessThreads by heap_checker_lock,
293 // w/o worrying about the lock in LowLevelAlloc::Arena.
294 // We rely on the fact that we use an own arena with an own lock here.
295 class HeapLeakChecker::Allocator {
296 public:
297 static void Init() {
298 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
299 RAW_DCHECK(arena_ == NULL, "");
300 arena_ = LowLevelAlloc::NewArena(0, LowLevelAlloc::DefaultArena());
302 static void Shutdown() {
303 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
304 if (!LowLevelAlloc::DeleteArena(arena_) || alloc_count_ != 0) {
305 RAW_LOG(FATAL, "Internal heap checker leak of %d objects", alloc_count_);
308 static int alloc_count() {
309 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
310 return alloc_count_;
312 static void* Allocate(size_t n) {
313 RAW_DCHECK(arena_ && heap_checker_lock.IsHeld(), "");
314 void* p = LowLevelAlloc::AllocWithArena(n, arena_);
315 if (p) alloc_count_ += 1;
316 return p;
318 static void Free(void* p) {
319 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
320 if (p) alloc_count_ -= 1;
321 LowLevelAlloc::Free(p);
323 static void Free(void* p, size_t /* n */) {
324 Free(p);
326 // destruct, free, and make *p to be NULL
327 template<typename T> static void DeleteAndNull(T** p) {
328 (*p)->~T();
329 Free(*p);
330 *p = NULL;
332 template<typename T> static void DeleteAndNullIfNot(T** p) {
333 if (*p != NULL) DeleteAndNull(p);
335 private:
336 static LowLevelAlloc::Arena* arena_;
337 static int alloc_count_;
340 LowLevelAlloc::Arena* HeapLeakChecker::Allocator::arena_ = NULL;
341 int HeapLeakChecker::Allocator::alloc_count_ = 0;
343 //----------------------------------------------------------------------
344 // HeapLeakChecker live object tracking components
345 //----------------------------------------------------------------------
347 // Cases of live object placement we distinguish
348 enum ObjectPlacement {
349 MUST_BE_ON_HEAP, // Must point to a live object of the matching size in the
350 // heap_profile map of the heap when we get to it
351 IGNORED_ON_HEAP, // Is a live (ignored) object on heap
352 MAYBE_LIVE, // Is a piece of writable memory from /proc/self/maps
353 IN_GLOBAL_DATA, // Is part of global data region of the executable
354 THREAD_DATA, // Part of a thread stack and a thread descriptor with TLS
355 THREAD_REGISTERS, // Values in registers of some thread
358 // Information about an allocated object
359 struct AllocObject {
360 const void* ptr; // the object
361 uintptr_t size; // its size
362 ObjectPlacement place; // where ptr points to
364 AllocObject(const void* p, size_t s, ObjectPlacement l)
365 : ptr(p), size(s), place(l) { }
368 // All objects (memory ranges) ignored via HeapLeakChecker::IgnoreObject
369 // Key is the object's address; value is its size.
370 typedef map<uintptr_t, size_t, less<uintptr_t>,
371 STL_Allocator<pair<const uintptr_t, size_t>,
372 HeapLeakChecker::Allocator>
373 > IgnoredObjectsMap;
374 static IgnoredObjectsMap* ignored_objects = NULL;
376 // All objects (memory ranges) that we consider to be the sources of pointers
377 // to live (not leaked) objects.
378 // At different times this holds (what can be reached from) global data regions
379 // and the objects we've been told to ignore.
380 // For any AllocObject::ptr "live_objects" is supposed to contain at most one
381 // record at any time. We maintain this by checking with the heap_profile map
382 // of the heap and removing the live heap objects we've handled from it.
383 // This vector is maintained as a stack and the frontier of reachable
384 // live heap objects in our flood traversal of them.
385 typedef vector<AllocObject,
386 STL_Allocator<AllocObject, HeapLeakChecker::Allocator>
387 > LiveObjectsStack;
388 static LiveObjectsStack* live_objects = NULL;
390 // A special string type that uses my allocator
391 typedef basic_string<char, char_traits<char>,
392 STL_Allocator<char, HeapLeakChecker::Allocator>
393 > HCL_string;
395 // A placeholder to fill-in the starting values for live_objects
396 // for each library so we can keep the library-name association for logging.
397 typedef map<HCL_string, LiveObjectsStack, less<HCL_string>,
398 STL_Allocator<pair<const HCL_string, LiveObjectsStack>,
399 HeapLeakChecker::Allocator>
400 > LibraryLiveObjectsStacks;
401 static LibraryLiveObjectsStacks* library_live_objects = NULL;
403 // Value stored in the map of disabled address ranges;
404 // its key is the end of the address range.
405 // We'll ignore allocations with a return address in a disabled range
406 // if the address occurs at 'max_depth' or less in the stack trace.
407 struct HeapLeakChecker::RangeValue {
408 uintptr_t start_address; // the start of the range
409 int max_depth; // the maximal stack depth to disable at
411 typedef map<uintptr_t, HeapLeakChecker::RangeValue, less<uintptr_t>,
412 STL_Allocator<pair<const uintptr_t, HeapLeakChecker::RangeValue>,
413 HeapLeakChecker::Allocator>
414 > DisabledRangeMap;
415 // The disabled program counter address ranges for profile dumping
416 // that are registered with HeapLeakChecker::DisableChecksFromToLocked.
417 static DisabledRangeMap* disabled_ranges = NULL;
419 // Set of stack tops.
420 // These are used to consider live only appropriate chunks of the memory areas
421 // that are used for stacks (and maybe thread-specific data as well)
422 // so that we do not treat pointers from outdated stack frames as live.
423 typedef set<uintptr_t, less<uintptr_t>,
424 STL_Allocator<uintptr_t, HeapLeakChecker::Allocator>
425 > StackTopSet;
426 static StackTopSet* stack_tops = NULL;
428 // A map of ranges of code addresses for the system libraries
429 // that can mmap/mremap/sbrk-allocate memory regions for stacks
430 // and thread-local storage that we want to consider as live global data.
431 // Maps from the end address to the start address.
432 typedef map<uintptr_t, uintptr_t, less<uintptr_t>,
433 STL_Allocator<pair<const uintptr_t, uintptr_t>,
434 HeapLeakChecker::Allocator>
435 > GlobalRegionCallerRangeMap;
436 static GlobalRegionCallerRangeMap* global_region_caller_ranges = NULL;
438 // TODO(maxim): make our big data structs into own modules
440 // Disabler is implemented by keeping track of a per-thread count
441 // of active Disabler objects. Any objects allocated while the
442 // count > 0 are not reported.
444 #ifdef HAVE_TLS
446 static __thread int thread_disable_counter
447 // The "inital exec" model is faster than the default TLS model, at
448 // the cost you can't dlopen this library. But dlopen on heap-checker
449 // doesn't work anyway -- it must run before main -- so this is a good
450 // trade-off.
451 # ifdef HAVE___ATTRIBUTE__
452 __attribute__ ((tls_model ("initial-exec")))
453 # endif
455 inline int get_thread_disable_counter() {
456 return thread_disable_counter;
458 inline void set_thread_disable_counter(int value) {
459 thread_disable_counter = value;
462 #else // #ifdef HAVE_TLS
464 static pthread_key_t thread_disable_counter_key;
465 static int main_thread_counter; // storage for use before main()
466 static bool use_main_thread_counter = true;
468 // TODO(csilvers): this is called from NewHook, in the middle of malloc().
469 // If perftools_pthread_getspecific calls malloc, that will lead to an
470 // infinite loop. I don't know how to fix that, so I hope it never happens!
471 inline int get_thread_disable_counter() {
472 if (use_main_thread_counter) // means we're running really early
473 return main_thread_counter;
474 void* p = perftools_pthread_getspecific(thread_disable_counter_key);
475 return (intptr_t)p; // kinda evil: store the counter directly in the void*
478 inline void set_thread_disable_counter(int value) {
479 if (use_main_thread_counter) { // means we're running really early
480 main_thread_counter = value;
481 return;
483 intptr_t pointer_sized_value = value;
484 // kinda evil: store the counter directly in the void*
485 void* p = (void*)pointer_sized_value;
486 // NOTE: this may call malloc, which will call NewHook which will call
487 // get_thread_disable_counter() which will call pthread_getspecific(). I
488 // don't know if anything bad can happen if we call getspecific() in the
489 // middle of a setspecific() call. It seems to work ok in practice...
490 perftools_pthread_setspecific(thread_disable_counter_key, p);
493 // The idea here is that this initializer will run pretty late: after
494 // pthreads have been totally set up. At this point we can call
495 // pthreads routines, so we set those up.
496 class InitThreadDisableCounter {
497 public:
498 InitThreadDisableCounter() {
499 perftools_pthread_key_create(&thread_disable_counter_key, NULL);
500 // Set up the main thread's value, which we have a special variable for.
501 void* p = (void*)main_thread_counter; // store the counter directly
502 perftools_pthread_setspecific(thread_disable_counter_key, p);
503 use_main_thread_counter = false;
506 InitThreadDisableCounter init_thread_disable_counter;
508 #endif // #ifdef HAVE_TLS
510 HeapLeakChecker::Disabler::Disabler() {
511 // It is faster to unconditionally increment the thread-local
512 // counter than to check whether or not heap-checking is on
513 // in a thread-safe manner.
514 int counter = get_thread_disable_counter();
515 set_thread_disable_counter(counter + 1);
516 RAW_VLOG(10, "Increasing thread disable counter to %d", counter + 1);
519 HeapLeakChecker::Disabler::~Disabler() {
520 int counter = get_thread_disable_counter();
521 RAW_DCHECK(counter > 0, "");
522 if (counter > 0) {
523 set_thread_disable_counter(counter - 1);
524 RAW_VLOG(10, "Decreasing thread disable counter to %d", counter);
525 } else {
526 RAW_VLOG(0, "Thread disable counter underflow : %d", counter);
530 //----------------------------------------------------------------------
532 // The size of the largest heap object allocated so far.
533 static size_t max_heap_object_size = 0;
534 // The possible range of addresses that can point
535 // into one of the elements of heap_objects.
536 static uintptr_t min_heap_address = uintptr_t(-1LL);
537 static uintptr_t max_heap_address = 0;
539 //----------------------------------------------------------------------
541 // Simple casting helpers for uintptr_t and void*:
542 template<typename T>
543 inline static const void* AsPtr(T addr) {
544 return reinterpret_cast<void*>(addr);
546 inline static uintptr_t AsInt(const void* ptr) {
547 return reinterpret_cast<uintptr_t>(ptr);
550 //----------------------------------------------------------------------
552 // We've seen reports that strstr causes heap-checker crashes in some
553 // libc's (?):
554 // http://code.google.com/p/gperftools/issues/detail?id=263
555 // It's simple enough to use our own. This is not in time-critical code.
556 static const char* hc_strstr(const char* s1, const char* s2) {
557 const size_t len = strlen(s2);
558 RAW_CHECK(len > 0, "Unexpected empty string passed to strstr()");
559 for (const char* p = strchr(s1, *s2); p != NULL; p = strchr(p+1, *s2)) {
560 if (strncmp(p, s2, len) == 0) {
561 return p;
564 return NULL;
567 //----------------------------------------------------------------------
569 // Our hooks for MallocHook
570 static void NewHook(const void* ptr, size_t size) {
571 if (ptr != NULL) {
572 const int counter = get_thread_disable_counter();
573 const bool ignore = (counter > 0);
574 RAW_VLOG(16, "Recording Alloc: %p of %"PRIuS "; %d", ptr, size,
575 int(counter));
577 // Fetch the caller's stack trace before acquiring heap_checker_lock.
578 void* stack[HeapProfileTable::kMaxStackDepth];
579 int depth = HeapProfileTable::GetCallerStackTrace(0, stack);
581 { SpinLockHolder l(&heap_checker_lock);
582 if (size > max_heap_object_size) max_heap_object_size = size;
583 uintptr_t addr = AsInt(ptr);
584 if (addr < min_heap_address) min_heap_address = addr;
585 addr += size;
586 if (addr > max_heap_address) max_heap_address = addr;
587 if (heap_checker_on) {
588 heap_profile->RecordAlloc(ptr, size, depth, stack);
589 if (ignore) {
590 heap_profile->MarkAsIgnored(ptr);
594 RAW_VLOG(17, "Alloc Recorded: %p of %"PRIuS"", ptr, size);
598 static void DeleteHook(const void* ptr) {
599 if (ptr != NULL) {
600 RAW_VLOG(16, "Recording Free %p", ptr);
601 { SpinLockHolder l(&heap_checker_lock);
602 if (heap_checker_on) heap_profile->RecordFree(ptr);
604 RAW_VLOG(17, "Free Recorded: %p", ptr);
608 //----------------------------------------------------------------------
610 enum StackDirection {
611 GROWS_TOWARDS_HIGH_ADDRESSES,
612 GROWS_TOWARDS_LOW_ADDRESSES,
613 UNKNOWN_DIRECTION
616 // Determine which way the stack grows:
618 static StackDirection ATTRIBUTE_NOINLINE GetStackDirection(
619 const uintptr_t *const ptr) {
620 uintptr_t x;
621 if (&x < ptr)
622 return GROWS_TOWARDS_LOW_ADDRESSES;
623 if (ptr < &x)
624 return GROWS_TOWARDS_HIGH_ADDRESSES;
626 RAW_CHECK(0, ""); // Couldn't determine the stack direction.
628 return UNKNOWN_DIRECTION;
631 // Direction of stack growth (will initialize via GetStackDirection())
632 static StackDirection stack_direction = UNKNOWN_DIRECTION;
634 // This routine is called for every thread stack we know about to register it.
635 static void RegisterStackLocked(const void* top_ptr) {
636 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
637 RAW_DCHECK(MemoryRegionMap::LockIsHeld(), "");
638 RAW_VLOG(10, "Thread stack at %p", top_ptr);
639 uintptr_t top = AsInt(top_ptr);
640 stack_tops->insert(top); // add for later use
642 // make sure stack_direction is initialized
643 if (stack_direction == UNKNOWN_DIRECTION) {
644 stack_direction = GetStackDirection(&top);
647 // Find memory region with this stack
648 MemoryRegionMap::Region region;
649 if (MemoryRegionMap::FindAndMarkStackRegion(top, &region)) {
650 // Make the proper portion of the stack live:
651 if (stack_direction == GROWS_TOWARDS_LOW_ADDRESSES) {
652 RAW_VLOG(11, "Live stack at %p of %"PRIuPTR" bytes",
653 top_ptr, region.end_addr - top);
654 live_objects->push_back(AllocObject(top_ptr, region.end_addr - top,
655 THREAD_DATA));
656 } else { // GROWS_TOWARDS_HIGH_ADDRESSES
657 RAW_VLOG(11, "Live stack at %p of %"PRIuPTR" bytes",
658 AsPtr(region.start_addr),
659 top - region.start_addr);
660 live_objects->push_back(AllocObject(AsPtr(region.start_addr),
661 top - region.start_addr,
662 THREAD_DATA));
664 // not in MemoryRegionMap, look in library_live_objects:
665 } else if (FLAGS_heap_check_ignore_global_live) {
666 for (LibraryLiveObjectsStacks::iterator lib = library_live_objects->begin();
667 lib != library_live_objects->end(); ++lib) {
668 for (LiveObjectsStack::iterator span = lib->second.begin();
669 span != lib->second.end(); ++span) {
670 uintptr_t start = AsInt(span->ptr);
671 uintptr_t end = start + span->size;
672 if (start <= top && top < end) {
673 RAW_VLOG(11, "Stack at %p is inside /proc/self/maps chunk %p..%p",
674 top_ptr, AsPtr(start), AsPtr(end));
675 // Shrink start..end region by chopping away the memory regions in
676 // MemoryRegionMap that land in it to undo merging of regions
677 // in /proc/self/maps, so that we correctly identify what portion
678 // of start..end is actually the stack region.
679 uintptr_t stack_start = start;
680 uintptr_t stack_end = end;
681 // can optimize-away this loop, but it does not run often
682 RAW_DCHECK(MemoryRegionMap::LockIsHeld(), "");
683 for (MemoryRegionMap::RegionIterator r =
684 MemoryRegionMap::BeginRegionLocked();
685 r != MemoryRegionMap::EndRegionLocked(); ++r) {
686 if (top < r->start_addr && r->start_addr < stack_end) {
687 stack_end = r->start_addr;
689 if (stack_start < r->end_addr && r->end_addr <= top) {
690 stack_start = r->end_addr;
693 if (stack_start != start || stack_end != end) {
694 RAW_VLOG(11, "Stack at %p is actually inside memory chunk %p..%p",
695 top_ptr, AsPtr(stack_start), AsPtr(stack_end));
697 // Make the proper portion of the stack live:
698 if (stack_direction == GROWS_TOWARDS_LOW_ADDRESSES) {
699 RAW_VLOG(11, "Live stack at %p of %"PRIuPTR" bytes",
700 top_ptr, stack_end - top);
701 live_objects->push_back(
702 AllocObject(top_ptr, stack_end - top, THREAD_DATA));
703 } else { // GROWS_TOWARDS_HIGH_ADDRESSES
704 RAW_VLOG(11, "Live stack at %p of %"PRIuPTR" bytes",
705 AsPtr(stack_start), top - stack_start);
706 live_objects->push_back(
707 AllocObject(AsPtr(stack_start), top - stack_start, THREAD_DATA));
709 lib->second.erase(span); // kill the rest of the region
710 // Put the non-stack part(s) of the region back:
711 if (stack_start != start) {
712 lib->second.push_back(AllocObject(AsPtr(start), stack_start - start,
713 MAYBE_LIVE));
715 if (stack_end != end) {
716 lib->second.push_back(AllocObject(AsPtr(stack_end), end - stack_end,
717 MAYBE_LIVE));
719 return;
723 RAW_LOG(ERROR, "Memory region for stack at %p not found. "
724 "Will likely report false leak positives.", top_ptr);
728 // Iterator for heap allocation map data to make ignored objects "live"
729 // (i.e., treated as roots for the mark-and-sweep phase)
730 static void MakeIgnoredObjectsLiveCallbackLocked(
731 const void* ptr, const HeapProfileTable::AllocInfo& info) {
732 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
733 if (info.ignored) {
734 live_objects->push_back(AllocObject(ptr, info.object_size,
735 MUST_BE_ON_HEAP));
739 // Iterator for heap allocation map data to make objects allocated from
740 // disabled regions of code to be live.
741 static void MakeDisabledLiveCallbackLocked(
742 const void* ptr, const HeapProfileTable::AllocInfo& info) {
743 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
744 bool stack_disable = false;
745 bool range_disable = false;
746 for (int depth = 0; depth < info.stack_depth; depth++) {
747 uintptr_t addr = AsInt(info.call_stack[depth]);
748 if (disabled_ranges) {
749 DisabledRangeMap::const_iterator iter
750 = disabled_ranges->upper_bound(addr);
751 if (iter != disabled_ranges->end()) {
752 RAW_DCHECK(iter->first > addr, "");
753 if (iter->second.start_address < addr &&
754 iter->second.max_depth > depth) {
755 range_disable = true; // in range; dropping
756 break;
761 if (stack_disable || range_disable) {
762 uintptr_t start_address = AsInt(ptr);
763 uintptr_t end_address = start_address + info.object_size;
764 StackTopSet::const_iterator iter
765 = stack_tops->lower_bound(start_address);
766 if (iter != stack_tops->end()) {
767 RAW_DCHECK(*iter >= start_address, "");
768 if (*iter < end_address) {
769 // We do not disable (treat as live) whole allocated regions
770 // if they are used to hold thread call stacks
771 // (i.e. when we find a stack inside).
772 // The reason is that we'll treat as live the currently used
773 // stack portions anyway (see RegisterStackLocked),
774 // and the rest of the region where the stack lives can well
775 // contain outdated stack variables which are not live anymore,
776 // hence should not be treated as such.
777 RAW_VLOG(11, "Not %s-disabling %"PRIuS" bytes at %p"
778 ": have stack inside: %p",
779 (stack_disable ? "stack" : "range"),
780 info.object_size, ptr, AsPtr(*iter));
781 return;
784 RAW_VLOG(11, "%s-disabling %"PRIuS" bytes at %p",
785 (stack_disable ? "Stack" : "Range"), info.object_size, ptr);
786 live_objects->push_back(AllocObject(ptr, info.object_size,
787 MUST_BE_ON_HEAP));
791 static const char kUnnamedProcSelfMapEntry[] = "UNNAMED";
793 // This function takes some fields from a /proc/self/maps line:
795 // start_address start address of a memory region.
796 // end_address end address of a memory region
797 // permissions rwx + private/shared bit
798 // filename filename of the mapped file
800 // If the region is not writeable, then it cannot have any heap
801 // pointers in it, otherwise we record it as a candidate live region
802 // to get filtered later.
803 static void RecordGlobalDataLocked(uintptr_t start_address,
804 uintptr_t end_address,
805 const char* permissions,
806 const char* filename) {
807 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
808 // Ignore non-writeable regions.
809 if (strchr(permissions, 'w') == NULL) return;
810 if (filename == NULL || *filename == '\0') {
811 filename = kUnnamedProcSelfMapEntry;
813 RAW_VLOG(11, "Looking into %s: 0x%" PRIxPTR "..0x%" PRIxPTR,
814 filename, start_address, end_address);
815 (*library_live_objects)[filename].
816 push_back(AllocObject(AsPtr(start_address),
817 end_address - start_address,
818 MAYBE_LIVE));
821 // See if 'library' from /proc/self/maps has base name 'library_base'
822 // i.e. contains it and has '.' or '-' after it.
823 static bool IsLibraryNamed(const char* library, const char* library_base) {
824 const char* p = hc_strstr(library, library_base);
825 size_t sz = strlen(library_base);
826 return p != NULL && (p[sz] == '.' || p[sz] == '-');
829 // static
830 void HeapLeakChecker::DisableLibraryAllocsLocked(const char* library,
831 uintptr_t start_address,
832 uintptr_t end_address) {
833 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
834 int depth = 0;
835 // TODO(maxim): maybe this should be extended to also use objdump
836 // and pick the text portion of the library more precisely.
837 if (IsLibraryNamed(library, "/libpthread") ||
838 // libpthread has a lot of small "system" leaks we don't care about.
839 // In particular it allocates memory to store data supplied via
840 // pthread_setspecific (which can be the only pointer to a heap object).
841 IsLibraryNamed(library, "/libdl") ||
842 // library loaders leak some "system" heap that we don't care about
843 IsLibraryNamed(library, "/libcrypto") ||
844 // Sometimes libcrypto of OpenSSH is compiled with -fomit-frame-pointer
845 // (any library can be, of course, but this one often is because speed
846 // is so important for making crypto usable). We ignore all its
847 // allocations because we can't see the call stacks. We'd prefer
848 // to ignore allocations done in files/symbols that match
849 // "default_malloc_ex|default_realloc_ex"
850 // but that doesn't work when the end-result binary is stripped.
851 IsLibraryNamed(library, "/libjvm") ||
852 // JVM has a lot of leaks we don't care about.
853 IsLibraryNamed(library, "/libzip")
854 // The JVM leaks java.util.zip.Inflater after loading classes.
856 depth = 1; // only disable allocation calls directly from the library code
857 } else if (IsLibraryNamed(library, "/ld")
858 // library loader leaks some "system" heap
859 // (e.g. thread-local storage) that we don't care about
861 depth = 2; // disable allocation calls directly from the library code
862 // and at depth 2 from it.
863 // We need depth 2 here solely because of a libc bug that
864 // forces us to jump through __memalign_hook and MemalignOverride hoops
865 // in tcmalloc.cc.
866 // Those buggy __libc_memalign() calls are in ld-linux.so and happen for
867 // thread-local storage allocations that we want to ignore here.
868 // We go with the depth-2 hack as a workaround for this libc bug:
869 // otherwise we'd need to extend MallocHook interface
870 // so that correct stack depth adjustment can be propagated from
871 // the exceptional case of MemalignOverride.
872 // Using depth 2 here should not mask real leaks because ld-linux.so
873 // does not call user code.
875 if (depth) {
876 RAW_VLOG(10, "Disabling allocations from %s at depth %d:", library, depth);
877 DisableChecksFromToLocked(AsPtr(start_address), AsPtr(end_address), depth);
878 if (IsLibraryNamed(library, "/libpthread") ||
879 IsLibraryNamed(library, "/libdl") ||
880 IsLibraryNamed(library, "/ld")) {
881 RAW_VLOG(10, "Global memory regions made by %s will be live data",
882 library);
883 if (global_region_caller_ranges == NULL) {
884 global_region_caller_ranges =
885 new(Allocator::Allocate(sizeof(GlobalRegionCallerRangeMap)))
886 GlobalRegionCallerRangeMap;
888 global_region_caller_ranges
889 ->insert(make_pair(end_address, start_address));
894 // static
895 HeapLeakChecker::ProcMapsResult HeapLeakChecker::UseProcMapsLocked(
896 ProcMapsTask proc_maps_task) {
897 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
898 // Need to provide own scratch memory to ProcMapsIterator:
899 ProcMapsIterator::Buffer buffer;
900 ProcMapsIterator it(0, &buffer);
901 if (!it.Valid()) {
902 int errsv = errno;
903 RAW_LOG(ERROR, "Could not open /proc/self/maps: errno=%d. "
904 "Libraries will not be handled correctly.", errsv);
905 return CANT_OPEN_PROC_MAPS;
907 uint64 start_address, end_address, file_offset;
908 int64 inode;
909 char *permissions, *filename;
910 bool saw_shared_lib = false;
911 bool saw_nonzero_inode = false;
912 bool saw_shared_lib_with_nonzero_inode = false;
913 while (it.Next(&start_address, &end_address, &permissions,
914 &file_offset, &inode, &filename)) {
915 if (start_address >= end_address) {
916 // Warn if a line we can be interested in is ill-formed:
917 if (inode != 0) {
918 RAW_LOG(ERROR, "Errors reading /proc/self/maps. "
919 "Some global memory regions will not "
920 "be handled correctly.");
922 // Silently skip other ill-formed lines: some are possible
923 // probably due to the interplay of how /proc/self/maps is updated
924 // while we read it in chunks in ProcMapsIterator and
925 // do things in this loop.
926 continue;
928 // Determine if any shared libraries are present (this is the same
929 // list of extensions as is found in pprof). We want to ignore
930 // 'fake' libraries with inode 0 when determining. However, some
931 // systems don't share inodes via /proc, so we turn off this check
932 // if we don't see any evidence that we're getting inode info.
933 if (inode != 0) {
934 saw_nonzero_inode = true;
936 if ((hc_strstr(filename, "lib") && hc_strstr(filename, ".so")) ||
937 hc_strstr(filename, ".dll") ||
938 // not all .dylib filenames start with lib. .dylib is big enough
939 // that we are unlikely to get false matches just checking that.
940 hc_strstr(filename, ".dylib") || hc_strstr(filename, ".bundle")) {
941 saw_shared_lib = true;
942 if (inode != 0) {
943 saw_shared_lib_with_nonzero_inode = true;
947 switch (proc_maps_task) {
948 case DISABLE_LIBRARY_ALLOCS:
949 // All lines starting like
950 // "401dc000-4030f000 r??p 00132000 03:01 13991972 lib/bin"
951 // identify a data and code sections of a shared library or our binary
952 if (inode != 0 && strncmp(permissions, "r-xp", 4) == 0) {
953 DisableLibraryAllocsLocked(filename, start_address, end_address);
955 break;
956 case RECORD_GLOBAL_DATA:
957 RecordGlobalDataLocked(start_address, end_address,
958 permissions, filename);
959 break;
960 default:
961 RAW_CHECK(0, "");
964 // If /proc/self/maps is reporting inodes properly (we saw a
965 // non-zero inode), then we only say we saw a shared lib if we saw a
966 // 'real' one, with a non-zero inode.
967 if (saw_nonzero_inode) {
968 saw_shared_lib = saw_shared_lib_with_nonzero_inode;
970 if (!saw_shared_lib) {
971 RAW_LOG(ERROR, "No shared libs detected. Will likely report false leak "
972 "positives for statically linked executables.");
973 return NO_SHARED_LIBS_IN_PROC_MAPS;
975 return PROC_MAPS_USED;
978 // Total number and size of live objects dropped from the profile;
979 // (re)initialized in IgnoreAllLiveObjectsLocked.
980 static int64 live_objects_total;
981 static int64 live_bytes_total;
983 // pid of the thread that is doing the current leak check
984 // (protected by our lock; IgnoreAllLiveObjectsLocked sets it)
985 static pid_t self_thread_pid = 0;
987 // Status of our thread listing callback execution
988 // (protected by our lock; used from within IgnoreAllLiveObjectsLocked)
989 static enum {
990 CALLBACK_NOT_STARTED,
991 CALLBACK_STARTED,
992 CALLBACK_COMPLETED,
993 } thread_listing_status = CALLBACK_NOT_STARTED;
995 // Ideally to avoid deadlocks this function should not result in any libc
996 // or other function calls that might need to lock a mutex:
997 // It is called when all threads of a process are stopped
998 // at arbitrary points thus potentially holding those locks.
1000 // In practice we are calling some simple i/o and sprintf-type library functions
1001 // for logging messages, but use only our own LowLevelAlloc::Arena allocator.
1003 // This is known to be buggy: the library i/o function calls are able to cause
1004 // deadlocks when they request a lock that a stopped thread happens to hold.
1005 // This issue as far as we know have so far not resulted in any deadlocks
1006 // in practice, so for now we are taking our chance that the deadlocks
1007 // have insignificant frequency.
1009 // If such deadlocks become a problem we should make the i/o calls
1010 // into appropriately direct system calls (or eliminate them),
1011 // in particular write() is not safe and vsnprintf() is potentially dangerous
1012 // due to reliance on locale functions (these are called through RAW_LOG
1013 // and in other ways).
1015 /*static*/ int HeapLeakChecker::IgnoreLiveThreadsLocked(void* parameter,
1016 int num_threads,
1017 pid_t* thread_pids,
1018 va_list /*ap*/) {
1019 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
1020 thread_listing_status = CALLBACK_STARTED;
1021 RAW_VLOG(11, "Found %d threads (from pid %d)", num_threads, getpid());
1023 if (FLAGS_heap_check_ignore_global_live) {
1024 UseProcMapsLocked(RECORD_GLOBAL_DATA);
1027 // We put the registers from other threads here
1028 // to make pointers stored in them live.
1029 vector<void*, STL_Allocator<void*, Allocator> > thread_registers;
1031 int failures = 0;
1032 for (int i = 0; i < num_threads; ++i) {
1033 // the leak checking thread itself is handled
1034 // specially via self_thread_stack, not here:
1035 if (thread_pids[i] == self_thread_pid) continue;
1036 RAW_VLOG(11, "Handling thread with pid %d", thread_pids[i]);
1037 #if (defined(__i386__) || defined(__x86_64)) && \
1038 defined(HAVE_LINUX_PTRACE_H) && defined(HAVE_SYS_SYSCALL_H) && defined(DUMPER)
1039 i386_regs thread_regs;
1040 #define sys_ptrace(r, p, a, d) syscall(SYS_ptrace, (r), (p), (a), (d))
1041 // We use sys_ptrace to avoid thread locking
1042 // because this is called from ListAllProcessThreads
1043 // when all but this thread are suspended.
1044 if (sys_ptrace(PTRACE_GETREGS, thread_pids[i], NULL, &thread_regs) == 0) {
1045 // Need to use SP to get all the data from the very last stack frame:
1046 COMPILE_ASSERT(sizeof(thread_regs.SP) == sizeof(void*),
1047 SP_register_does_not_look_like_a_pointer);
1048 RegisterStackLocked(reinterpret_cast<void*>(thread_regs.SP));
1049 // Make registers live (just in case PTRACE_ATTACH resulted in some
1050 // register pointers still being in the registers and not on the stack):
1051 for (void** p = reinterpret_cast<void**>(&thread_regs);
1052 p < reinterpret_cast<void**>(&thread_regs + 1); ++p) {
1053 RAW_VLOG(12, "Thread register %p", *p);
1054 thread_registers.push_back(*p);
1056 } else {
1057 failures += 1;
1059 #else
1060 failures += 1;
1061 #endif
1063 // Use all the collected thread (stack) liveness sources:
1064 IgnoreLiveObjectsLocked("threads stack data", "");
1065 if (thread_registers.size()) {
1066 // Make thread registers be live heap data sources.
1067 // we rely here on the fact that vector is in one memory chunk:
1068 RAW_VLOG(11, "Live registers at %p of %"PRIuS" bytes",
1069 &thread_registers[0], thread_registers.size() * sizeof(void*));
1070 live_objects->push_back(AllocObject(&thread_registers[0],
1071 thread_registers.size() * sizeof(void*),
1072 THREAD_REGISTERS));
1073 IgnoreLiveObjectsLocked("threads register data", "");
1075 // Do all other liveness walking while all threads are stopped:
1076 IgnoreNonThreadLiveObjectsLocked();
1077 // Can now resume the threads:
1078 ResumeAllProcessThreads(num_threads, thread_pids);
1079 thread_listing_status = CALLBACK_COMPLETED;
1080 return failures;
1083 // Stack top of the thread that is doing the current leak check
1084 // (protected by our lock; IgnoreAllLiveObjectsLocked sets it)
1085 static const void* self_thread_stack_top;
1087 // static
1088 void HeapLeakChecker::IgnoreNonThreadLiveObjectsLocked() {
1089 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
1090 RAW_DCHECK(MemoryRegionMap::LockIsHeld(), "");
1091 RAW_VLOG(11, "Handling self thread with pid %d", self_thread_pid);
1092 // Register our own stack:
1094 // Important that all stack ranges (including the one here)
1095 // are known before we start looking at them
1096 // in MakeDisabledLiveCallbackLocked:
1097 RegisterStackLocked(self_thread_stack_top);
1098 IgnoreLiveObjectsLocked("stack data", "");
1100 // Make objects we were told to ignore live:
1101 if (ignored_objects) {
1102 for (IgnoredObjectsMap::const_iterator object = ignored_objects->begin();
1103 object != ignored_objects->end(); ++object) {
1104 const void* ptr = AsPtr(object->first);
1105 RAW_VLOG(11, "Ignored live object at %p of %"PRIuS" bytes",
1106 ptr, object->second);
1107 live_objects->
1108 push_back(AllocObject(ptr, object->second, MUST_BE_ON_HEAP));
1109 // we do this liveness check for ignored_objects before doing any
1110 // live heap walking to make sure it does not fail needlessly:
1111 size_t object_size;
1112 if (!(heap_profile->FindAlloc(ptr, &object_size) &&
1113 object->second == object_size)) {
1114 RAW_LOG(FATAL, "Object at %p of %"PRIuS" bytes from an"
1115 " IgnoreObject() has disappeared", ptr, object->second);
1118 IgnoreLiveObjectsLocked("ignored objects", "");
1121 // Treat objects that were allocated when a Disabler was live as
1122 // roots. I.e., if X was allocated while a Disabler was active,
1123 // and Y is reachable from X, arrange that neither X nor Y are
1124 // treated as leaks.
1125 heap_profile->IterateAllocs(MakeIgnoredObjectsLiveCallbackLocked);
1126 IgnoreLiveObjectsLocked("disabled objects", "");
1128 // Make code-address-disabled objects live and ignored:
1129 // This in particular makes all thread-specific data live
1130 // because the basic data structure to hold pointers to thread-specific data
1131 // is allocated from libpthreads and we have range-disabled that
1132 // library code with UseProcMapsLocked(DISABLE_LIBRARY_ALLOCS);
1133 // so now we declare all thread-specific data reachable from there as live.
1134 heap_profile->IterateAllocs(MakeDisabledLiveCallbackLocked);
1135 IgnoreLiveObjectsLocked("disabled code", "");
1137 // Actually make global data live:
1138 if (FLAGS_heap_check_ignore_global_live) {
1139 bool have_null_region_callers = false;
1140 for (LibraryLiveObjectsStacks::iterator l = library_live_objects->begin();
1141 l != library_live_objects->end(); ++l) {
1142 RAW_CHECK(live_objects->empty(), "");
1143 // Process library_live_objects in l->second
1144 // filtering them by MemoryRegionMap:
1145 // It's safe to iterate over MemoryRegionMap
1146 // w/o locks here as we are inside MemoryRegionMap::Lock():
1147 RAW_DCHECK(MemoryRegionMap::LockIsHeld(), "");
1148 // The only change to MemoryRegionMap possible in this loop
1149 // is region addition as a result of allocating more memory
1150 // for live_objects. This won't invalidate the RegionIterator
1151 // or the intent of the loop.
1152 // --see the comment by MemoryRegionMap::BeginRegionLocked().
1153 for (MemoryRegionMap::RegionIterator region =
1154 MemoryRegionMap::BeginRegionLocked();
1155 region != MemoryRegionMap::EndRegionLocked(); ++region) {
1156 // "region" from MemoryRegionMap is to be subtracted from
1157 // (tentatively live) regions in l->second
1158 // if it has a stack inside or it was allocated by
1159 // a non-special caller (not one covered by a range
1160 // in global_region_caller_ranges).
1161 // This will in particular exclude all memory chunks used
1162 // by the heap itself as well as what's been allocated with
1163 // any allocator on top of mmap.
1164 bool subtract = true;
1165 if (!region->is_stack && global_region_caller_ranges) {
1166 if (region->caller() == static_cast<uintptr_t>(NULL)) {
1167 have_null_region_callers = true;
1168 } else {
1169 GlobalRegionCallerRangeMap::const_iterator iter
1170 = global_region_caller_ranges->upper_bound(region->caller());
1171 if (iter != global_region_caller_ranges->end()) {
1172 RAW_DCHECK(iter->first > region->caller(), "");
1173 if (iter->second < region->caller()) { // in special region
1174 subtract = false;
1179 if (subtract) {
1180 // The loop puts the result of filtering l->second into live_objects:
1181 for (LiveObjectsStack::const_iterator i = l->second.begin();
1182 i != l->second.end(); ++i) {
1183 // subtract *region from *i
1184 uintptr_t start = AsInt(i->ptr);
1185 uintptr_t end = start + i->size;
1186 if (region->start_addr <= start && end <= region->end_addr) {
1187 // full deletion due to subsumption
1188 } else if (start < region->start_addr &&
1189 region->end_addr < end) { // cutting-out split
1190 live_objects->push_back(AllocObject(i->ptr,
1191 region->start_addr - start,
1192 IN_GLOBAL_DATA));
1193 live_objects->push_back(AllocObject(AsPtr(region->end_addr),
1194 end - region->end_addr,
1195 IN_GLOBAL_DATA));
1196 } else if (region->end_addr > start &&
1197 region->start_addr <= start) { // cut from start
1198 live_objects->push_back(AllocObject(AsPtr(region->end_addr),
1199 end - region->end_addr,
1200 IN_GLOBAL_DATA));
1201 } else if (region->start_addr > start &&
1202 region->start_addr < end) { // cut from end
1203 live_objects->push_back(AllocObject(i->ptr,
1204 region->start_addr - start,
1205 IN_GLOBAL_DATA));
1206 } else { // pass: no intersection
1207 live_objects->push_back(AllocObject(i->ptr, i->size,
1208 IN_GLOBAL_DATA));
1211 // Move live_objects back into l->second
1212 // for filtering by the next region.
1213 live_objects->swap(l->second);
1214 live_objects->clear();
1217 // Now get and use live_objects from the final version of l->second:
1218 if (VLOG_IS_ON(11)) {
1219 for (LiveObjectsStack::const_iterator i = l->second.begin();
1220 i != l->second.end(); ++i) {
1221 RAW_VLOG(11, "Library live region at %p of %"PRIuPTR" bytes",
1222 i->ptr, i->size);
1225 live_objects->swap(l->second);
1226 IgnoreLiveObjectsLocked("in globals of\n ", l->first.c_str());
1228 if (have_null_region_callers) {
1229 RAW_LOG(ERROR, "Have memory regions w/o callers: "
1230 "might report false leaks");
1232 Allocator::DeleteAndNull(&library_live_objects);
1236 // Callback for ListAllProcessThreads in IgnoreAllLiveObjectsLocked below
1237 // to test/verify that we have just the one main thread, in which case
1238 // we can do everything in that main thread,
1239 // so that CPU profiler can collect all its samples.
1240 // Returns the number of threads in the process.
1241 static int IsOneThread(void* parameter, int num_threads,
1242 pid_t* thread_pids, va_list ap) {
1243 if (num_threads != 1) {
1244 RAW_LOG(WARNING, "Have threads: Won't CPU-profile the bulk of leak "
1245 "checking work happening in IgnoreLiveThreadsLocked!");
1247 ResumeAllProcessThreads(num_threads, thread_pids);
1248 return num_threads;
1251 // Dummy for IgnoreAllLiveObjectsLocked below.
1252 // Making it global helps with compiler warnings.
1253 static va_list dummy_ap;
1255 // static
1256 void HeapLeakChecker::IgnoreAllLiveObjectsLocked(const void* self_stack_top) {
1257 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
1258 RAW_CHECK(live_objects == NULL, "");
1259 live_objects = new(Allocator::Allocate(sizeof(LiveObjectsStack)))
1260 LiveObjectsStack;
1261 stack_tops = new(Allocator::Allocate(sizeof(StackTopSet))) StackTopSet;
1262 // reset the counts
1263 live_objects_total = 0;
1264 live_bytes_total = 0;
1265 // Reduce max_heap_object_size to FLAGS_heap_check_max_pointer_offset
1266 // for the time of leak check.
1267 // FLAGS_heap_check_max_pointer_offset caps max_heap_object_size
1268 // to manage reasonably low chances of random bytes
1269 // appearing to be pointing into large actually leaked heap objects.
1270 const size_t old_max_heap_object_size = max_heap_object_size;
1271 max_heap_object_size = (
1272 FLAGS_heap_check_max_pointer_offset != -1
1273 ? min(size_t(FLAGS_heap_check_max_pointer_offset), max_heap_object_size)
1274 : max_heap_object_size);
1275 // Record global data as live:
1276 if (FLAGS_heap_check_ignore_global_live) {
1277 library_live_objects =
1278 new(Allocator::Allocate(sizeof(LibraryLiveObjectsStacks)))
1279 LibraryLiveObjectsStacks;
1281 // Ignore all thread stacks:
1282 thread_listing_status = CALLBACK_NOT_STARTED;
1283 bool need_to_ignore_non_thread_objects = true;
1284 self_thread_pid = getpid();
1285 self_thread_stack_top = self_stack_top;
1286 if (FLAGS_heap_check_ignore_thread_live) {
1287 // In case we are doing CPU profiling we'd like to do all the work
1288 // in the main thread, not in the special thread created by
1289 // ListAllProcessThreads, so that CPU profiler can collect all its samples.
1290 // The machinery of ListAllProcessThreads conflicts with the CPU profiler
1291 // by also relying on signals and ::sigaction.
1292 // We can do this (run everything in the main thread) safely
1293 // only if there's just the main thread itself in our process.
1294 // This variable reflects these two conditions:
1295 bool want_and_can_run_in_main_thread =
1296 ProfilingIsEnabledForAllThreads() &&
1297 ListAllProcessThreads(NULL, IsOneThread) == 1;
1298 // When the normal path of ListAllProcessThreads below is taken,
1299 // we fully suspend the threads right here before any liveness checking
1300 // and keep them suspended for the whole time of liveness checking
1301 // inside of the IgnoreLiveThreadsLocked callback.
1302 // (The threads can't (de)allocate due to lock on the delete hook but
1303 // if not suspended they could still mess with the pointer
1304 // graph while we walk it).
1305 int r = want_and_can_run_in_main_thread
1306 ? IgnoreLiveThreadsLocked(NULL, 1, &self_thread_pid, dummy_ap)
1307 : ListAllProcessThreads(NULL, IgnoreLiveThreadsLocked);
1308 need_to_ignore_non_thread_objects = r < 0;
1309 if (r < 0) {
1310 RAW_LOG(WARNING, "Thread finding failed with %d errno=%d", r, errno);
1311 if (thread_listing_status == CALLBACK_COMPLETED) {
1312 RAW_LOG(INFO, "Thread finding callback "
1313 "finished ok; hopefully everything is fine");
1314 need_to_ignore_non_thread_objects = false;
1315 } else if (thread_listing_status == CALLBACK_STARTED) {
1316 RAW_LOG(FATAL, "Thread finding callback was "
1317 "interrupted or crashed; can't fix this");
1318 } else { // CALLBACK_NOT_STARTED
1319 RAW_LOG(ERROR, "Could not find thread stacks. "
1320 "Will likely report false leak positives.");
1322 } else if (r != 0) {
1323 RAW_LOG(ERROR, "Thread stacks not found for %d threads. "
1324 "Will likely report false leak positives.", r);
1325 } else {
1326 RAW_VLOG(11, "Thread stacks appear to be found for all threads");
1328 } else {
1329 RAW_LOG(WARNING, "Not looking for thread stacks; "
1330 "objects reachable only from there "
1331 "will be reported as leaks");
1333 // Do all other live data ignoring here if we did not do it
1334 // within thread listing callback with all threads stopped.
1335 if (need_to_ignore_non_thread_objects) {
1336 if (FLAGS_heap_check_ignore_global_live) {
1337 UseProcMapsLocked(RECORD_GLOBAL_DATA);
1339 IgnoreNonThreadLiveObjectsLocked();
1341 if (live_objects_total) {
1342 RAW_VLOG(10, "Ignoring %"PRId64" reachable objects of %"PRId64" bytes",
1343 live_objects_total, live_bytes_total);
1345 // Free these: we made them here and heap_profile never saw them
1346 Allocator::DeleteAndNull(&live_objects);
1347 Allocator::DeleteAndNull(&stack_tops);
1348 max_heap_object_size = old_max_heap_object_size; // reset this var
1351 // Alignment at which we should consider pointer positions
1352 // in IgnoreLiveObjectsLocked. Will normally use the value of
1353 // FLAGS_heap_check_pointer_source_alignment.
1354 static size_t pointer_source_alignment = kPointerSourceAlignment;
1355 // Global lock for HeapLeakChecker::DoNoLeaks
1356 // to protect pointer_source_alignment.
1357 static SpinLock alignment_checker_lock(SpinLock::LINKER_INITIALIZED);
1359 // This function changes the live bits in the heap_profile-table's state:
1360 // we only record the live objects to be skipped.
1362 // When checking if a byte sequence points to a heap object we use
1363 // HeapProfileTable::FindInsideAlloc to handle both pointers to
1364 // the start and inside of heap-allocated objects.
1365 // The "inside" case needs to be checked to support
1366 // at least the following relatively common cases:
1367 // - C++ arrays allocated with new FooClass[size] for classes
1368 // with destructors have their size recorded in a sizeof(int) field
1369 // before the place normal pointers point to.
1370 // - basic_string<>-s for e.g. the C++ library of gcc 3.4
1371 // have the meta-info in basic_string<...>::_Rep recorded
1372 // before the place normal pointers point to.
1373 // - Multiple-inherited objects have their pointers when cast to
1374 // different base classes pointing inside of the actually
1375 // allocated object.
1376 // - Sometimes reachability pointers point to member objects of heap objects,
1377 // and then those member objects point to the full heap object.
1378 // - Third party UnicodeString: it stores a 32-bit refcount
1379 // (in both 32-bit and 64-bit binaries) as the first uint32
1380 // in the allocated memory and a normal pointer points at
1381 // the second uint32 behind the refcount.
1382 // By finding these additional objects here
1383 // we slightly increase the chance to mistake random memory bytes
1384 // for a pointer and miss a leak in a particular run of a binary.
1386 /*static*/ void HeapLeakChecker::IgnoreLiveObjectsLocked(const char* name,
1387 const char* name2) {
1388 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
1389 int64 live_object_count = 0;
1390 int64 live_byte_count = 0;
1391 while (!live_objects->empty()) {
1392 const char* object =
1393 reinterpret_cast<const char*>(live_objects->back().ptr);
1394 size_t size = live_objects->back().size;
1395 const ObjectPlacement place = live_objects->back().place;
1396 live_objects->pop_back();
1397 if (place == MUST_BE_ON_HEAP && heap_profile->MarkAsLive(object)) {
1398 live_object_count += 1;
1399 live_byte_count += size;
1401 RAW_VLOG(13, "Looking for heap pointers in %p of %"PRIuS" bytes",
1402 object, size);
1403 const char* const whole_object = object;
1404 size_t const whole_size = size;
1405 // Try interpretting any byte sequence in object,size as a heap pointer:
1406 const size_t remainder = AsInt(object) % pointer_source_alignment;
1407 if (remainder) {
1408 object += pointer_source_alignment - remainder;
1409 if (size >= pointer_source_alignment - remainder) {
1410 size -= pointer_source_alignment - remainder;
1411 } else {
1412 size = 0;
1415 if (size < sizeof(void*)) continue;
1417 #ifdef NO_FRAME_POINTER
1418 // Frame pointer omission requires us to use libunwind, which uses direct
1419 // mmap and munmap system calls, and that needs special handling.
1420 if (name2 == kUnnamedProcSelfMapEntry) {
1421 static const uintptr_t page_mask = ~(getpagesize() - 1);
1422 const uintptr_t addr = reinterpret_cast<uintptr_t>(object);
1423 if ((addr & page_mask) == 0 && (size & page_mask) == 0) {
1424 // This is an object we slurped from /proc/self/maps.
1425 // It may or may not be readable at this point.
1427 // In case all the above conditions made a mistake, and the object is
1428 // not related to libunwind, we also verify that it's not readable
1429 // before ignoring it.
1430 if (msync(const_cast<char*>(object), size, MS_ASYNC) != 0) {
1431 // Skip unreadable object, so we don't crash trying to sweep it.
1432 RAW_VLOG(0, "Ignoring inaccessible object [%p, %p) "
1433 "(msync error %d (%s))",
1434 object, object + size, errno, strerror(errno));
1435 continue;
1439 #endif
1441 const char* const max_object = object + size - sizeof(void*);
1442 while (object <= max_object) {
1443 // potentially unaligned load:
1444 const uintptr_t addr = *reinterpret_cast<const uintptr_t*>(object);
1445 // Do fast check before the more expensive HaveOnHeapLocked lookup:
1446 // this code runs for all memory words that are potentially pointers:
1447 const bool can_be_on_heap =
1448 // Order tests by the likelyhood of the test failing in 64/32 bit modes.
1449 // Yes, this matters: we either lose 5..6% speed in 32 bit mode
1450 // (which is already slower) or by a factor of 1.5..1.91 in 64 bit mode.
1451 // After the alignment test got dropped the above performance figures
1452 // must have changed; might need to revisit this.
1453 #if defined(__x86_64__)
1454 addr <= max_heap_address && // <= is for 0-sized object with max addr
1455 min_heap_address <= addr;
1456 #else
1457 min_heap_address <= addr &&
1458 addr <= max_heap_address; // <= is for 0-sized object with max addr
1459 #endif
1460 if (can_be_on_heap) {
1461 const void* ptr = reinterpret_cast<const void*>(addr);
1462 // Too expensive (inner loop): manually uncomment when debugging:
1463 // RAW_VLOG(17, "Trying pointer to %p at %p", ptr, object);
1464 size_t object_size;
1465 if (HaveOnHeapLocked(&ptr, &object_size) &&
1466 heap_profile->MarkAsLive(ptr)) {
1467 // We take the (hopefully low) risk here of encountering by accident
1468 // a byte sequence in memory that matches an address of
1469 // a heap object which is in fact leaked.
1470 // I.e. in very rare and probably not repeatable/lasting cases
1471 // we might miss some real heap memory leaks.
1472 RAW_VLOG(14, "Found pointer to %p of %"PRIuS" bytes at %p "
1473 "inside %p of size %"PRIuS"",
1474 ptr, object_size, object, whole_object, whole_size);
1475 if (VLOG_IS_ON(15)) {
1476 // log call stacks to help debug how come something is not a leak
1477 HeapProfileTable::AllocInfo alloc;
1478 bool r = heap_profile->FindAllocDetails(ptr, &alloc);
1479 r = r; // suppress compiler warning in non-debug mode
1480 RAW_DCHECK(r, ""); // sanity
1481 RAW_LOG(INFO, "New live %p object's alloc stack:", ptr);
1482 for (int i = 0; i < alloc.stack_depth; ++i) {
1483 RAW_LOG(INFO, " @ %p", alloc.call_stack[i]);
1486 live_object_count += 1;
1487 live_byte_count += object_size;
1488 live_objects->push_back(AllocObject(ptr, object_size,
1489 IGNORED_ON_HEAP));
1492 object += pointer_source_alignment;
1495 live_objects_total += live_object_count;
1496 live_bytes_total += live_byte_count;
1497 if (live_object_count) {
1498 RAW_VLOG(10, "Removed %"PRId64" live heap objects of %"PRId64" bytes: %s%s",
1499 live_object_count, live_byte_count, name, name2);
1503 //----------------------------------------------------------------------
1504 // HeapLeakChecker leak check disabling components
1505 //----------------------------------------------------------------------
1507 // static
1508 void HeapLeakChecker::DisableChecksIn(const char* pattern) {
1509 RAW_LOG(WARNING, "DisableChecksIn(%s) is ignored", pattern);
1512 // static
1513 void HeapLeakChecker::DoIgnoreObject(const void* ptr) {
1514 SpinLockHolder l(&heap_checker_lock);
1515 if (!heap_checker_on) return;
1516 size_t object_size;
1517 if (!HaveOnHeapLocked(&ptr, &object_size)) {
1518 RAW_LOG(ERROR, "No live heap object at %p to ignore", ptr);
1519 } else {
1520 RAW_VLOG(10, "Going to ignore live object at %p of %"PRIuS" bytes",
1521 ptr, object_size);
1522 if (ignored_objects == NULL) {
1523 ignored_objects = new(Allocator::Allocate(sizeof(IgnoredObjectsMap)))
1524 IgnoredObjectsMap;
1526 if (!ignored_objects->insert(make_pair(AsInt(ptr), object_size)).second) {
1527 RAW_LOG(WARNING, "Object at %p is already being ignored", ptr);
1532 // static
1533 void HeapLeakChecker::UnIgnoreObject(const void* ptr) {
1534 SpinLockHolder l(&heap_checker_lock);
1535 if (!heap_checker_on) return;
1536 size_t object_size;
1537 if (!HaveOnHeapLocked(&ptr, &object_size)) {
1538 RAW_LOG(FATAL, "No live heap object at %p to un-ignore", ptr);
1539 } else {
1540 bool found = false;
1541 if (ignored_objects) {
1542 IgnoredObjectsMap::iterator object = ignored_objects->find(AsInt(ptr));
1543 if (object != ignored_objects->end() && object_size == object->second) {
1544 ignored_objects->erase(object);
1545 found = true;
1546 RAW_VLOG(10, "Now not going to ignore live object "
1547 "at %p of %"PRIuS" bytes", ptr, object_size);
1550 if (!found) RAW_LOG(FATAL, "Object at %p has not been ignored", ptr);
1554 //----------------------------------------------------------------------
1555 // HeapLeakChecker non-static functions
1556 //----------------------------------------------------------------------
1558 char* HeapLeakChecker::MakeProfileNameLocked() {
1559 RAW_DCHECK(lock_->IsHeld(), "");
1560 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
1561 const int len = profile_name_prefix->size() + strlen(name_) + 5 +
1562 strlen(HeapProfileTable::kFileExt) + 1;
1563 char* file_name = reinterpret_cast<char*>(Allocator::Allocate(len));
1564 snprintf(file_name, len, "%s.%s-end%s",
1565 profile_name_prefix->c_str(), name_,
1566 HeapProfileTable::kFileExt);
1567 return file_name;
1570 void HeapLeakChecker::Create(const char *name, bool make_start_snapshot) {
1571 SpinLockHolder l(lock_);
1572 name_ = NULL; // checker is inactive
1573 start_snapshot_ = NULL;
1574 has_checked_ = false;
1575 inuse_bytes_increase_ = 0;
1576 inuse_allocs_increase_ = 0;
1577 keep_profiles_ = false;
1578 char* n = new char[strlen(name) + 1]; // do this before we lock
1579 IgnoreObject(n); // otherwise it might be treated as live due to our stack
1580 { // Heap activity in other threads is paused for this whole scope.
1581 SpinLockHolder al(&alignment_checker_lock);
1582 SpinLockHolder hl(&heap_checker_lock);
1583 MemoryRegionMap::LockHolder ml;
1584 if (heap_checker_on && profile_name_prefix != NULL) {
1585 RAW_DCHECK(strchr(name, '/') == NULL, "must be a simple name");
1586 memcpy(n, name, strlen(name) + 1);
1587 name_ = n; // checker is active
1588 if (make_start_snapshot) {
1589 start_snapshot_ = heap_profile->TakeSnapshot();
1592 const HeapProfileTable::Stats& t = heap_profile->total();
1593 const size_t start_inuse_bytes = t.alloc_size - t.free_size;
1594 const size_t start_inuse_allocs = t.allocs - t.frees;
1595 RAW_VLOG(10, "Start check \"%s\" profile: %"PRIuS" bytes "
1596 "in %"PRIuS" objects",
1597 name_, start_inuse_bytes, start_inuse_allocs);
1598 } else {
1599 RAW_LOG(WARNING, "Heap checker is not active, "
1600 "hence checker \"%s\" will do nothing!", name);
1601 RAW_LOG(WARNING, "To activate set the HEAPCHECK environment variable.\n");
1604 if (name_ == NULL) {
1605 UnIgnoreObject(n);
1606 delete[] n; // must be done after we unlock
1610 HeapLeakChecker::HeapLeakChecker(const char *name) : lock_(new SpinLock) {
1611 RAW_DCHECK(strcmp(name, "_main_") != 0, "_main_ is reserved");
1612 Create(name, true/*create start_snapshot_*/);
1615 HeapLeakChecker::HeapLeakChecker() : lock_(new SpinLock) {
1616 if (FLAGS_heap_check_before_constructors) {
1617 // We want to check for leaks of objects allocated during global
1618 // constructors (i.e., objects allocated already). So we do not
1619 // create a baseline snapshot and hence check for leaks of objects
1620 // that may have already been created.
1621 Create("_main_", false);
1622 } else {
1623 // We want to ignore leaks of objects allocated during global
1624 // constructors (i.e., objects allocated already). So we snapshot
1625 // the current heap contents and use them as a baseline that is
1626 // not reported by the leak checker.
1627 Create("_main_", true);
1631 ssize_t HeapLeakChecker::BytesLeaked() const {
1632 SpinLockHolder l(lock_);
1633 if (!has_checked_) {
1634 RAW_LOG(FATAL, "*NoLeaks|SameHeap must execute before this call");
1636 return inuse_bytes_increase_;
1639 ssize_t HeapLeakChecker::ObjectsLeaked() const {
1640 SpinLockHolder l(lock_);
1641 if (!has_checked_) {
1642 RAW_LOG(FATAL, "*NoLeaks|SameHeap must execute before this call");
1644 return inuse_allocs_increase_;
1647 // Save pid of main thread for using in naming dump files
1648 static int32 main_thread_pid = getpid();
1649 #ifdef HAVE_PROGRAM_INVOCATION_NAME
1650 extern char* program_invocation_name;
1651 extern char* program_invocation_short_name;
1652 static const char* invocation_name() { return program_invocation_short_name; }
1653 static string invocation_path() { return program_invocation_name; }
1654 #else
1655 static const char* invocation_name() { return "<your binary>"; }
1656 static string invocation_path() { return "<your binary>"; }
1657 #endif
1659 // Prints commands that users can run to get more information
1660 // about the reported leaks.
1661 static void SuggestPprofCommand(const char* pprof_file_arg) {
1662 // Extra help information to print for the user when the test is
1663 // being run in a way where the straightforward pprof command will
1664 // not suffice.
1665 string extra_help;
1667 // Common header info to print for remote runs
1668 const string remote_header =
1669 "This program is being executed remotely and therefore the pprof\n"
1670 "command printed above will not work. Either run this program\n"
1671 "locally, or adjust the pprof command as follows to allow it to\n"
1672 "work on your local machine:\n";
1674 // Extra command for fetching remote data
1675 string fetch_cmd;
1677 RAW_LOG(WARNING,
1678 "\n\n"
1679 "If the preceding stack traces are not enough to find "
1680 "the leaks, try running THIS shell command:\n\n"
1681 "%s%s %s \"%s\" --inuse_objects --lines --heapcheck "
1682 " --edgefraction=1e-10 --nodefraction=1e-10 --gv\n"
1683 "\n"
1684 "%s"
1685 "If you are still puzzled about why the leaks are "
1686 "there, try rerunning this program with "
1687 "HEAP_CHECK_TEST_POINTER_ALIGNMENT=1 and/or with "
1688 "HEAP_CHECK_MAX_POINTER_OFFSET=-1\n"
1689 "If the leak report occurs in a small fraction of runs, "
1690 "try running with TCMALLOC_MAX_FREE_QUEUE_SIZE of few hundred MB "
1691 "or with TCMALLOC_RECLAIM_MEMORY=false, " // only works for debugalloc
1692 "it might help find leaks more repeatably\n",
1693 fetch_cmd.c_str(),
1694 "pprof", // works as long as pprof is on your path
1695 invocation_path().c_str(),
1696 pprof_file_arg,
1697 extra_help.c_str()
1701 bool HeapLeakChecker::DoNoLeaks(ShouldSymbolize should_symbolize) {
1702 SpinLockHolder l(lock_);
1703 // The locking also helps us keep the messages
1704 // for the two checks close together.
1705 SpinLockHolder al(&alignment_checker_lock);
1707 // thread-safe: protected by alignment_checker_lock
1708 static bool have_disabled_hooks_for_symbolize = false;
1709 // Once we've checked for leaks and symbolized the results once, it's
1710 // not safe to do it again. This is because in order to symbolize
1711 // safely, we had to disable all the malloc hooks here, so we no
1712 // longer can be confident we've collected all the data we need.
1713 if (have_disabled_hooks_for_symbolize) {
1714 RAW_LOG(FATAL, "Must not call heap leak checker manually after "
1715 " program-exit's automatic check.");
1718 HeapProfileTable::Snapshot* leaks = NULL;
1719 char* pprof_file = NULL;
1722 // Heap activity in other threads is paused during this function
1723 // (i.e. until we got all profile difference info).
1724 SpinLockHolder hl(&heap_checker_lock);
1725 if (heap_checker_on == false) {
1726 if (name_ != NULL) { // leak checking enabled when created the checker
1727 RAW_LOG(WARNING, "Heap leak checker got turned off after checker "
1728 "\"%s\" has been created, no leak check is being done for it!",
1729 name_);
1731 return true;
1734 // Update global_region_caller_ranges. They may need to change since
1735 // e.g. initialization because shared libraries might have been loaded or
1736 // unloaded.
1737 Allocator::DeleteAndNullIfNot(&global_region_caller_ranges);
1738 ProcMapsResult pm_result = UseProcMapsLocked(DISABLE_LIBRARY_ALLOCS);
1739 RAW_CHECK(pm_result == PROC_MAPS_USED, "");
1741 // Keep track of number of internally allocated objects so we
1742 // can detect leaks in the heap-leak-checket itself
1743 const int initial_allocs = Allocator::alloc_count();
1745 if (name_ == NULL) {
1746 RAW_LOG(FATAL, "Heap leak checker must not be turned on "
1747 "after construction of a HeapLeakChecker");
1750 MemoryRegionMap::LockHolder ml;
1751 int a_local_var; // Use our stack ptr to make stack data live:
1753 // Make the heap profile, other threads are locked out.
1754 HeapProfileTable::Snapshot* base =
1755 reinterpret_cast<HeapProfileTable::Snapshot*>(start_snapshot_);
1756 RAW_DCHECK(FLAGS_heap_check_pointer_source_alignment > 0, "");
1757 pointer_source_alignment = FLAGS_heap_check_pointer_source_alignment;
1758 IgnoreAllLiveObjectsLocked(&a_local_var);
1759 leaks = heap_profile->NonLiveSnapshot(base);
1761 inuse_bytes_increase_ = static_cast<ssize_t>(leaks->total().alloc_size);
1762 inuse_allocs_increase_ = static_cast<ssize_t>(leaks->total().allocs);
1763 if (leaks->Empty()) {
1764 heap_profile->ReleaseSnapshot(leaks);
1765 leaks = NULL;
1767 // We can only check for internal leaks along the no-user-leak
1768 // path since in the leak path we temporarily release
1769 // heap_checker_lock and another thread can come in and disturb
1770 // allocation counts.
1771 if (Allocator::alloc_count() != initial_allocs) {
1772 RAW_LOG(FATAL, "Internal HeapChecker leak of %d objects ; %d -> %d",
1773 Allocator::alloc_count() - initial_allocs,
1774 initial_allocs, Allocator::alloc_count());
1776 } else if (FLAGS_heap_check_test_pointer_alignment) {
1777 if (pointer_source_alignment == 1) {
1778 RAW_LOG(WARNING, "--heap_check_test_pointer_alignment has no effect: "
1779 "--heap_check_pointer_source_alignment was already set to 1");
1780 } else {
1781 // Try with reduced pointer aligment
1782 pointer_source_alignment = 1;
1783 IgnoreAllLiveObjectsLocked(&a_local_var);
1784 HeapProfileTable::Snapshot* leaks_wo_align =
1785 heap_profile->NonLiveSnapshot(base);
1786 pointer_source_alignment = FLAGS_heap_check_pointer_source_alignment;
1787 if (leaks_wo_align->Empty()) {
1788 RAW_LOG(WARNING, "Found no leaks without pointer alignment: "
1789 "something might be placing pointers at "
1790 "unaligned addresses! This needs to be fixed.");
1791 } else {
1792 RAW_LOG(INFO, "Found leaks without pointer alignment as well: "
1793 "unaligned pointers must not be the cause of leaks.");
1794 RAW_LOG(INFO, "--heap_check_test_pointer_alignment did not help "
1795 "to diagnose the leaks.");
1797 heap_profile->ReleaseSnapshot(leaks_wo_align);
1801 if (leaks != NULL) {
1802 pprof_file = MakeProfileNameLocked();
1806 has_checked_ = true;
1807 if (leaks == NULL) {
1808 if (FLAGS_heap_check_max_pointer_offset == -1) {
1809 RAW_LOG(WARNING,
1810 "Found no leaks without max_pointer_offset restriction: "
1811 "it's possible that the default value of "
1812 "heap_check_max_pointer_offset flag is too low. "
1813 "Do you use pointers with larger than that offsets "
1814 "pointing in the middle of heap-allocated objects?");
1816 const HeapProfileTable::Stats& stats = heap_profile->total();
1817 RAW_VLOG(heap_checker_info_level,
1818 "No leaks found for check \"%s\" "
1819 "(but no 100%% guarantee that there aren't any): "
1820 "found %"PRId64" reachable heap objects of %"PRId64" bytes",
1821 name_,
1822 int64(stats.allocs - stats.frees),
1823 int64(stats.alloc_size - stats.free_size));
1824 } else {
1825 if (should_symbolize == SYMBOLIZE) {
1826 // To turn addresses into symbols, we need to fork, which is a
1827 // problem if both parent and child end up trying to call the
1828 // same malloc-hooks we've set up, at the same time. To avoid
1829 // trouble, we turn off the hooks before symbolizing. Note that
1830 // this makes it unsafe to ever leak-report again! Luckily, we
1831 // typically only want to report once in a program's run, at the
1832 // very end.
1833 if (MallocHook::GetNewHook() == NewHook)
1834 MallocHook::SetNewHook(NULL);
1835 if (MallocHook::GetDeleteHook() == DeleteHook)
1836 MallocHook::SetDeleteHook(NULL);
1837 MemoryRegionMap::Shutdown();
1838 // Make sure all the hooks really got unset:
1839 RAW_CHECK(MallocHook::GetNewHook() == NULL, "");
1840 RAW_CHECK(MallocHook::GetDeleteHook() == NULL, "");
1841 RAW_CHECK(MallocHook::GetMmapHook() == NULL, "");
1842 RAW_CHECK(MallocHook::GetSbrkHook() == NULL, "");
1843 have_disabled_hooks_for_symbolize = true;
1844 leaks->ReportLeaks(name_, pprof_file, true); // true = should_symbolize
1845 } else {
1846 leaks->ReportLeaks(name_, pprof_file, false);
1848 if (FLAGS_heap_check_identify_leaks) {
1849 leaks->ReportIndividualObjects();
1852 SuggestPprofCommand(pprof_file);
1855 SpinLockHolder hl(&heap_checker_lock);
1856 heap_profile->ReleaseSnapshot(leaks);
1857 Allocator::Free(pprof_file);
1861 return (leaks == NULL);
1864 HeapLeakChecker::~HeapLeakChecker() {
1865 if (name_ != NULL) { // had leak checking enabled when created the checker
1866 if (!has_checked_) {
1867 RAW_LOG(FATAL, "Some *NoLeaks|SameHeap method"
1868 " must be called on any created HeapLeakChecker");
1871 // Deallocate any snapshot taken at start
1872 if (start_snapshot_ != NULL) {
1873 SpinLockHolder l(&heap_checker_lock);
1874 heap_profile->ReleaseSnapshot(
1875 reinterpret_cast<HeapProfileTable::Snapshot*>(start_snapshot_));
1878 UnIgnoreObject(name_);
1879 delete[] name_;
1880 name_ = NULL;
1882 delete lock_;
1885 //----------------------------------------------------------------------
1886 // HeapLeakChecker overall heap check components
1887 //----------------------------------------------------------------------
1889 // static
1890 bool HeapLeakChecker::IsActive() {
1891 SpinLockHolder l(&heap_checker_lock);
1892 return heap_checker_on;
1895 vector<HeapCleaner::void_function>* HeapCleaner::heap_cleanups_ = NULL;
1897 // When a HeapCleaner object is intialized, add its function to the static list
1898 // of cleaners to be run before leaks checking.
1899 HeapCleaner::HeapCleaner(void_function f) {
1900 if (heap_cleanups_ == NULL)
1901 heap_cleanups_ = new vector<HeapCleaner::void_function>;
1902 heap_cleanups_->push_back(f);
1905 // Run all of the cleanup functions and delete the vector.
1906 void HeapCleaner::RunHeapCleanups() {
1907 if (!heap_cleanups_)
1908 return;
1909 for (int i = 0; i < heap_cleanups_->size(); i++) {
1910 void (*f)(void) = (*heap_cleanups_)[i];
1911 f();
1913 delete heap_cleanups_;
1914 heap_cleanups_ = NULL;
1917 // Program exit heap cleanup registered as a module object destructor.
1918 // Will not get executed when we crash on a signal.
1920 void HeapLeakChecker_RunHeapCleanups() {
1921 if (FLAGS_heap_check == "local") // don't check heap in this mode
1922 return;
1923 { SpinLockHolder l(&heap_checker_lock);
1924 // can get here (via forks?) with other pids
1925 if (heap_checker_pid != getpid()) return;
1927 HeapCleaner::RunHeapCleanups();
1928 if (!FLAGS_heap_check_after_destructors) HeapLeakChecker::DoMainHeapCheck();
1931 static bool internal_init_start_has_run = false;
1933 // Called exactly once, before main() (but hopefully just before).
1934 // This picks a good unique name for the dumped leak checking heap profiles.
1936 // Because we crash when InternalInitStart is called more than once,
1937 // it's fine that we hold heap_checker_lock only around pieces of
1938 // this function: this is still enough for thread-safety w.r.t. other functions
1939 // of this module.
1940 // We can't hold heap_checker_lock throughout because it would deadlock
1941 // on a memory allocation since our new/delete hooks can be on.
1943 void HeapLeakChecker_InternalInitStart() {
1944 { SpinLockHolder l(&heap_checker_lock);
1945 RAW_CHECK(!internal_init_start_has_run,
1946 "Heap-check constructor called twice. Perhaps you both linked"
1947 " in the heap checker, and also used LD_PRELOAD to load it?");
1948 internal_init_start_has_run = true;
1950 #ifdef ADDRESS_SANITIZER
1951 // AddressSanitizer's custom malloc conflicts with HeapChecker.
1952 FLAGS_heap_check = "";
1953 #endif
1955 if (FLAGS_heap_check.empty()) {
1956 // turns out we do not need checking in the end; can stop profiling
1957 HeapLeakChecker::TurnItselfOffLocked();
1958 return;
1959 } else if (RunningOnValgrind()) {
1960 // There is no point in trying -- we'll just fail.
1961 RAW_LOG(WARNING, "Can't run under Valgrind; will turn itself off");
1962 HeapLeakChecker::TurnItselfOffLocked();
1963 return;
1967 // Changing this to false can be useful when debugging heap-checker itself:
1968 if (!FLAGS_heap_check_run_under_gdb && IsDebuggerAttached()) {
1969 RAW_LOG(WARNING, "Someone is ptrace()ing us; will turn itself off");
1970 SpinLockHolder l(&heap_checker_lock);
1971 HeapLeakChecker::TurnItselfOffLocked();
1972 return;
1975 { SpinLockHolder l(&heap_checker_lock);
1976 if (!constructor_heap_profiling) {
1977 RAW_LOG(FATAL, "Can not start so late. You have to enable heap checking "
1978 "with HEAPCHECK=<mode>.");
1982 // Set all flags
1983 RAW_DCHECK(FLAGS_heap_check_pointer_source_alignment > 0, "");
1984 if (FLAGS_heap_check == "minimal") {
1985 // The least we can check.
1986 FLAGS_heap_check_before_constructors = false; // from after main
1987 // (ignore more)
1988 FLAGS_heap_check_after_destructors = false; // to after cleanup
1989 // (most data is live)
1990 FLAGS_heap_check_ignore_thread_live = true; // ignore all live
1991 FLAGS_heap_check_ignore_global_live = true; // ignore all live
1992 } else if (FLAGS_heap_check == "normal") {
1993 // Faster than 'minimal' and not much stricter.
1994 FLAGS_heap_check_before_constructors = true; // from no profile (fast)
1995 FLAGS_heap_check_after_destructors = false; // to after cleanup
1996 // (most data is live)
1997 FLAGS_heap_check_ignore_thread_live = true; // ignore all live
1998 FLAGS_heap_check_ignore_global_live = true; // ignore all live
1999 } else if (FLAGS_heap_check == "strict") {
2000 // A bit stricter than 'normal': global destructors must fully clean up
2001 // after themselves if they are present.
2002 FLAGS_heap_check_before_constructors = true; // from no profile (fast)
2003 FLAGS_heap_check_after_destructors = true; // to after destructors
2004 // (less data live)
2005 FLAGS_heap_check_ignore_thread_live = true; // ignore all live
2006 FLAGS_heap_check_ignore_global_live = true; // ignore all live
2007 } else if (FLAGS_heap_check == "draconian") {
2008 // Drop not very portable and not very exact live heap flooding.
2009 FLAGS_heap_check_before_constructors = true; // from no profile (fast)
2010 FLAGS_heap_check_after_destructors = true; // to after destructors
2011 // (need them)
2012 FLAGS_heap_check_ignore_thread_live = false; // no live flood (stricter)
2013 FLAGS_heap_check_ignore_global_live = false; // no live flood (stricter)
2014 } else if (FLAGS_heap_check == "as-is") {
2015 // do nothing: use other flags as is
2016 } else if (FLAGS_heap_check == "local") {
2017 // do nothing
2018 } else {
2019 RAW_LOG(FATAL, "Unsupported heap_check flag: %s",
2020 FLAGS_heap_check.c_str());
2022 // FreeBSD doesn't seem to honor atexit execution order:
2023 // http://code.google.com/p/gperftools/issues/detail?id=375
2024 // Since heap-checking before destructors depends on atexit running
2025 // at the right time, on FreeBSD we always check after, even in the
2026 // less strict modes. This just means FreeBSD is always a bit
2027 // stricter in its checking than other OSes.
2028 #ifdef __FreeBSD__
2029 FLAGS_heap_check_after_destructors = true;
2030 #endif
2032 { SpinLockHolder l(&heap_checker_lock);
2033 RAW_DCHECK(heap_checker_pid == getpid(), "");
2034 heap_checker_on = true;
2035 RAW_DCHECK(heap_profile, "");
2036 HeapLeakChecker::ProcMapsResult pm_result = HeapLeakChecker::UseProcMapsLocked(HeapLeakChecker::DISABLE_LIBRARY_ALLOCS);
2037 // might neeed to do this more than once
2038 // if one later dynamically loads libraries that we want disabled
2039 if (pm_result != HeapLeakChecker::PROC_MAPS_USED) { // can't function
2040 HeapLeakChecker::TurnItselfOffLocked();
2041 return;
2045 // make a good place and name for heap profile leak dumps
2046 string* profile_prefix =
2047 new string(FLAGS_heap_check_dump_directory + "/" + invocation_name());
2049 // Finalize prefix for dumping leak checking profiles.
2050 const int32 our_pid = getpid(); // safest to call getpid() outside lock
2051 { SpinLockHolder l(&heap_checker_lock);
2052 // main_thread_pid might still be 0 if this function is being called before
2053 // global constructors. In that case, our pid *is* the main pid.
2054 if (main_thread_pid == 0)
2055 main_thread_pid = our_pid;
2057 char pid_buf[15];
2058 snprintf(pid_buf, sizeof(pid_buf), ".%d", main_thread_pid);
2059 *profile_prefix += pid_buf;
2060 { SpinLockHolder l(&heap_checker_lock);
2061 RAW_DCHECK(profile_name_prefix == NULL, "");
2062 profile_name_prefix = profile_prefix;
2065 // Make sure new/delete hooks are installed properly
2066 // and heap profiler is indeed able to keep track
2067 // of the objects being allocated.
2068 // We test this to make sure we are indeed checking for leaks.
2069 char* test_str = new char[5];
2070 size_t size;
2071 { SpinLockHolder l(&heap_checker_lock);
2072 RAW_CHECK(heap_profile->FindAlloc(test_str, &size),
2073 "our own new/delete not linked?");
2075 delete[] test_str;
2076 { SpinLockHolder l(&heap_checker_lock);
2077 // This check can fail when it should not if another thread allocates
2078 // into this same spot right this moment,
2079 // which is unlikely since this code runs in InitGoogle.
2080 RAW_CHECK(!heap_profile->FindAlloc(test_str, &size),
2081 "our own new/delete not linked?");
2083 // If we crash in the above code, it probably means that
2084 // "nm <this_binary> | grep new" will show that tcmalloc's new/delete
2085 // implementation did not get linked-in into this binary
2086 // (i.e. nm will list __builtin_new and __builtin_vec_new as undefined).
2087 // If this happens, it is a BUILD bug to be fixed.
2089 RAW_VLOG(heap_checker_info_level,
2090 "WARNING: Perftools heap leak checker is active "
2091 "-- Performance may suffer");
2093 if (FLAGS_heap_check != "local") {
2094 HeapLeakChecker* main_hc = new HeapLeakChecker();
2095 SpinLockHolder l(&heap_checker_lock);
2096 RAW_DCHECK(main_heap_checker == NULL,
2097 "Repeated creation of main_heap_checker");
2098 main_heap_checker = main_hc;
2099 do_main_heap_check = true;
2102 { SpinLockHolder l(&heap_checker_lock);
2103 RAW_CHECK(heap_checker_on && constructor_heap_profiling,
2104 "Leak checking is expected to be fully turned on now");
2107 // For binaries built in debug mode, this will set release queue of
2108 // debugallocation.cc to 100M to make it less likely for real leaks to
2109 // be hidden due to reuse of heap memory object addresses.
2110 // Running a test with --malloc_reclaim_memory=0 would help find leaks even
2111 // better, but the test might run out of memory as a result.
2112 // The scenario is that a heap object at address X is allocated and freed,
2113 // but some other data-structure still retains a pointer to X.
2114 // Then the same heap memory is used for another object, which is leaked,
2115 // but the leak is not noticed due to the pointer to the original object at X.
2116 // TODO(csilvers): support this in some manner.
2117 #if 0
2118 SetCommandLineOptionWithMode("max_free_queue_size", "104857600", // 100M
2119 SET_FLAG_IF_DEFAULT);
2120 #endif
2123 // We want this to run early as well, but not so early as
2124 // ::BeforeConstructors (we want flag assignments to have already
2125 // happened, for instance). Initializer-registration does the trick.
2126 REGISTER_MODULE_INITIALIZER(init_start, HeapLeakChecker_InternalInitStart());
2127 REGISTER_MODULE_DESTRUCTOR(init_start, HeapLeakChecker_RunHeapCleanups());
2129 // static
2130 bool HeapLeakChecker::NoGlobalLeaksMaybeSymbolize(
2131 ShouldSymbolize should_symbolize) {
2132 // we never delete or change main_heap_checker once it's set:
2133 HeapLeakChecker* main_hc = GlobalChecker();
2134 if (main_hc) {
2135 RAW_VLOG(10, "Checking for whole-program memory leaks");
2136 return main_hc->DoNoLeaks(should_symbolize);
2138 return true;
2141 // static
2142 bool HeapLeakChecker::DoMainHeapCheck() {
2143 if (FLAGS_heap_check_delay_seconds > 0) {
2144 sleep(FLAGS_heap_check_delay_seconds);
2146 { SpinLockHolder l(&heap_checker_lock);
2147 if (!do_main_heap_check) return false;
2148 RAW_DCHECK(heap_checker_pid == getpid(), "");
2149 do_main_heap_check = false; // will do it now; no need to do it more
2152 // The program is over, so it's safe to symbolize addresses (which
2153 // requires a fork) because no serious work is expected to be done
2154 // after this. Symbolizing is really useful -- knowing what
2155 // function has a leak is better than knowing just an address --
2156 // and while we can only safely symbolize once in a program run,
2157 // now is the time (after all, there's no "later" that would be better).
2158 if (!NoGlobalLeaksMaybeSymbolize(SYMBOLIZE)) {
2159 if (FLAGS_heap_check_identify_leaks) {
2160 RAW_LOG(FATAL, "Whole-program memory leaks found.");
2162 RAW_LOG(ERROR, "Exiting with error code (instead of crashing) "
2163 "because of whole-program memory leaks");
2164 // We don't want to call atexit() routines!
2165 _exit(FLAGS_heap_check_error_exit_code);
2167 return true;
2170 // static
2171 HeapLeakChecker* HeapLeakChecker::GlobalChecker() {
2172 SpinLockHolder l(&heap_checker_lock);
2173 return main_heap_checker;
2176 // static
2177 bool HeapLeakChecker::NoGlobalLeaks() {
2178 // symbolizing requires a fork, which isn't safe to do in general.
2179 return NoGlobalLeaksMaybeSymbolize(DO_NOT_SYMBOLIZE);
2182 // static
2183 void HeapLeakChecker::CancelGlobalCheck() {
2184 SpinLockHolder l(&heap_checker_lock);
2185 if (do_main_heap_check) {
2186 RAW_VLOG(heap_checker_info_level,
2187 "Canceling the automatic at-exit whole-program memory leak check");
2188 do_main_heap_check = false;
2192 // static
2193 void HeapLeakChecker::BeforeConstructorsLocked() {
2194 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
2195 RAW_CHECK(!constructor_heap_profiling,
2196 "BeforeConstructorsLocked called multiple times");
2197 #ifdef ADDRESS_SANITIZER
2198 // AddressSanitizer's custom malloc conflicts with HeapChecker.
2199 return;
2200 #endif
2201 // Set hooks early to crash if 'new' gets called before we make heap_profile,
2202 // and make sure no other hooks existed:
2203 RAW_CHECK(MallocHook::AddNewHook(&NewHook), "");
2204 RAW_CHECK(MallocHook::AddDeleteHook(&DeleteHook), "");
2205 constructor_heap_profiling = true;
2206 MemoryRegionMap::Init(1, /* use_buckets */ false);
2207 // Set up MemoryRegionMap with (at least) one caller stack frame to record
2208 // (important that it's done before HeapProfileTable creation below).
2209 Allocator::Init();
2210 RAW_CHECK(heap_profile == NULL, "");
2211 heap_profile = new(Allocator::Allocate(sizeof(HeapProfileTable)))
2212 HeapProfileTable(&Allocator::Allocate, &Allocator::Free,
2213 /* profile_mmap */ false);
2214 RAW_VLOG(10, "Starting tracking the heap");
2215 heap_checker_on = true;
2218 // static
2219 void HeapLeakChecker::TurnItselfOffLocked() {
2220 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
2221 // Set FLAGS_heap_check to "", for users who test for it
2222 if (!FLAGS_heap_check.empty()) // be a noop in the common case
2223 FLAGS_heap_check.clear(); // because clear() could allocate memory
2224 if (constructor_heap_profiling) {
2225 RAW_CHECK(heap_checker_on, "");
2226 RAW_VLOG(heap_checker_info_level, "Turning perftools heap leak checking off");
2227 heap_checker_on = false;
2228 // Unset our hooks checking they were set:
2229 RAW_CHECK(MallocHook::RemoveNewHook(&NewHook), "");
2230 RAW_CHECK(MallocHook::RemoveDeleteHook(&DeleteHook), "");
2231 Allocator::DeleteAndNull(&heap_profile);
2232 // free our optional global data:
2233 Allocator::DeleteAndNullIfNot(&ignored_objects);
2234 Allocator::DeleteAndNullIfNot(&disabled_ranges);
2235 Allocator::DeleteAndNullIfNot(&global_region_caller_ranges);
2236 Allocator::Shutdown();
2237 MemoryRegionMap::Shutdown();
2239 RAW_CHECK(!heap_checker_on, "");
2242 extern bool heap_leak_checker_bcad_variable; // in heap-checker-bcad.cc
2244 static bool has_called_before_constructors = false;
2246 // TODO(maxim): inline this function with
2247 // MallocHook_InitAtFirstAllocation_HeapLeakChecker, and also rename
2248 // HeapLeakChecker::BeforeConstructorsLocked.
2249 void HeapLeakChecker_BeforeConstructors() {
2250 SpinLockHolder l(&heap_checker_lock);
2251 // We can be called from several places: the first mmap/sbrk/alloc call
2252 // or the first global c-tor from heap-checker-bcad.cc:
2253 // Do not re-execute initialization:
2254 if (has_called_before_constructors) return;
2255 has_called_before_constructors = true;
2257 heap_checker_pid = getpid(); // set it always
2258 heap_leak_checker_bcad_variable = true;
2259 // just to reference it, so that heap-checker-bcad.o is linked in
2261 // This function can be called *very* early, before the normal
2262 // global-constructor that sets FLAGS_verbose. Set it manually now,
2263 // so the RAW_LOG messages here are controllable.
2264 const char* verbose_str = GetenvBeforeMain("PERFTOOLS_VERBOSE");
2265 if (verbose_str && atoi(verbose_str)) { // different than the default of 0?
2266 FLAGS_verbose = atoi(verbose_str);
2269 bool need_heap_check = true;
2270 // The user indicates a desire for heap-checking via the HEAPCHECK
2271 // environment variable. If it's not set, there's no way to do
2272 // heap-checking.
2273 if (!GetenvBeforeMain("HEAPCHECK")) {
2274 need_heap_check = false;
2276 #ifdef HAVE_GETEUID
2277 if (need_heap_check && getuid() != geteuid()) {
2278 // heap-checker writes out files. Thus, for security reasons, we don't
2279 // recognize the env. var. to turn on heap-checking if we're setuid.
2280 RAW_LOG(WARNING, ("HeapChecker: ignoring HEAPCHECK because "
2281 "program seems to be setuid\n"));
2282 need_heap_check = false;
2284 #endif
2285 if (need_heap_check) {
2286 HeapLeakChecker::BeforeConstructorsLocked();
2290 // This function overrides the weak function defined in malloc_hook.cc and
2291 // called by one of the initial malloc hooks (malloc_hook.cc) when the very
2292 // first memory allocation or an mmap/sbrk happens. This ensures that
2293 // HeapLeakChecker is initialized and installs all its hooks early enough to
2294 // track absolutely all memory allocations and all memory region acquisitions
2295 // via mmap and sbrk.
2296 extern "C" void MallocHook_InitAtFirstAllocation_HeapLeakChecker() {
2297 HeapLeakChecker_BeforeConstructors();
2300 // This function is executed after all global object destructors run.
2301 void HeapLeakChecker_AfterDestructors() {
2302 { SpinLockHolder l(&heap_checker_lock);
2303 // can get here (via forks?) with other pids
2304 if (heap_checker_pid != getpid()) return;
2306 if (FLAGS_heap_check_after_destructors) {
2307 if (HeapLeakChecker::DoMainHeapCheck()) {
2308 const struct timespec sleep_time = { 0, 500000000 }; // 500 ms
2309 nanosleep(&sleep_time, NULL);
2310 // Need this hack to wait for other pthreads to exit.
2311 // Otherwise tcmalloc find errors
2312 // on a free() call from pthreads.
2315 SpinLockHolder l(&heap_checker_lock);
2316 RAW_CHECK(!do_main_heap_check, "should have done it");
2319 //----------------------------------------------------------------------
2320 // HeapLeakChecker disabling helpers
2321 //----------------------------------------------------------------------
2323 // These functions are at the end of the file to prevent their inlining:
2325 // static
2326 void HeapLeakChecker::DisableChecksFromToLocked(const void* start_address,
2327 const void* end_address,
2328 int max_depth) {
2329 RAW_DCHECK(heap_checker_lock.IsHeld(), "");
2330 RAW_DCHECK(start_address < end_address, "");
2331 if (disabled_ranges == NULL) {
2332 disabled_ranges = new(Allocator::Allocate(sizeof(DisabledRangeMap)))
2333 DisabledRangeMap;
2335 RangeValue value;
2336 value.start_address = AsInt(start_address);
2337 value.max_depth = max_depth;
2338 if (disabled_ranges->insert(make_pair(AsInt(end_address), value)).second) {
2339 RAW_VLOG(10, "Disabling leak checking in stack traces "
2340 "under frame addresses between %p..%p",
2341 start_address, end_address);
2342 } else { // check that this is just a verbatim repetition
2343 RangeValue const& val = disabled_ranges->find(AsInt(end_address))->second;
2344 if (val.max_depth != value.max_depth ||
2345 val.start_address != value.start_address) {
2346 RAW_LOG(FATAL, "Two DisableChecksToHereFrom calls conflict: "
2347 "(%p, %p, %d) vs. (%p, %p, %d)",
2348 AsPtr(val.start_address), end_address, val.max_depth,
2349 start_address, end_address, max_depth);
2354 // static
2355 inline bool HeapLeakChecker::HaveOnHeapLocked(const void** ptr,
2356 size_t* object_size) {
2357 // Commented-out because HaveOnHeapLocked is very performance-critical:
2358 // RAW_DCHECK(heap_checker_lock.IsHeld(), "");
2359 const uintptr_t addr = AsInt(*ptr);
2360 if (heap_profile->FindInsideAlloc(
2361 *ptr, max_heap_object_size, ptr, object_size)) {
2362 RAW_VLOG(16, "Got pointer into %p at +%"PRIuPTR" offset",
2363 *ptr, addr - AsInt(*ptr));
2364 return true;
2366 return false;
2369 // static
2370 const void* HeapLeakChecker::GetAllocCaller(void* ptr) {
2371 // this is used only in the unittest, so the heavy checks are fine
2372 HeapProfileTable::AllocInfo info;
2373 { SpinLockHolder l(&heap_checker_lock);
2374 RAW_CHECK(heap_profile->FindAllocDetails(ptr, &info), "");
2376 RAW_CHECK(info.stack_depth >= 1, "");
2377 return info.call_stack[0];