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.
17//
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.
29
30// ---
31// All Rights Reserved.
32//
33// Author: Maxim Lifantsev
34//
35
36#include "config.h"
37
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>
54
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
68
69#include <string>
70#include <vector>
71#include <map>
72#include <set>
73#include <algorithm>
74#include <functional>
75
76#include <gperftools/heap-checker.h>
77
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"
95
96using std::string;
97using std::basic_string;
98using std::pair;
99using std::map;
100using std::set;
101using std::vector;
102using std::swap;
103using std::make_pair;
104using std::min;
105using std::max;
106using std::less;
107using std::char_traits;
108
109// If current process is being ptrace()d, 'TracerPid' in /proc/self/status
110// will be non-zero.
111static 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.
116  }
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);
125    }
126  }
127  close(fd);
128  return rc;
129}
130
131// This is the default if you don't link in -lprofiler
132extern "C" {
133ATTRIBUTE_WEAK PERFTOOLS_DLL_DECL bool ProfilingIsEnabledForAllThreads();
134bool ProfilingIsEnabledForAllThreads() { return false; }
135}
136
137//----------------------------------------------------------------------
138// Flags that control heap-checking
139//----------------------------------------------------------------------
140
141DEFINE_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.)");
148
149DEFINE_bool(heap_check_report, true, "Obsolete");
150
151DEFINE_bool(heap_check_before_constructors,
152            true,
153            "deprecated; pretty much always true now");
154
155DEFINE_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");
159
160DEFINE_bool(heap_check_strict_check, true, "Obsolete");
161
162DEFINE_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");
166
167DEFINE_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.");
173
174DEFINE_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");
178
179DEFINE_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");
183
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.
188static const size_t kPointerSourceAlignment = sizeof(void*);
189DEFINE_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.");
194
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.
202static const int64 kHeapCheckMaxPointerOffset = 1024;
203DEFINE_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.");
209
210DEFINE_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)");
214
215DEFINE_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).");
225
226DEFINE_int32(heap_check_error_exit_code,
227             EnvToInt("HEAP_CHECK_ERROR_EXIT_CODE", 1),
228             "Exit code to return if any leaks were detected.");
229
230//----------------------------------------------------------------------
231
232DEFINE_string(heap_profile_pprof,
233              EnvToString("PPROF_PATH", "pprof"),
234              "OBSOLETE; not used");
235
236DEFINE_string(heap_check_dump_directory,
237              EnvToString("HEAP_CHECK_DUMP_DIRECTORY", "/tmp"),
238              "Directory to put heap-checker leak dump information");
239
240
241//----------------------------------------------------------------------
242// HeapLeakChecker global data
243//----------------------------------------------------------------------
244
245// Global lock for all the global data of this module.
246static SpinLock heap_checker_lock(SpinLock::LINKER_INITIALIZED);
247
248//----------------------------------------------------------------------
249
250// Heap profile prefix for leak checking profiles.
251// Gets assigned once when leak checking is turned on, then never modified.
252static const string* profile_name_prefix = NULL;
253
254// Whole-program heap leak checker.
255// Gets assigned once when leak checking is turned on,
256// then main_heap_checker is never deleted.
257static HeapLeakChecker* main_heap_checker = NULL;
258
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().
262static bool do_main_heap_check = false;
263
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.
269static HeapProfileTable* heap_profile = NULL;
270
271// If we are doing (or going to do) any kind of heap-checking.
272static bool heap_checker_on = false;
273
274// pid of the process that does whole-program heap leak checking
275static pid_t heap_checker_pid = 0;
276
277// If we did heap profiling during global constructors execution
278static bool constructor_heap_profiling = false;
279
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.
282static const int heap_checker_info_level = 0;
283
284//----------------------------------------------------------------------
285// HeapLeakChecker's own memory allocator that is
286// independent of the normal program allocator.
287//----------------------------------------------------------------------
288
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.
295class 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());
301  }
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_);
306    }
307  }
308  static int alloc_count() {
309    RAW_DCHECK(heap_checker_lock.IsHeld(), "");
310    return alloc_count_;
311  }
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;
317  }
318  static void Free(void* p) {
319    RAW_DCHECK(heap_checker_lock.IsHeld(), "");
320    if (p) alloc_count_ -= 1;
321    LowLevelAlloc::Free(p);
322  }
323  static void Free(void* p, size_t /* n */) {
324    Free(p);
325  }
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;
331  }
332  template<typename T> static void DeleteAndNullIfNot(T** p) {
333    if (*p != NULL) DeleteAndNull(p);
334  }
335 private:
336  static LowLevelAlloc::Arena* arena_;
337  static int alloc_count_;
338};
339
340LowLevelAlloc::Arena* HeapLeakChecker::Allocator::arena_ = NULL;
341int HeapLeakChecker::Allocator::alloc_count_ = 0;
342
343//----------------------------------------------------------------------
344// HeapLeakChecker live object tracking components
345//----------------------------------------------------------------------
346
347// Cases of live object placement we distinguish
348enum 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
356};
357
358// Information about an allocated object
359struct AllocObject {
360  const void* ptr;        // the object
361  uintptr_t size;         // its size
362  ObjectPlacement place;  // where ptr points to
363
364  AllocObject(const void* p, size_t s, ObjectPlacement l)
365    : ptr(p), size(s), place(l) { }
366};
367
368// All objects (memory ranges) ignored via HeapLeakChecker::IgnoreObject
369// Key is the object's address; value is its size.
370typedef map<uintptr_t, size_t, less<uintptr_t>,
371            STL_Allocator<pair<const uintptr_t, size_t>,
372                          HeapLeakChecker::Allocator>
373           > IgnoredObjectsMap;
374static IgnoredObjectsMap* ignored_objects = NULL;
375
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.
385typedef vector<AllocObject,
386               STL_Allocator<AllocObject, HeapLeakChecker::Allocator>
387              > LiveObjectsStack;
388static LiveObjectsStack* live_objects = NULL;
389
390// A special string type that uses my allocator
391typedef basic_string<char, char_traits<char>,
392                     STL_Allocator<char, HeapLeakChecker::Allocator>
393                    > HCL_string;
394
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.
397typedef map<HCL_string, LiveObjectsStack, less<HCL_string>,
398            STL_Allocator<pair<const HCL_string, LiveObjectsStack>,
399                          HeapLeakChecker::Allocator>
400           > LibraryLiveObjectsStacks;
401static LibraryLiveObjectsStacks* library_live_objects = NULL;
402
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.
407struct HeapLeakChecker::RangeValue {
408  uintptr_t start_address;  // the start of the range
409  int       max_depth;      // the maximal stack depth to disable at
410};
411typedef 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.
417static DisabledRangeMap* disabled_ranges = NULL;
418
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.
423typedef set<uintptr_t, less<uintptr_t>,
424            STL_Allocator<uintptr_t, HeapLeakChecker::Allocator>
425           > StackTopSet;
426static StackTopSet* stack_tops = NULL;
427
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.
432typedef map<uintptr_t, uintptr_t, less<uintptr_t>,
433            STL_Allocator<pair<const uintptr_t, uintptr_t>,
434                          HeapLeakChecker::Allocator>
435           > GlobalRegionCallerRangeMap;
436static GlobalRegionCallerRangeMap* global_region_caller_ranges = NULL;
437
438// TODO(maxim): make our big data structs into own modules
439
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.
443
444#ifdef HAVE_TLS
445
446static __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
454    ;
455inline int get_thread_disable_counter() {
456  return thread_disable_counter;
457}
458inline void set_thread_disable_counter(int value) {
459  thread_disable_counter = value;
460}
461
462#else  // #ifdef HAVE_TLS
463
464static pthread_key_t thread_disable_counter_key;
465static int main_thread_counter;   // storage for use before main()
466static bool use_main_thread_counter = true;
467
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!
471inline 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*
476}
477
478inline 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;
482  }
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);
491}
492
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.
496class 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;
504  }
505};
506InitThreadDisableCounter init_thread_disable_counter;
507
508#endif  // #ifdef HAVE_TLS
509
510HeapLeakChecker::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);
517}
518
519HeapLeakChecker::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);
527  }
528}
529
530//----------------------------------------------------------------------
531
532// The size of the largest heap object allocated so far.
533static 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.
536static uintptr_t min_heap_address = uintptr_t(-1LL);
537static uintptr_t max_heap_address = 0;
538
539//----------------------------------------------------------------------
540
541// Simple casting helpers for uintptr_t and void*:
542template<typename T>
543inline static const void* AsPtr(T addr) {
544  return reinterpret_cast<void*>(addr);
545}
546inline static uintptr_t AsInt(const void* ptr) {
547  return reinterpret_cast<uintptr_t>(ptr);
548}
549
550//----------------------------------------------------------------------
551
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.
556static 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;
562    }
563  }
564  return NULL;
565}
566
567//----------------------------------------------------------------------
568
569// Our hooks for MallocHook
570static 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));
576
577    // Fetch the caller's stack trace before acquiring heap_checker_lock.
578    void* stack[HeapProfileTable::kMaxStackDepth];
579    int depth = HeapProfileTable::GetCallerStackTrace(0, stack);
580
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);
591        }
592      }
593    }
594    RAW_VLOG(17, "Alloc Recorded: %p of %"PRIuS"", ptr, size);
595  }
596}
597
598static 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);
603    }
604    RAW_VLOG(17, "Free Recorded: %p", ptr);
605  }
606}
607
608//----------------------------------------------------------------------
609
610enum StackDirection {
611  GROWS_TOWARDS_HIGH_ADDRESSES,
612  GROWS_TOWARDS_LOW_ADDRESSES,
613  UNKNOWN_DIRECTION
614};
615
616// Determine which way the stack grows:
617
618static 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;
625
626  RAW_CHECK(0, "");  // Couldn't determine the stack direction.
627
628  return UNKNOWN_DIRECTION;
629}
630
631// Direction of stack growth (will initialize via GetStackDirection())
632static StackDirection stack_direction = UNKNOWN_DIRECTION;
633
634// This routine is called for every thread stack we know about to register it.
635static 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
641
642  // make sure stack_direction is initialized
643  if (stack_direction == UNKNOWN_DIRECTION) {
644    stack_direction = GetStackDirection(&top);
645  }
646
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));
663    }
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;
688            }
689            if (stack_start < r->end_addr  &&  r->end_addr <= top) {
690              stack_start = r->end_addr;
691            }
692          }
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));
696          }
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));
708          }
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));
714          }
715          if (stack_end != end) {
716            lib->second.push_back(AllocObject(AsPtr(stack_end), end - stack_end,
717                                  MAYBE_LIVE));
718          }
719          return;
720        }
721      }
722    }
723    RAW_LOG(ERROR, "Memory region for stack at %p not found. "
724                   "Will likely report false leak positives.", top_ptr);
725  }
726}
727
728// Iterator for heap allocation map data to make ignored objects "live"
729// (i.e., treated as roots for the mark-and-sweep phase)
730static 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));
736  }
737}
738
739// Iterator for heap allocation map data to make objects allocated from
740// disabled regions of code to be live.
741static 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;
757        }
758      }
759    }
760  }
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;
782      }
783    }
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));
788  }
789}
790
791static const char kUnnamedProcSelfMapEntry[] = "UNNAMED";
792
793// This function takes some fields from a /proc/self/maps line:
794//
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
799//
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.
803static 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;
812  }
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));
819}
820
821// See if 'library' from /proc/self/maps has base name 'library_base'
822// i.e. contains it and has '.' or '-' after it.
823static 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] == '-');
827}
828
829// static
830void 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.
855     ) {
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
860            ) {
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.
874  }
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;
887      }
888      global_region_caller_ranges
889        ->insert(make_pair(end_address, start_address));
890    }
891  }
892}
893
894// static
895HeapLeakChecker::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;
906  }
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.");
921      }
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;
927    }
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;
935    }
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;
944      }
945    }
946
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);
954        }
955        break;
956      case RECORD_GLOBAL_DATA:
957        RecordGlobalDataLocked(start_address, end_address,
958                               permissions, filename);
959        break;
960      default:
961        RAW_CHECK(0, "");
962    }
963  }
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;
969  }
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;
974  }
975  return PROC_MAPS_USED;
976}
977
978// Total number and size of live objects dropped from the profile;
979// (re)initialized in IgnoreAllLiveObjectsLocked.
980static int64 live_objects_total;
981static int64 live_bytes_total;
982
983// pid of the thread that is doing the current leak check
984// (protected by our lock; IgnoreAllLiveObjectsLocked sets it)
985static pid_t self_thread_pid = 0;
986
987// Status of our thread listing callback execution
988// (protected by our lock; used from within IgnoreAllLiveObjectsLocked)
989static enum {
990  CALLBACK_NOT_STARTED,
991  CALLBACK_STARTED,
992  CALLBACK_COMPLETED,
993} thread_listing_status = CALLBACK_NOT_STARTED;
994
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.
999//
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.
1002//
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.
1008//
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).
1014//
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());
1022
1023  if (FLAGS_heap_check_ignore_global_live) {
1024    UseProcMapsLocked(RECORD_GLOBAL_DATA);
1025  }
1026
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;
1030
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);
1055      }
1056    } else {
1057      failures += 1;
1058    }
1059#else
1060    failures += 1;
1061#endif
1062  }
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", "");
1074  }
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;
1081}
1082
1083// Stack top of the thread that is doing the current leak check
1084// (protected by our lock; IgnoreAllLiveObjectsLocked sets it)
1085static const void* self_thread_stack_top;
1086
1087// static
1088void 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:
1093
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", "");
1099
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);
1116      }
1117    }
1118    IgnoreLiveObjectsLocked("ignored objects", "");
1119  }
1120
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", "");
1127
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", "");
1136
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;
1175              }
1176            }
1177          }
1178        }
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));
1209            }
1210          }
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();
1215        }
1216      }
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);
1223        }
1224      }
1225      live_objects->swap(l->second);
1226      IgnoreLiveObjectsLocked("in globals of\n  ", l->first.c_str());
1227    }
1228    if (have_null_region_callers) {
1229      RAW_LOG(ERROR, "Have memory regions w/o callers: "
1230                     "might report false leaks");
1231    }
1232    Allocator::DeleteAndNull(&library_live_objects);
1233  }
1234}
1235
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.
1241static 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!");
1246  }
1247  ResumeAllProcessThreads(num_threads, thread_pids);
1248  return num_threads;
1249}
1250
1251// Dummy for IgnoreAllLiveObjectsLocked below.
1252// Making it global helps with compiler warnings.
1253static va_list dummy_ap;
1254
1255// static
1256void 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;
1280  }
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.");
1321      }
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");
1327    }
1328  } else {
1329    RAW_LOG(WARNING, "Not looking for thread stacks; "
1330                     "objects reachable only from there "
1331                     "will be reported as leaks");
1332  }
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);
1338    }
1339    IgnoreNonThreadLiveObjectsLocked();
1340  }
1341  if (live_objects_total) {
1342    RAW_VLOG(10, "Ignoring %"PRId64" reachable objects of %"PRId64" bytes",
1343                live_objects_total, live_bytes_total);
1344  }
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
1349}
1350
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.
1354static size_t pointer_source_alignment = kPointerSourceAlignment;
1355// Global lock for HeapLeakChecker::DoNoLeaks
1356// to protect pointer_source_alignment.
1357static SpinLock alignment_checker_lock(SpinLock::LINKER_INITIALIZED);
1358
1359// This function changes the live bits in the heap_profile-table's state:
1360// we only record the live objects to be skipped.
1361//
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.
1385//
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;
1400    }
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;
1413      }
1414    }
1415    if (size < sizeof(void*)) continue;
1416
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.
1426        //
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;
1436        }
1437      }
1438    }
1439#endif
1440
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]);
1484            }
1485          }
1486          live_object_count += 1;
1487          live_byte_count += object_size;
1488          live_objects->push_back(AllocObject(ptr, object_size,
1489                                              IGNORED_ON_HEAP));
1490        }
1491      }
1492      object += pointer_source_alignment;
1493    }
1494  }
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);
1500  }
1501}
1502
1503//----------------------------------------------------------------------
1504// HeapLeakChecker leak check disabling components
1505//----------------------------------------------------------------------
1506
1507// static
1508void HeapLeakChecker::DisableChecksIn(const char* pattern) {
1509  RAW_LOG(WARNING, "DisableChecksIn(%s) is ignored", pattern);
1510}
1511
1512// static
1513void 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;
1525    }
1526    if (!ignored_objects->insert(make_pair(AsInt(ptr), object_size)).second) {
1527      RAW_LOG(WARNING, "Object at %p is already being ignored", ptr);
1528    }
1529  }
1530}
1531
1532// static
1533void 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);
1548      }
1549    }
1550    if (!found)  RAW_LOG(FATAL, "Object at %p has not been ignored", ptr);
1551  }
1552}
1553
1554//----------------------------------------------------------------------
1555// HeapLeakChecker non-static functions
1556//----------------------------------------------------------------------
1557
1558char* 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;
1568}
1569
1570void 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();
1590      }
1591
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");
1602    }
1603  }
1604  if (name_ == NULL) {
1605    UnIgnoreObject(n);
1606    delete[] n;  // must be done after we unlock
1607  }
1608}
1609
1610HeapLeakChecker::HeapLeakChecker(const char *name) : lock_(new SpinLock) {
1611  RAW_DCHECK(strcmp(name, "_main_") != 0, "_main_ is reserved");
1612  Create(name, true/*create start_snapshot_*/);
1613}
1614
1615HeapLeakChecker::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);
1628  }
1629}
1630
1631ssize_t HeapLeakChecker::BytesLeaked() const {
1632  SpinLockHolder l(lock_);
1633  if (!has_checked_) {
1634    RAW_LOG(FATAL, "*NoLeaks|SameHeap must execute before this call");
1635  }
1636  return inuse_bytes_increase_;
1637}
1638
1639ssize_t HeapLeakChecker::ObjectsLeaked() const {
1640  SpinLockHolder l(lock_);
1641  if (!has_checked_) {
1642    RAW_LOG(FATAL, "*NoLeaks|SameHeap must execute before this call");
1643  }
1644  return inuse_allocs_increase_;
1645}
1646
1647// Save pid of main thread for using in naming dump files
1648static int32 main_thread_pid = getpid();
1649#ifdef HAVE_PROGRAM_INVOCATION_NAME
1650extern char* program_invocation_name;
1651extern char* program_invocation_short_name;
1652static const char* invocation_name() { return program_invocation_short_name; }
1653static string invocation_path() { return program_invocation_name; }
1654#else
1655static const char* invocation_name() { return "<your binary>"; }
1656static string invocation_path() { return "<your binary>"; }
1657#endif
1658
1659// Prints commands that users can run to get more information
1660// about the reported leaks.
1661static 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;
1666
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";
1673
1674  // Extra command for fetching remote data
1675  string fetch_cmd;
1676
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()
1698          );
1699}
1700
1701bool 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);
1706
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.");
1716  }
1717
1718  HeapProfileTable::Snapshot* leaks = NULL;
1719  char* pprof_file = NULL;
1720
1721  {
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_);
1730      }
1731      return true;
1732    }
1733
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, "");
1740
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();
1744
1745    if (name_ == NULL) {
1746      RAW_LOG(FATAL, "Heap leak checker must not be turned on "
1747              "after construction of a HeapLeakChecker");
1748    }
1749
1750    MemoryRegionMap::LockHolder ml;
1751    int a_local_var;  // Use our stack ptr to make stack data live:
1752
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);
1760
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;
1766
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());
1775      }
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.");
1796        }
1797        heap_profile->ReleaseSnapshot(leaks_wo_align);
1798      }
1799    }
1800
1801    if (leaks != NULL) {
1802      pprof_file = MakeProfileNameLocked();
1803    }
1804  }
1805
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?");
1815    }
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);
1847    }
1848    if (FLAGS_heap_check_identify_leaks) {
1849      leaks->ReportIndividualObjects();
1850    }
1851
1852    SuggestPprofCommand(pprof_file);
1853
1854    {
1855      SpinLockHolder hl(&heap_checker_lock);
1856      heap_profile->ReleaseSnapshot(leaks);
1857      Allocator::Free(pprof_file);
1858    }
1859  }
1860
1861  return (leaks == NULL);
1862}
1863
1864HeapLeakChecker::~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");
1869    }
1870
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_));
1876    }
1877
1878    UnIgnoreObject(name_);
1879    delete[] name_;
1880    name_ = NULL;
1881  }
1882  delete lock_;
1883}
1884
1885//----------------------------------------------------------------------
1886// HeapLeakChecker overall heap check components
1887//----------------------------------------------------------------------
1888
1889// static
1890bool HeapLeakChecker::IsActive() {
1891  SpinLockHolder l(&heap_checker_lock);
1892  return heap_checker_on;
1893}
1894
1895vector<HeapCleaner::void_function>* HeapCleaner::heap_cleanups_ = NULL;
1896
1897// When a HeapCleaner object is intialized, add its function to the static list
1898// of cleaners to be run before leaks checking.
1899HeapCleaner::HeapCleaner(void_function f) {
1900  if (heap_cleanups_ == NULL)
1901    heap_cleanups_ = new vector<HeapCleaner::void_function>;
1902  heap_cleanups_->push_back(f);
1903}
1904
1905// Run all of the cleanup functions and delete the vector.
1906void 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();
1912  }
1913  delete heap_cleanups_;
1914  heap_cleanups_ = NULL;
1915}
1916
1917// Program exit heap cleanup registered as a module object destructor.
1918// Will not get executed when we crash on a signal.
1919//
1920void 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;
1926  }
1927  HeapCleaner::RunHeapCleanups();
1928  if (!FLAGS_heap_check_after_destructors) HeapLeakChecker::DoMainHeapCheck();
1929}
1930
1931static bool internal_init_start_has_run = false;
1932
1933// Called exactly once, before main() (but hopefully just before).
1934// This picks a good unique name for the dumped leak checking heap profiles.
1935//
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.
1942//
1943void 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;
1949
1950#ifdef ADDRESS_SANITIZER
1951    // AddressSanitizer's custom malloc conflicts with HeapChecker.
1952    FLAGS_heap_check = "";
1953#endif
1954
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;
1964    }
1965  }
1966
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;
1973  }
1974
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>.");
1979    }
1980  }
1981
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());
2021  }
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
2031
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;
2042    }
2043  }
2044
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());
2048
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;
2056  }
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;
2063  }
2064
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?");
2074  }
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?");
2082  }
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.
2088
2089  RAW_VLOG(heap_checker_info_level,
2090           "WARNING: Perftools heap leak checker is active "
2091           "-- Performance may suffer");
2092
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;
2100  }
2101
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");
2105  }
2106
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
2121}
2122
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.
2126REGISTER_MODULE_INITIALIZER(init_start, HeapLeakChecker_InternalInitStart());
2127REGISTER_MODULE_DESTRUCTOR(init_start, HeapLeakChecker_RunHeapCleanups());
2128
2129// static
2130bool 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);
2137  }
2138  return true;
2139}
2140
2141// static
2142bool HeapLeakChecker::DoMainHeapCheck() {
2143  if (FLAGS_heap_check_delay_seconds > 0) {
2144    sleep(FLAGS_heap_check_delay_seconds);
2145  }
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
2150  }
2151
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.");
2161    }
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);
2166  }
2167  return true;
2168}
2169
2170// static
2171HeapLeakChecker* HeapLeakChecker::GlobalChecker() {
2172  SpinLockHolder l(&heap_checker_lock);
2173  return main_heap_checker;
2174}
2175
2176// static
2177bool HeapLeakChecker::NoGlobalLeaks() {
2178  // symbolizing requires a fork, which isn't safe to do in general.
2179  return NoGlobalLeaksMaybeSymbolize(DO_NOT_SYMBOLIZE);
2180}
2181
2182// static
2183void 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;
2189  }
2190}
2191
2192// static
2193void 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;
2216}
2217
2218// static
2219void 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();
2238  }
2239  RAW_CHECK(!heap_checker_on, "");
2240}
2241
2242extern bool heap_leak_checker_bcad_variable;  // in heap-checker-bcad.cc
2243
2244static bool has_called_before_constructors = false;
2245
2246// TODO(maxim): inline this function with
2247// MallocHook_InitAtFirstAllocation_HeapLeakChecker, and also rename
2248// HeapLeakChecker::BeforeConstructorsLocked.
2249void 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;
2256
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
2260
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);
2267  }
2268
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;
2275  }
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;
2283  }
2284#endif
2285  if (need_heap_check) {
2286    HeapLeakChecker::BeforeConstructorsLocked();
2287  }
2288}
2289
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.
2296extern "C" void MallocHook_InitAtFirstAllocation_HeapLeakChecker() {
2297  HeapLeakChecker_BeforeConstructors();
2298}
2299
2300// This function is executed after all global object destructors run.
2301void HeapLeakChecker_AfterDestructors() {
2302  { SpinLockHolder l(&heap_checker_lock);
2303    // can get here (via forks?) with other pids
2304    if (heap_checker_pid != getpid()) return;
2305  }
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.
2313    }
2314  }
2315  SpinLockHolder l(&heap_checker_lock);
2316  RAW_CHECK(!do_main_heap_check, "should have done it");
2317}
2318
2319//----------------------------------------------------------------------
2320// HeapLeakChecker disabling helpers
2321//----------------------------------------------------------------------
2322
2323// These functions are at the end of the file to prevent their inlining:
2324
2325// static
2326void 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;
2334  }
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);
2350    }
2351  }
2352}
2353
2354// static
2355inline 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;
2365  }
2366  return false;
2367}
2368
2369// static
2370const 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), "");
2375  }
2376  RAW_CHECK(info.stack_depth >= 1, "");
2377  return info.call_stack[0];
2378}
2379