blob: 791bc7e1824c625a3edbdf3adc1e4bdb292f606a [file] [log] [blame] [view]
Christopher Ferris713a8e32016-03-18 14:29:51 -07001Malloc Debug
2============
3
4Malloc debug is a method of debugging native memory problems. It can help
5detect memory corruption, memory leaks, and use after free issues.
6
Christopher Ferriseab48032016-05-25 13:04:29 -07007This documentation describes how to enable this feature on Android N or later
Elliott Hughes7dc7d2b2018-04-06 14:44:49 -07008versions of the Android OS. (See the "Examples" section.)
Christopher Ferriseab48032016-05-25 13:04:29 -07009
10The documentation for malloc debug on older versions of Android is
11[here](README_marshmallow_and_earlier.md).
12
Christopher Ferriseab48032016-05-25 13:04:29 -070013When malloc debug is enabled, it works by adding a shim layer that replaces
14the normal allocation calls. The replaced calls are:
Christopher Ferris713a8e32016-03-18 14:29:51 -070015
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070016* `malloc`
17* `free`
18* `calloc`
19* `realloc`
20* `posix_memalign`
21* `memalign`
Christopher Ferriscae21a92018-02-05 18:14:55 -080022* `aligned_alloc`
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070023* `malloc_usable_size`
Christopher Ferris713a8e32016-03-18 14:29:51 -070024
25On 32 bit systems, these two deprecated functions are also replaced:
26
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070027* `pvalloc`
28* `valloc`
Christopher Ferris713a8e32016-03-18 14:29:51 -070029
30Any errors detected by the library are reported in the log.
31
Christopher Ferris4da25032018-03-07 13:38:48 -080032NOTE: There is a small behavioral change beginning in P for realloc.
33Before, a realloc from one size to a smaller size would not update the
34backtrace related to the allocation. Starting in P, every single realloc
35call changes the backtrace for the pointer no matter whether the pointer
36returned has changed or not.
37
38
Christopher Ferris713a8e32016-03-18 14:29:51 -070039Controlling Malloc Debug Behavior
40---------------------------------
41Malloc debug is controlled by individual options. Each option can be enabled
42individually, or in a group of other options. Every single option can be
43combined with every other option.
44
45Option Descriptions
46-------------------
47### front\_guard[=SIZE\_BYTES]
48Enables a small buffer placed before the allocated data. This is an attempt
49to find memory corruption occuring to a region before the original allocation.
50On first allocation, this front guard is written with a specific pattern (0xaa).
51When the allocation is freed, the guard is checked to verify it has not been
52modified. If any part of the front guard is modified, an error will be reported
53in the log indicating what bytes changed.
54
55If the backtrace option is also enabled, then any error message will include
56the backtrace of the allocation site.
57
58If SIZE\_BYTES is present, it indicates the number of bytes in the guard.
59The default is 32 bytes, the max bytes is 16384. SIZE\_BYTES will be
60padded so that it is a multiple of 8 bytes on 32 bit systems and 16 bytes
61on 64 bit systems to make sure that the allocation returned is aligned
62properly.
63
64This option adds a special header to all allocations that contains the guard
65and information about the original allocation.
66
67Example error:
68
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070069 04-10 12:00:45.621 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 SIZE 100 HAS A CORRUPTED FRONT GUARD
70 04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[-32] = 0x00 (expected 0xaa)
71 04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[-15] = 0x02 (expected 0xaa)
Christopher Ferris713a8e32016-03-18 14:29:51 -070072
73### rear\_guard[=SIZE\_BYTES]
74Enables a small buffer placed after the allocated data. This is an attempt
75to find memory corruption occuring to a region after the original allocation.
76On first allocation, this rear guard is written with a specific pattern (0xbb).
77When the allocation is freed, the guard is checked to verify it has not been
78modified. If any part of the rear guard is modified, an error will be reported
79in the log indicating what bytes changed.
80
81If SIZE\_BYTES is present, it indicates the number of bytes in the guard.
82The default is 32 bytes, the max bytes is 16384.
83
84This option adds a special header to all allocations that contains
85information about the original allocation.
86
87Example error:
88
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070089 04-10 12:00:45.621 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 SIZE 100 HAS A CORRUPTED REAR GUARD
90 04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[130] = 0xbf (expected 0xbb)
91 04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[131] = 0x00 (expected 0xbb)
Christopher Ferris713a8e32016-03-18 14:29:51 -070092
93### guard[=SIZE\_BYTES]
94Enables both a front guard and a rear guard on all allocations.
95
96If SIZE\_BYTES is present, it indicates the number of bytes in both guards.
97The default is 32 bytes, the max bytes is 16384.
98
99### backtrace[=MAX\_FRAMES]
100Enable capturing the backtrace of each allocation site.
101This option will slow down allocations by an order of magnitude. If the
102system runs too slowly with this option enabled, decreasing the maximum number
103of frames captured will speed the allocations up.
104
105Note that any backtrace frames that occur within the malloc backtrace library
106itself are not recorded.
107
108If MAX\_FRAMES is present, it indicates the maximum number of frames to
109capture in a backtrace. The default is 16 frames, the maximumum value
110this can be set to is 256.
111
Christopher Ferris4da25032018-03-07 13:38:48 -0800112Before P, this option adds a special header to all allocations that contains
113the backtrace and information about the original allocation. After that, this
114option will not add a special header.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700115
Christopher Ferris602b88c2017-08-04 13:04:04 -0700116As of P, this option will also enable dumping backtrace heap data to a
117file when the process receives the signal SIGRTMAX - 17 ( which is 47 on most
118Android devices). The format of this dumped data is the same format as
119that dumped when running am dumpheap -n. The default is to dump this data
120to the file /data/local/tmp/backtrace\_heap.**PID**.txt. This is useful when
121used with native only executables that run for a while since these processes
122are not spawned from a zygote process.
123
124Note that when the signal is received, the heap is not dumped until the next
125malloc/free occurs.
126
Christopher Ferris713a8e32016-03-18 14:29:51 -0700127### backtrace\_enable\_on\_signal[=MAX\_FRAMES]
128Enable capturing the backtrace of each allocation site. If the
129backtrace capture is toggled when the process receives the signal
130SIGRTMAX - 19 (which is 45 on most Android devices). When this
131option is used alone, backtrace capture starts out disabled until the signal
132is received. If both this option and the backtrace option are set, then
133backtrace capture is enabled until the signal is received.
134
135If MAX\_FRAMES is present, it indicates the maximum number of frames to
136capture in a backtrace. The default is 16 frames, the maximumum value
137this can be set to is 256.
138
Christopher Ferris4da25032018-03-07 13:38:48 -0800139Before P, this option adds a special header to all allocations that contains
140the backtrace and information about the original allocation. After that, this
141option will not add a special header.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700142
Christopher Ferris602b88c2017-08-04 13:04:04 -0700143### backtrace\_dump\_on\_exit
144As of P, when the backtrace option has been enabled, this causes the backtrace
145dump heap data to be dumped to a file when the program exits. If the backtrace
146option has not been enabled, this does nothing. The default is to dump this
147to the file named /data/local/tmp/backtrace\_heap.**PID**.exit.txt.
148
149The file location can be changed by setting the backtrace\_dump\_prefix
150option.
151
152### backtrace\_dump\_prefix
153As of P, when the backtrace options has been enabled, this sets the prefix
154used for dumping files when the signal SIGRTMAX - 17 is received or when
155the program exits and backtrace\_dump\_on\_exit is set.
156
157The default is /data/local/tmp/backtrace\_heap.
158
159When this value is changed from the default, then the filename chosen
160on the signal will be backtrace\_dump\_prefix.**PID**.txt. The filename chosen
161when the program exits will be backtrace\_dump\_prefix.**PID**.exit.txt.
162
Christopher Ferris713a8e32016-03-18 14:29:51 -0700163### fill\_on\_alloc[=MAX\_FILLED\_BYTES]
164Any allocation routine, other than calloc, will result in the allocation being
165filled with the value 0xeb. When doing a realloc to a larger size, the bytes
166above the original usable size will be set to 0xeb.
167
168If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
169of bytes in the allocation. The default is to fill the entire allocation.
170
171### fill\_on\_free[=MAX\_FILLED\_BYTES]
172When an allocation is freed, fill it with 0xef.
173
174If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
175of bytes in the allocation. The default is to fill the entire allocation.
176
177### fill[=MAX\_FILLED\_BYTES]
178This enables both the fill\_on\_alloc option and the fill\_on\_free option.
179
180If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
181of bytes in the allocation. The default is to fill the entire allocation.
182
183### expand\_alloc[=EXPAND\_BYTES]
184Add an extra amount to allocate for every allocation.
185
186If XX is present, it is the number of bytes to expand the allocation by.
187The default is 16 bytes, the max bytes is 16384.
188
189### free\_track[=ALLOCATION\_COUNT]
190When a pointer is freed, do not free the memory right away, but add it to
191a list of freed allocations. In addition to being added to the list, the
192entire allocation is filled with the value 0xef, and the backtrace at
193the time of the free is recorded. The backtrace recording is completely
194separate from the backtrace option, and happens automatically if this
195option is enabled. By default, a maximum of 16 frames will be recorded,
196but this value can be changed using the free\_track\_backtrace\_num\_frames
197option. It can also be completely disabled by setting the option to zero.
198See the full description of this option below.
199
200When the list is full, an allocation is removed from the list and is
201checked to make sure that none of the contents have been modified since
202being placed on the list. When the program terminates, all of the allocations
203left on the list are verified.
204
205If ALLOCATION\_COUNT is present, it indicates the total number of allocations
206in the list. The default is to record 100 freed allocations, the max
207allocations to record is 16384.
208
Christopher Ferris4da25032018-03-07 13:38:48 -0800209Before P, this option adds a special header to all allocations that contains
210the backtrace and information about the original allocation. After that, this
211option will not add a special header.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700212
213Example error:
214
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700215 04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE
216 04-15 12:00:31.305 7412 7412 E malloc_debug: allocation[20] = 0xaf (expected 0xef)
217 04-15 12:00:31.305 7412 7412 E malloc_debug: allocation[99] = 0x12 (expected 0xef)
218 04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace at time of free:
219 04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
220 04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
221 04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
222 04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
Christopher Ferris713a8e32016-03-18 14:29:51 -0700223
224In addition, there is another type of error message that can occur if
225an allocation has a special header applied, and the header is corrupted
226before the verification occurs. This is the error message that will be found
227in the log:
228
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700229 04-15 12:00:31.604 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 HAS CORRUPTED HEADER TAG 0x1cc7dc00 AFTER FREE
Christopher Ferris713a8e32016-03-18 14:29:51 -0700230
231### free\_track\_backtrace\_num\_frames[=MAX\_FRAMES]
232This option only has meaning if free\_track is set. It indicates how many
233backtrace frames to capture when an allocation is freed.
234
235If MAX\_FRAMES is present, it indicates the number of frames to capture.
236If the value is set to zero, then no backtrace will be captured when the
237allocation is freed. The default is to record 16 frames, the max number of
238frames to to record is 256.
239
240### leak\_track
241Track all live allocations. When the program terminates, all of the live
242allocations will be dumped to the log. If the backtrace option was enabled,
243then the log will include the backtrace of the leaked allocations. This
244option is not useful when enabled globally because a lot of programs do not
245free everything before the program terminates.
246
Christopher Ferris4da25032018-03-07 13:38:48 -0800247Before P, this option adds a special header to all allocations that contains
248the backtrace and information about the original allocation. After that, this
249option will not add a special header.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700250
251Example leak error found in the log:
252
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700253 04-15 12:35:33.304 7412 7412 E malloc_debug: +++ APP leaked block of size 100 at 0x2be3b0b0 (leak 1 of 2)
254 04-15 12:35:33.304 7412 7412 E malloc_debug: Backtrace at time of allocation:
255 04-15 12:35:33.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
256 04-15 12:35:33.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
257 04-15 12:35:33.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
258 04-15 12:35:33.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
259 04-15 12:35:33.305 7412 7412 E malloc_debug: +++ APP leaked block of size 24 at 0x7be32380 (leak 2 of 2)
260 04-15 12:35:33.305 7412 7412 E malloc_debug: Backtrace at time of allocation:
261 04-15 12:35:33.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
262 04-15 12:35:33.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
263 04-15 12:35:33.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
264 04-15 12:35:33.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
Christopher Ferris713a8e32016-03-18 14:29:51 -0700265
Christopher Ferris7bd01782016-04-20 12:30:58 -0700266### record\_allocs[=TOTAL\_ENTRIES]
267Keep track of every allocation/free made on every thread and dump them
268to a file when the signal SIGRTMAX - 18 (which is 46 on most Android devices)
269is received.
270
271If TOTAL\_ENTRIES is set, then it indicates the total number of
272allocation/free records that can be retained. If the number of records
273reaches the TOTAL\_ENTRIES value, then any further allocations/frees are
274not recorded. The default value is 8,000,000 and the maximum value this
275can be set to is 50,000,000.
276
277Once the signal is received, and the current records are written to the
278file, all current records are deleted. Any allocations/frees occuring while
279the data is being dumped to the file are ignored.
280
281**NOTE**: This option is not available until the O release of Android.
282
283The allocation data is written in a human readable format. Every line begins
284with the THREAD\_ID returned by gettid(), which is the thread that is making
285the allocation/free. If a new thread is created, no special line is added
286to the file. However, when a thread completes, a special entry is added to
287the file indicating this.
288
289The thread complete line is:
290
291**THREAD\_ID**: thread\_done 0x0
292
293Example:
294
295 187: thread_done 0x0
296
297Below is how each type of allocation/free call ends up in the file dump.
298
299pointer = malloc(size)
300
301**THREAD\_ID**: malloc pointer size
302
303Example:
304
305 186: malloc 0xb6038060 20
306
307free(pointer)
308
309**THREAD\_ID**: free pointer
310
311Example:
312
313 186: free 0xb6038060
314
315pointer = calloc(nmemb, size)
316
317**THREAD\_ID**: calloc pointer nmemb size
318
319Example:
320
321 186: calloc 0xb609f080 32 4
322
323new\_pointer = realloc(old\_pointer, size)
324
325**THREAD\_ID**: realloc new\_pointer old\_pointer size
326
327Example:
328
329 186: realloc 0xb609f080 0xb603e9a0 12
330
331pointer = memalign(alignment, size)
332
333**THREAD\_ID**: memalign pointer alignment size
334
Christopher Ferriscae21a92018-02-05 18:14:55 -0800335pointer = aligned\_alloc(alignment, size)
336
337**THREAD\_ID**: memalign pointer alignment size
338
Christopher Ferris7bd01782016-04-20 12:30:58 -0700339posix\_memalign(&pointer, alignment, size)
340
341**THREAD\_ID**: memalign pointer alignment size
342
343Example:
344
345 186: memalign 0x85423660 16 104
346
347pointer = valloc(size)
348
349**THREAD\_ID**: memalign pointer 4096 size
350
351Example:
352
353 186: memalign 0x85423660 4096 112
354
355pointer = pvalloc(size)
356
357**THREAD\_ID**: memalign pointer 4096 <b>SIZE\_ROUNDED\_UP\_TO\_4096</b>
358
359Example:
360
361 186: memalign 0x85423660 4096 8192
362
363### record\_allocs\_file[=FILE\_NAME]
364This option only has meaning if record\_allocs is set. It indicates the
365file where the recorded allocations will be found.
366
367If FILE\_NAME is set, then it indicates where the record allocation data
368will be placed.
369
370**NOTE**: This option is not available until the O release of Android.
371
Christopher Ferris4da25032018-03-07 13:38:48 -0800372### verify\_pointers
373Track all live allocations to determine if a pointer is used that does not
374exist. This option is a lightweight way to verify that all
375free/malloc\_usable\_size/realloc calls are passed valid pointers.
376
377Example error:
378
379 04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 UNKNOWN POINTER (free)
380 04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace at time of failure:
381 04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
382 04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
383 04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
384 04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
385
386Where the name of the function varies depending on the function that called
387with a bad pointer. Only three functions do this checking: free,
388malloc\_usable\_size, realloc.
389
390**NOTE**: This option is not available until the P release of Android.
391
Christopher Ferris713a8e32016-03-18 14:29:51 -0700392Additional Errors
393-----------------
394There are a few other error messages that might appear in the log.
395
396### Use After Free
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700397 04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE (free)
398 04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace of original free:
399 04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
400 04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
401 04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
402 04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
403 04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace at time of failure:
404 04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
405 04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
406 04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
407 04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
Christopher Ferris713a8e32016-03-18 14:29:51 -0700408
409This indicates that code is attempting to free an already freed pointer. The
410name in parenthesis indicates that the application called the function
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700411*free* with the bad pointer.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700412
413For example, this message:
414
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700415 04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE (realloc)
Christopher Ferris713a8e32016-03-18 14:29:51 -0700416
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700417Would indicate that the application called the *realloc* function
Christopher Ferris713a8e32016-03-18 14:29:51 -0700418with an already freed pointer.
419
420### Invalid Tag
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700421 04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 HAS INVALID TAG 1ee7d000 (malloc_usable_size)
422 04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace at time of failure:
423 04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
424 04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
425 04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
426 04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
Christopher Ferris713a8e32016-03-18 14:29:51 -0700427
428This indicates that a function (malloc\_usable\_size) was called with
429a pointer that is either not allocated memory, or that the memory of
430the pointer has been corrupted.
431
432As with the other error message, the function in parenthesis is the
433function that was called with the bad pointer.
434
Christopher Ferris602b88c2017-08-04 13:04:04 -0700435Backtrace Heap Dump Format
436==========================
437
438This section describes the format of the backtrace heap dump. This data is
439generated by am dumpheap -n or, as of P, by the signal or on exit.
440
441The data has this header:
442
443 Android Native Heap Dump v1.0
444
445 Total memory: XXXX
446 Allocation records: YYYY
447 Backtrace size: ZZZZ
448
449Total memory is the total of all of the currently live allocations.
450Allocation records is the total number of allocation records.
451Backtrace size is the maximum number of backtrace frames that can be present.
452
453Following this header are two different sections, the first section is the
454allocation records, the second section is the map data.
455
456The allocation record data has this format:
457
458 z ZYGOTE_CHILD_ALLOC sz ALLOCATION_SIZE num NUM_ALLOCATIONS bt FRAMES
459
460ZYGOTE\_CHILD\_ALLOC is either 0 or 1. 0 means this was allocated by the
461zygote process or in a process not spawned from the zygote. 1 means this
462was allocated by an application after it forked off from the zygote process.
463
464ALLOCATION\_SIZE is the size of the allocation.
465NUM\_ALLOCATIONS is the number of allocations that have this size and have the
466same backtrace.
467FRAMES is a list of instruction pointers that represent the backtrace of the
468allocation.
469
470Example:
471
472 z 0 sz 400 num 1 bt 0000a230 0000b500
473 z 1 sz 500 num 3 bt 0000b000 0000c000
474
475The first allocation record was created by the zygote of size 400 only one
476with this backtrace/size and a backtrace of 0xa230, 0xb500.
477The second allocation record was create by an application spawned from the
478zygote of size 500, where there are three of these allocation with the same
479backtrace/size and a backtrace of 0xb000, 0xc000.
480
481The final section is the map data for the process:
482
483 MAPS
484 7fe9181000-7fe91a2000 rw-p 00000000 00:00 0 /system/lib/libc.so
485 .
486 .
487 .
488 END
489
490The map data is simply the output of /proc/PID/maps. This data can be used to
491decode the frames in the backtraces.
492
493There is a tool to visualize this data, development/scripts/native\_heapdump\_viewer.py.
494
Christopher Ferris713a8e32016-03-18 14:29:51 -0700495Examples
496========
Elliott Hughes644275a2017-08-15 23:17:35 -0700497
498### For platform developers
499
Christopher Ferris713a8e32016-03-18 14:29:51 -0700500Enable backtrace tracking of all allocation for all processes:
501
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700502 adb shell stop
503 adb shell setprop libc.debug.malloc.options backtrace
504 adb shell start
Christopher Ferris713a8e32016-03-18 14:29:51 -0700505
506Enable backtrace tracking for a specific process (ls):
507
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700508 adb shell setprop libc.debug.malloc.options backtrace
509 adb shell setprop libc.debug.malloc.program ls
510 adb shell ls
Christopher Ferris713a8e32016-03-18 14:29:51 -0700511
512Enable backtrace tracking for the zygote and zygote based processes:
513
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700514 adb shell stop
515 adb shell setprop libc.debug.malloc.program app_process
516 adb shell setprop libc.debug.malloc.options backtrace
517 adb shell start
Christopher Ferris713a8e32016-03-18 14:29:51 -0700518
Mikhail Naganov5a1a9532018-01-03 08:50:16 -0800519Enable multiple options (backtrace and guard):
Christopher Ferris713a8e32016-03-18 14:29:51 -0700520
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700521 adb shell stop
Mikhail Naganov5a1a9532018-01-03 08:50:16 -0800522 adb shell setprop libc.debug.malloc.options "\"backtrace guard\""
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700523 adb shell start
Christopher Ferris713a8e32016-03-18 14:29:51 -0700524
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700525Note: The two levels of quoting in the adb shell command is necessary.
526The outer layer of quoting is for the shell on the host, to ensure that the
Mikhail Naganov5a1a9532018-01-03 08:50:16 -0800527inner layer of quoting is sent to the device, to make 'backtrace guard'
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700528a single argument.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700529
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700530Enable malloc debug using an environment variable (pre-O Android release):
Christopher Ferris713a8e32016-03-18 14:29:51 -0700531
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700532 adb shell
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700533 # setprop libc.debug.malloc.env_enabled 1
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700534 # setprop libc.debug.malloc.options backtrace
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700535 # export LIBC_DEBUG_MALLOC_ENABLE=1
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700536 # ls
Christopher Ferrisac66d162016-09-28 14:51:12 -0700537
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700538Enable malloc debug using an environment variable (Android O or later):
539
540 adb shell
541 # export LIBC_DEBUG_MALLOC_OPTIONS=backtrace
542 # ls
543
544Any process spawned from this shell will run with malloc debug enabled
545using the backtrace option.
Christopher Ferrisac66d162016-09-28 14:51:12 -0700546
547 adb shell stop
548 adb shell setprop libc.debug.malloc.options backtrace
549 adb shell start
550 adb shell am dumpheap -n <PID_TO_DUMP> /data/local/tmp/heap.txt
551
552It is possible to use the backtrace\_enable\_on\_signal option as well,
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700553but, obviously, it must be enabled through the signal before the file will
554contain any data.
555
Elliott Hughes644275a2017-08-15 23:17:35 -0700556### For app developers
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700557
558Enable malloc debug for a specific program/application (Android O or later):
559
560 adb shell setprop wrap.<APP> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper"'
561
562For example, to enable malloc debug for the google search box (Android O or later):
563
564 adb shell setprop wrap.com.google.android.googlequicksearchbox '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper"'
565 adb shell am force-stop com.google.android.googlequicksearchbox
566
567NOTE: On pre-O versions of the Android OS, property names had a length limit
568of 32. This meant that to create a wrap property with the name of the app, it
569was necessary to truncate the name to fit. On O, property names can be
570an order of magnitude larger, so there should be no need to truncate the name
571at all.
Elliott Hughes644275a2017-08-15 23:17:35 -0700572
573To detect leaks while an app is running:
574
575 adb shell dumpsys meminfo --unreachable <PID_OF_APP>
576
577Without also enabling malloc debug, this command will only tell
578you whether it can detect leaked memory, not where those leaks are
579occurring. If you enable malloc debug with the backtrace option for your
580app before running the dumpsys command, you'll get backtraces showing
581where the memory was allocated.
582
583For backtraces from your app to be useful, you'll want to keep the
584symbols in your app's shared libraries rather than stripping them. That
585way you'll see the location of the leak directly without having to use
586something like the <code>ndk-stack</code> tool.
587
588### Analyzing heap dumps
589
590To analyze the data produced by the dumpheap command, run this script:
591
592 development/scripts/native_heapdump_viewer.py
593
594In order for the script to properly symbolize the stacks in the file,
595make sure the script is executed from the tree that built the image.
596
597To collect, transfer, and analyze a dump:
598
599 adb shell am dumpheap -n <PID_TO_DUMP> /data/local/tmp/heap.txt
600 adb shell pull /data/local/tmp/heap.txt .
601 python development/scripts/native_heapdump_viewer.py --symbols /some/path/to/symbols/ heap.txt > heap_info.txt
602
603At the moment, the script will look for symbols in the given directory,
604using the path the .so file would have on the device. So if your .so file
605is at `/data/app/.../lib/arm/libx.so` on the device, it will need to be at
606`/some/path/to/symbols/data/app/.../lib/arm/libx.so` locally given the
607command line above. That is: you need to mirror the directory structure
608for the app in the symbols directory.