96 lines
2.7 KiB
C++
96 lines
2.7 KiB
C++
// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// MemoryWatcher.
|
|
// The MemoryWatcher is a library that can be linked into any
|
|
// win32 application. It will override the default memory allocators
|
|
// and track call stacks for any allocations that are made. It can
|
|
// then be used to see what memory is in use.
|
|
|
|
#ifndef TOOLS_MEMORY_WATCHER_MEMORY_WATCHER_
|
|
#define TOOLS_MEMORY_WATCHER_MEMORY_WATCHER_
|
|
|
|
#include <map>
|
|
#include <functional>
|
|
|
|
#include "base/synchronization/lock.h"
|
|
#include "tools/memory_watcher/memory_hook.h"
|
|
|
|
class CallStack;
|
|
class AllocationStack;
|
|
|
|
// The MemoryWatcher installs allocation hooks and monitors
|
|
// allocations and frees.
|
|
class MemoryWatcher : MemoryObserver {
|
|
public:
|
|
struct StackTrack {
|
|
CallStack* stack;
|
|
int count;
|
|
int size;
|
|
};
|
|
|
|
typedef std::map<int32, AllocationStack*, std::less<int32>,
|
|
PrivateHookAllocator<int32> > CallStackMap;
|
|
typedef std::map<int32, StackTrack, std::less<int32>,
|
|
PrivateHookAllocator<int32> > CallStackIdMap;
|
|
typedef std::basic_string<char, std::char_traits<char>,
|
|
PrivateHookAllocator<char> > PrivateAllocatorString;
|
|
|
|
MemoryWatcher();
|
|
virtual ~MemoryWatcher();
|
|
|
|
// Dump all tracked pointers still in use.
|
|
void DumpLeaks();
|
|
|
|
// MemoryObserver interface.
|
|
virtual void OnTrack(HANDLE heap, int32 id, int32 size);
|
|
virtual void OnUntrack(HANDLE heap, int32 id, int32 size);
|
|
|
|
// Sets a name that appears in the generated file name.
|
|
void SetLogName(char* log_name);
|
|
|
|
private:
|
|
// Opens the logfile which we create.
|
|
void OpenLogFile();
|
|
|
|
// Close the logfile.
|
|
void CloseLogFile();
|
|
|
|
// Hook the memory hooks.
|
|
void Hook();
|
|
|
|
// Unhooks our memory hooks.
|
|
void Unhook();
|
|
|
|
// Check to see if this thread is already processing a block, and should not
|
|
// recurse.
|
|
bool LockedRecursionDetected() const;
|
|
|
|
// This is for logging.
|
|
FILE* file_;
|
|
|
|
bool hooked_; // True when this class has the memory_hooks hooked.
|
|
|
|
// Either 0, or else the threadID for a thread that is actively working on
|
|
// a stack track. Used to avoid recursive tracking.
|
|
DWORD active_thread_id_;
|
|
|
|
base::Lock block_map_lock_;
|
|
// The block_map provides quick lookups based on the allocation
|
|
// pointer. This is important for having fast round trips through
|
|
// malloc/free.
|
|
CallStackMap *block_map_;
|
|
|
|
// The file name for that log.
|
|
std::string file_name_;
|
|
|
|
// An optional name that appears in the log file name (used to differentiate
|
|
// logs).
|
|
std::string log_name_;
|
|
};
|
|
|
|
|
|
|
|
#endif // TOOLS_MEMORY_WATCHER_MEMORY_WATCHER_
|