1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
14 * The Original Code is mozilla.org code.
16 * The Initial Developer of the Original Code is
18 * Portions created by the Initial Developer are Copyright (C) 1999
19 * the Initial Developer. All Rights Reserved.
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
35 * ***** END LICENSE BLOCK ***** */
43 #include <sys/types.h>
46 #include "xpcom-config.h" // for CPP_NEW_THROW
48 typedef unsigned int u_int
;
53 TreeNode(Symbol
* aSymbol
) {
59 descendantBytesLeaked
= 0;
62 TreeNode
* GetDirectDescendant(Symbol
* aSymbol
);
64 bool HasDescendants() const {
65 return NULL
!= descendants
;
68 TreeNode
* AddDescendant(Symbol
* aSymbol
);
70 TreeNode
* descendants
;
71 TreeNode
* nextSibling
;
76 u_long descendantBytesLeaked
;
78 void* operator new(size_t size
) CPP_THROW_NEW
;
79 void operator delete(void* ptr
);
81 static TreeNode
* freeList
;
89 void Init(const char* aName
, u_long aAddress
) {
90 name
= aName
? strdup(aName
) : (char *)"";
97 char* name
; // name of .so
98 u_long address
; // base address where it was mapped in
106 void initialize(int argc
, char** argv
);
109 char* applicationName
;
123 malloc_log_entry
* firstLogEntry
;
124 malloc_log_entry
* lastLogEntry
;
127 MallocDict
* refcntDict
;
132 u_long totalMalloced
;
137 Symbol
* externalSymbols
;
139 u_int numExternalSymbols
;
141 u_long lowestSymbolAddr
;
142 u_long highestSymbolAddr
;
144 LoadMapEntry
* loadMap
;
158 void dumpEntryToLog(malloc_log_entry
* lep
);
162 void dumpEntryToTree(FILE* fp
, malloc_log_entry
* lep
);
165 void insertAddress(u_long address
, malloc_log_entry
* lep
);
166 void removeAddress(u_long address
, malloc_log_entry
* lep
);
168 void displayStackTrace(FILE* out
, malloc_log_entry
* lep
);
170 void ReadSymbols(const char* fileName
, u_long aBaseAddress
);
171 void ReadSharedLibrarySymbols();
172 void setupSymbols(const char* fileName
);
173 Symbol
* findSymbol(u_long address
);
174 bool excluded(malloc_log_entry
* lep
);
175 bool included(malloc_log_entry
* lep
);
177 void buildLeakGraph();
178 Symbol
* findLeakGraphRoot(Symbol
* aStart
, Symbol
* aEnd
);
179 void dumpLeakGraph();
180 void dumpLeakTree(TreeNode
* aNode
, int aIndent
);
182 bool ShowThisEntry(malloc_log_entry
* lep
);
184 bool IsRefcnt(malloc_log_entry
* lep
) const {
185 return (lep
->type
== malloc_log_addref
) ||
186 (lep
->type
== malloc_log_release
);
189 static void indentBy(int aCount
) {
190 while (--aCount
>= 0) fputs(" ", stdout
);
194 #endif /* __leaky_h_ */